Utilice tanto bibliotecas estáticas como dinámicamente vinculadas en gcc

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

Pregunta

Necesito distribuir un binario que se ejecute en tantas distribuciones de Linux x86 como sea posible. Eso significa que tengo que vincular estáticamente algunas bibliotecas, como glibc, porque el usuario podría no tener la versión que uso. Otras bibliotecas deben estar vinculadas dinámicamente, como fontconfig, porque se basa en un formato de archivo de caché y ubicaciones codificadas que pueden diferir en cada sistema.

¿Cuáles son las opciones de línea de comando para hacer esto? Si especifico -static, entonces gcc se negará a vincular dinámicamente cualquier biblioteca.

¿Fue útil?

Solución

La vinculación estática contra cualquier biblioteca de sistema, y ??especialmente contra libc , en sistemas UNIX o Linux modernos hace que el binario sea significativamente menos portátil. Simplemente no lo hagas.

En su lugar, utilice la compatibilidad con versiones anteriores (los archivos binarios vinculados en un sistema antiguo continúan ejecutándose en todos los más nuevos) para su ventaja, ya sea vinculando su binario en un sistema antiguo (uso RedHat 6.2, y no he visto un sistema Linux donde mi binario no se ejecutará en los últimos 8 años), o usando algo como autopackage (que se ha eliminado después de escribir esta respuesta).

Para responder a su pregunta original:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

hará que el enlazador use la versión de archivo de libfoo. [Es importante tener el -Wl, -Bdynamic final con precisión para que no fuerce la libc estática.]

Otros consejos

Cabe señalar que, en Linux, solo puede (de forma segura) vincular estáticamente una biblioteca si ninguna de las bibliotecas dinámicas depende de ella. Esto significa que si está utilizando bibliotecas dinámicas, puede olvidarse de vincular estáticamente libc. Simplemente use una versión bastante antigua para compilar contra el caso de libc; libc ha mantenido una fuerte compatibilidad con ABI a lo largo de los años.

Intente pasar las rutas a los archivos de la biblioteca con los que se vincula en la línea de comando del vinculador (ya sean bibliotecas .a o .so) y suelte -static. Eso debería hacer el truco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top