【发布时间】:2011-12-01 10:57:40
【问题描述】:
我想创建一个共享库,它可以通过两种不同的方式加载到目标中:
- 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返回非null?同样,nm不会将my_load或someFunc列为 .so 的符号。 - 是否可以使用
LD_PRELOAD加载库?我尝试将 .so 复制到与目标相同的目录中,然后调用LD_PRELOAD="./MyLib.so.1.0.1" ./TestProg但似乎又没有调用my_load。
【问题讨论】: