¿El enlace estático de Linux está muerto?


De hecho, -static gcc flag en Linux no funciona ahora. Permítanme citar de las preguntas frecuentes de GNU libc:

2.22. Incluso los programas vinculados estáticamente necesitan algunas bibliotecas compartidas lo cual no es aceptable para mí. Lo ¿puedo hacerlo?

{AJ} NSS (para más detalles solo escriba ' info libc "Name Service Switch"') no funciona correctamente sin compartir biblioteca. NSS permite el uso de diferentes servicios (por ejemplo, NIS, archivos, db, hesiod) simplemente cambiando una configuración file (/etc / nsswitch.conf) sin volver a vincular cualquier programa. El único la desventaja es que ahora estática las bibliotecas necesitan tener acceso compartido biblioteca. Esto se maneja de forma transparente por la biblioteca C de GNU.

Una solución es configurar glibc con -- enable-static-nss. En este caso, puede crear un binario estático que utilice solo los servicios dns y archivos (cambiar /etc/nsswitch.conf para esto). Necesitas enlazar explícitamente contra todos estos servicios. Por ejemplo:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

El problema con este enfoque es que tienes que vincular cada estática programa que utiliza rutinas NSS con todas esas bibliotecas.
{UD} De hecho, ya no se puede decir que un libc compilado con esta opción está usando NSS. No hay interruptor nunca más. Por lo tanto es altamente se recomienda no utilizar -- enable-static-nss ya que esto hace que el comportamiento de los programas en el sistema inconsistente.

En cuanto a ese hecho hay ¿hay alguna forma razonable de crear ahora una compilación estática de pleno funcionamiento en Linux o la vinculación estática está completamente muerta en Linux? Me refiero a la construcción estática que:

  • Se comporta exactamente de la misma manera que construcción dinámica do (static-nss con ¡el comportamiento inconsistente es malo!);
  • Funciona en variaciones razonables del entorno glibc y las versiones de Linux;
Author: Shcheklein, 2010-08-07

5 answers

Con respecto a ese hecho, ¿hay alguna manera razonable ahora de crear una compilación estática de pleno funcionamiento en Linux o la vinculación estática está completamente muerta en Linux?

No sé dónde encontrar las referencias históricas, pero sí, el enlace estático está muerto en los sistemas GNU. (Creo que murió durante la transición de libc4 / libc5 a libc6 / glibc 2.x.)

La característica se consideró inútil a la luz de:

  • Vulnerabilidades de seguridad. Aplicación que was statically linked ni siquiera soporta la actualización de libc. Si la aplicación estaba vinculada en el sistema que contiene una vulnerabilidad lib, entonces se perpetuará dentro del ejecutable vinculado estáticamente.

  • Código hinchado. Si muchas aplicaciones enlazadas estáticamente se ejecutan en el mismo sistema, las bibliotecas estándar no se reutilizarían, ya que cada aplicación contiene dentro de su propia copia de todo. (Intente du -sh /usr/lib para entender el alcance del problema.)

Intenta cavar LKML y archivos de la lista de correo glibc de hace 10-15 años. Estoy bastante seguro de que hace mucho tiempo he visto algo relacionado en LKML.

 21
Author: Dummy00001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-09 08:54:03

Creo que esto es muy molesto, y creo que es arrogante llamar a una característica "inútil" porque tiene problemas para lidiar con ciertos casos de uso. El mayor problema con el enfoque glibc es que codifica las rutas a las bibliotecas del sistema (gconv, así como nss), y por lo tanto se rompe cuando la gente intenta ejecutar un binario estático en una distribución de Linux diferente de la que fue construido para.

De todos modos, puede solucionar el problema de gconv configurando GCONV_PATH para que apunte a la ubicación, esto me permitió tomar binarios construidos en Ubuntu y ejecutarlos en Red Hat.

 34
Author: Ketil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-14 13:59:20

Los enlaces estáticos no parecen tener mucho amor en el mundo de Linux. Aquí está mi opinión.

Las personas que no ven el atractivo de los enlaces estáticos normalmente trabajan en el ámbito del núcleo y del sistema operativo de nivel inferior. Muchos desarrolladores de bibliotecas * nix han pasado toda una vida lidiando con los inevitables problemas de tratar de vincular cien bibliotecas en constante cambio, una tarea que hacen todos los días. Echa un vistazo a autotools si alguna vez quieres saber que los backflips son cómodos realizar.

Pero no se debe esperar que todos los demás pasen la mayor parte de su tiempo en esto. El enlace estático le llevará un largo camino hacia el almacenamiento en búfer de la pérdida de bibliotecas. El desarrollador puede actualizar las dependencias de su software de acuerdo con el programa del software, en lugar de verse obligado a hacerlo en el momento en que aparezcan nuevas versiones de la biblioteca. Esto es importante para las aplicaciones orientadas al usuario con interfaces de usuario complejas que necesitan controlar el flujo de las muchas bibliotecas de nivel inferior en de la que dependen inevitablemente. Y es por eso que siempre seré un fan de los enlaces estáticos. Si puede vincular estáticamente el código C y C++ portátil compilado de forma cruzada, prácticamente ha hecho del mundo su ostra, ya que puede entregar software complejo más rápidamente a una amplia gama de dispositivos en constante crecimiento del mundo.

Hay muchas cosas con las que no estamos de acuerdo, desde otras perspectivas, y es bueno que el software de código abierto las permita todas.

 13
Author: moodboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-01 10:05:37

Solo porque tenga que enlazar dinámicamente al servicio NSS no significa que no pueda enlazar estáticamente a cualquier otra biblioteca. Todo lo que FAQ está diciendo es que incluso los programas enlazados "estáticamente" tienen algunas bibliotecas enlazadas dinámicamente. No está diciendo que el enlace estático es " imposible "o que"no funciona".

 11
Author: Dean Harding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-07 12:31:39

Añadiendo otras respuestas:

Debido a las razones mencionadas en las otras respuestas, no se recomienda para la mayoría de las distribuciones de Linux, pero en realidad hay distribuciones que se hacen específicamente para ejecutar binarios vinculados estáticamente:

De stali descripción:

Static linux se basa en una colección seleccionada a mano de las mejores herramientas para cada tarea y cada herramienta que se vincula estáticamente (incluyendo algunos X clientes como st, surf, dwm, dmenu),

También apunta a la reducción de tamaño binario a través de la evitación de glibc y otras bibliotecas de GNU hinchadas donde sea posible (los primeros experimentos muestran que los binarios vinculados estáticamente son generalmente más pequeños que sus contrapartes de glibc enlazadas dinámicamente!!!). Nota, esto es más o menos contrariamente a lo que Ulrich Drepper considera sobre el enlace estático.

Debido a la beneficio secundario: los binarios vinculados estáticamente comienzan más rápido, la distribución también apunta a mejoras en el desempeño.

La vinculación estática también ayuda a la reducción de la dependencia.

Puede leer más al respecto en esta pregunta sobre el enlace estático vs dinámico.

 8
Author: Farid Nouri Neshat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:32:25