2010-07-08 15 views

Respuesta

3

sustituya la ruta a la biblioteca existente con una ruta personalizada

Si esta es su propia biblioteca, entonces es probable que la vinculación de esa manera:

$ cc -o prog1 -l/full/path/to/libABC.so prog1.o 

en lugar de la correcta:

$ cc -o prog1 -L/full/path/to/ -lABC prog1.o 

El primer enfoque le dice al encriptador de Linux que la aplicación necesita pre Ciertamente esa biblioteca, solo esa biblioteca y ninguna anulación debería ser posible. El segundo enfoque indica que la aplicación necesita la biblioteca que se instalaría en algún lugar del sistema, ya sea en la ruta predeterminada de la biblioteca o en una señalada por $ LD_LIBRARY_PATH (se buscaría durante el tiempo de ejecución). -L se usa solo durante el tiempo de enlace.

De lo contrario, en lugar de parchear el ELF, primero compruebe si puede sustituir la biblioteca mediante un enlace simbólico. Este es el truco habitual: es difícil modificar el ejecutable después, pero es muy fácil cambiar dónde se encuentran los puntos de enlace simbólico.

1

Es posible que desee comprobar la variable de entorno LD_LIBRARY_PATH.

1

Si nos fijamos en la sección .dynsym en Linux a través de readelf, sólo verá algo como:

1: 0000000000000000 163 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2) 

la que sólo contiene un nombre simbólico de la biblioteca. Sin embargo, si se incluye la información cargador dinámico, que se obtiene:

libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000) 
    /lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000) 

Así como se ha mencionado, el absoluto lo más fácil de hacer (suponiendo que usted está haciendo esto para la depuración, y no para siempre) no sería más que para crear un nueva sesión, exporte su ruta personalizada frente al existente LD_LIBRARY_PATH, y vaya desde allí.

Cuestiones relacionadas