ver update check linux gcc linker glibc libc

linux - check - update glibc centos



¿Cómo puedo enlazar a una versión específica de glibc? (2)

Enlace con- estático . Cuando se vincula con -static, el enlazador incrusta la biblioteca dentro del ejecutable, por lo que el ejecutable será más grande, pero se puede ejecutar en un sistema con una versión anterior de glibc porque el programa usará su propia biblioteca en lugar del sistema. .

Cuando compilo algo en mi PC Ubuntu Lucid 10.04, se vincula con glibc. Lucid usa 2.11 de glibc. Cuando ejecuto este binario en otra PC con un glibc anterior, el comando falla diciendo que no hay glibc 2.11 ...

Hasta donde yo sé, glibc usa el control de versiones de símbolos. ¿Puedo forzar que gcc se vincule con una versión de símbolo específica?

En mi uso concreto, trato de compilar una cadena de herramientas gcc cross para ARM.


Tiene razón en que glibc utiliza el control de versiones de símbolos. Si tiene curiosidad, la implementación de versiones de símbolos presentada en glibc 2.1 se describe here y es una extensión del esquema de control de versiones de símbolos de Sun que se describe here .

Una opción es vincular estáticamente tu binario. Esta es probablemente la opción más fácil.

También podría construir su binario en un entorno de compilación chroot, o usar un compilador cruzado glibc- new => glibc- old .

De acuerdo con la publicación del blog http://www.trevorpounds.com Enlazando con símbolos versionados más antiguos (glibc) , es posible forzar cualquier símbolo a vincularse con uno más antiguo, siempre que sea válido usando el mismo .symver pseudo-op que se usa para definir símbolos versionados en primer lugar. El siguiente ejemplo se extrajo de la publicación del blog .

El siguiente ejemplo hace uso de la ruta real de glibc, pero se asegura de que esté vinculado a una versión anterior de 2.2.5.

#include <limits.h> #include <stdlib.h> #include <stdio.h> __asm__(".symver realpath,realpath@GLIBC_2.2.5"); int main() { char* unresolved = "/lib64"; char resolved[PATH_MAX+1]; if(!realpath(unresolved, resolved)) { return 1; } printf("%s/n", resolved); return 0; }