¿Hay alguna forma de código abierto para hacer una estática de un ejecutable dinámico sin disponibilidad de código fuente?

20

Déjame explicarte el problema con un ejemplo. Utilizo algún programa antiguo en mi trabajo diario, como por ejemplo xfig y pdfedit .

Ahora, estos programas son bastante antiguos y no se actualizan con demasiada frecuencia; Mi temor es que un día u otro ya no funcionen por falta de alguna biblioteca o alguna actualización incompatible.

Si el programa es fácil de compilar ahora , en un sistema en ejecución, la solución es útil: intente hackear un poco la fuente y compilarlo de forma estática --- el ejecutable resultante será grande y no tan eficiente, pero funcionará para el futuro previsible (1). Este parece ser el caso xfigy lo intentaré lo antes posible.

Pero, por ejemplo, pdfeditdepende de Qt3, y configurar un sistema para compilarlo es bastante complejo en este momento. Afortunadamente, se puede ejecutar en este momento, gracias al hecho de que la biblioteca que necesita no entra en conflicto con nada. Pero esto puede cambiar en el futuro, por lo que me gustaría resolver este problema:

¿Cómo puedo hacer un binario estático (o algo similar) si tengo uno dinámico y todas las bibliotecas, pero sin código fuente, en Ubuntu?

Busqué alrededor. Una posibilidad es el statifier (2), pero tiene muchos problemas con la aleatorización de direcciones , por lo que es un no-no. La versión no gratuita, Ermine , parece funcionar, pero realmente preferiría una opción de código abierto.

Otra posibilidad es usar docker o un sistema de empaque similar. Pero todo el tutorial que encontré está bastante orientado a RedHat ; y, sinceramente, bastante complejo de seguir.


Notas al pie :

(1) no es tan loco. Utilizo un ffmpeg estático, por ejemplo, funciona bien y sin problemas de compatibilidad ...

(2) para compilar statifier, consulte /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
fuente

Respuestas:

19

Puede resolver su problema de otra manera más simple:

Use ldden su ejecutable para ver las bibliotecas vinculadas, por ejemplo:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Luego, recopile todas las bibliotecas en una carpeta y configure la variable de entorno LD_LIBRARY_PATH antes de ejecutar su programa para apuntar a esta carpeta:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Alternativamente, puede agregar una entrada para la carpeta lib /etc/ld.so.conf.d/. Pero eso aplicaría el cambio en todo el sistema.

Klaus D.
fuente
Esta es una buena idea --- aunque realmente me gustaría encontrar una manera de empaquetar todo esto en un ejecutable; esta solución puede verse afectada por cambios en el cargador (aunque espero que nadie haga tal cosa de una manera no compatible con versiones anteriores). Otorgará la recompensa si no surgen mejores soluciones --- gracias.
Rmano
Bueno, podría agregar esto a un pequeño script de instalación y vincularlo a la ruta local. Me gusta esta solución, podría haberla usado hace un tiempo.
WalyKu
1
@Klaus, linux-vdso.so.1 no se ve por ninguna parte, supongo que está en el núcleo, ¿correcto?
Rmano
1
Sí. De man 7 vdso: "El" vDSO "(objeto virtual dinámico compartido) es una pequeña biblioteca compartida que el núcleo asigna automáticamente al espacio de direcciones de todas las aplicaciones de espacio de usuario".
Klaus D.
Aunque esto no es estrictamente una respuesta a la pregunta, es una solución razonable. Gracias.
Rmano
2

Una sugerencia con respecto al estadificador :

Si la aleatorización del diseño del espacio de direcciones (ASLR) está causando que falle, no tiene que apagarlo para toda la máquina. Puede desactivarlo solo para ese proceso:

$ setarch `uname -m` -R statified_pdfedit [args...]

Ejecutará ese comando con un diseño aleatorio deshabilitado (no es necesario que sea root).

exprimir
fuente
Wow interesante. Ahora si pudiera compilar statifier...
Rmano
Compilado y comprobado. xfig_statifiedtodavía volcados de núcleo ... una pena. Gracias de cualquier manera.
Rmano
Si, una pena. Me pregunto si no sería un problema de 64 bits, ¿tal vez intentes ejecutar el estadificador en una configuración de 32 bits?
limonada el
Comprobado en una máquina de 32 bits, todavía volcados de núcleo.
Rmano