c++ c gcc glibc static-linking

La compilación con-static-libgcc-static-libstdc++ todavía genera una dependencia dinámica en libc.so



glibc static-linking (2)

En primer lugar, tenga en cuenta que la vinculación estática de libc puede no mejorar la portabilidad de su programa, ya que libc puede depender de otras partes de su sistema, por ejemplo, la versión del kernel.

Si quieres probar la vinculación estática completa, simplemente usa -static si el truco es. Siempre que haya versiones estáticas de todas las bibliotecas usadas instaladas.

Puedes verificar si tu programa solo ha enlazado bibliotecas estáticas usando:

ldd binary_name

EDITAR:

Otra forma de proporcionar información útil para la depuración de este problema sería agregar --verbose a los indicadores del vinculador.

Estoy tratando de hacer un ejecutable que sea lo más portátil posible. Después de eliminar algunas dependencias, encontré lo siguiente al ejecutar el binario en otro sistema:

/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15'' not found (required by foob) /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15'' not found (required by foob) /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14'' not found (required by foob)

Prefiero que mi binario no requiera que el usuario actualice su versión de libc , así que también me gustaría eliminar esta dependencia.

Las banderas del enlazador que produjeron el binario anterior ya incluían -static-libgcc -static-libstdc++ . ¿Por qué el binario todavía requiere en el libc.so.6 compartido?

También intenté agregar el indicador -static , sin embargo, cuando intento ejecutar ese binario, el resultado es muy extraño:

$ ls -l foob -rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob $ ./foob bash: ./foob: No such file or directory

¿Qué hacer?

EDITAR:

$ file foob foob: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped $ strace -f ./foob execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory) write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory ) = 40 exit_group(1) = ? +++ exited with 1 +++

Curiosamente, si ldd la versión sin -static , tiene dos entradas menos que la versión con -static , a saber:

libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)


GNU libc no está diseñado para ser enlazado estáticamente. Las funciones importantes, por ejemplo, gethostbyname y iconv , funcionarán mal o no funcionarán en absoluto en un binario estático. Podría decirse que aún peor, en algunas condiciones, un binario estático intentará abrir dinámicamente y usar libc.so.6 , aunque el punto principal del enlace estático es evitar tales dependencias.

Debes compilar tu programa contra uClibc o musl libc en su lugar.

(Esto ha sido cierto durante al menos 15 años).