c++ - Establecer mi lib para LD_PRELOAD hace que algunos procesos produzcan errores de cargador
linux linker (2)
No puedo comentar la respuesta aceptada, sin embargo, vale la pena mencionar aquí que uno puede encontrar el problema de no tener libdl.so.2 vinculado correctamente cuando -ldl
se usa delante del comando de compilación (suponiendo que se ejecute el enlace y la compilación) con el mismo comando; esto es posible ya que las librerías LD_PRELOAD generalmente se basan en un archivo fuente).
Entonces llame a gcc con -ldl
al final:
gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl
En mi caso, tener -ldl
en el frente dio como resultado el mismo error que en cuestión:
uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym
Recibo el siguiente error cuando intento ejecutar un script para el que solo tengo acceso de ejecución:
uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym
Esto es después de haber establecido la variable de entorno /home/dumindara/random/sotest/a.out
en /home/dumindara/random/sotest/a.out
.
a.out
tiene una función de prueba malloc
y llama a dlsym
internamente.
No entiendo este problema cuando ejecuto ls
. La mayoría de los procesos dan este error. ¿Por qué sucede esto y qué puedo hacer para que funcione?
Supongo que su archivo a.out es un objeto compartido y no un ejecutable y continúa ...
dlsym()
es una función de la biblioteca libdl, que generalmente reside en el objeto compartido libdl.so.2 en sistemas Linux modernos.
Voy a pensar que tu objeto compartido no está vinculado a libdl. Eso significa que cuando precarga en una binaria simple como uname que no atrae muchas otras librerías, libdl.so.2 no se puede extraer y se obtiene un error de símbolo indefinido.
Si, por otro lado, lo precarga a un archivo binario que está vinculado y finalmente obtiene libdl.so.2, su objeto compartido funciona bien.
Verificaría con ldd
si tu propio objeto compartido está vinculado contra libdl como debería, y también qué bibliotecas se sacan directa o indirectamente cuando se ejecutan uname
y ls
.
EDITAR:
Acabo de confirmar esto. La forma de corregir este error es vincular el objeto compartido con libdl. Agregar -ldl
a sus LDFLAGS debería hacer el truco.