Quiero crear una biblioteca compartida que se puede cargar de dos maneras diferentes en objetivos:Carga dinámica de bibliotecas compartidas de Linux?
- LD_PRELOAD
- carga dinámica mediante
dlsym
Mi biblioteca compartida se ve así:
#include "stdio.h"
void __attribute__ ((constructor)) my_load(void);
void my_load(void) {
printf("asdf");
}
void someFunc(void) {
printf("someFunc called");
}
Lo estoy compilando como lo hago:
all:
gcc -fPIC -g -c -Wall MyLib.c
gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc
No deseo a instalarlo con ldconfig
, etc. El proceso de destino tiene el siguiente aspecto:
#include <stdio.h>
#include <dlfcn.h>
void func1() {
printf("%d\n", 1);
}
void func2() {
printf("%d\n", 2);
}
void func3() {
printf("%d\n", 3);
}
int main() {
void* lib_handle = dlopen("/home/mike/Desktop/TargetProcess/MyLib.so.1.0.1",
RTLD_NOW|RTLD_GLOBAL);
if(lib_handle == NULL) {
printf("Failed loading lib\n");
} else {
printf("Loaded lib successfully\n");
void (*some_func)() = dlsym(lib_handle, "someFunc");
printf("%p\n", some_func);
dlclose(lib_handle);
}
func1();
func2();
func3();
return 0;
}
El objetivo es compilado como así:
all:
gcc TestProg.c -ldl -o TestProg
Mis preguntas son:
- Con la carga dinámica con
dlopen
como arriba, ¿por quémy_load
parece que no se llama? - Con el mismo método, ¿por qué
dlsym
siempre devuelvenil
aunquedlopen
devuelve no nulo? Del mismo modo,nm
no enumera nimy_load
nisomeFunc
como símbolos de .so. - ¿Es posible utilizar
LD_PRELOAD
para cargar la biblioteca? Intenté copiar .so en el mismo directorio que el objetivo y luego invocarLD_PRELOAD="./MyLib.so.1.0.1" ./TestProg
, pero de nuevomy_load
parece que no se está llamando.
Funciona perfectamente. Se carga tanto como LR_PRELOAD como de forma dinámica. 'my_load' también se llama en ambos casos. ¡Gracias! –
En realidad no está vacío, contiene algunas cosas libc. El enlace habría fallado si no hubiera especificado '-lc'. :) – ninjalj