Я хочу создать разделяемую библиотеку, которая может быть загружена в цели двумя различными способами:
- LD_PRELOAD
- Динамическая загрузка через
dlsym
Моя общая библиотека выглядит так:
#include "stdio.h"
void __attribute__ ((constructor)) my_load(void);
void my_load(void) {
printf("asdf");
}
void someFunc(void) {
printf("someFunc called");
}
Я собираю это так:
all:
gcc -fPIC -g -c -Wall MyLib.c
gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc
Я не хочу устанавливать его с ldconfig
и т. Д. Целевой процесс выглядит следующим образом:
#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;
}
Цель скомпилирована так:
all:
gcc TestProg.c -ldl -o TestProg
Мои вопросы:
- При динамической загрузке с
dlopen
, как указано выше, почему my_load
не вызывается?
- При использовании того же метода, почему
dlsym
всегда возвращает nil
, хотя dlopen
возвращает ненулевое значение? Точно так же nm
не перечисляет ни my_load
, ни someFunc
как символы .so.
- Можно ли использовать
LD_PRELOAD
для загрузки библиотеки? Я попытался скопировать .so в ту же директорию, что и цель, затем вызвал LD_PRELOAD="./MyLib.so.1.0.1" ./TestProg
, но снова my_load
, похоже, не вызывается.