我想创建一个共享库,可以通过两种不同的方式加载到目标文件中:
- 使用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
。
my_load
。谢谢! - Mike Kwan-lc
,链接将会失败。 :) - ninjalj