我希望能够从我预加载的库中调用可执行文件。去做这个 -
我有一个简单的可执行文件
主程序
#include <stdio.h>
void callme()
{
printf("callme\n");
}
int main(int argc, char *argv[])
{
callme();
return 0;
};
这是用
gcc -m32 main.c
我现在想预加载一个库,以便callme
在之前调用它main
。
预加载.c
extern void callme();
void preload_init() __attribute__((constructor));
void preload_fini() __attribute__((destructor));
void preload_init()
{
callme();
}
void preload_fini()
{
callme();
}
这是用
gcc -D_GNU_SOURCE -shared -o libpreload.so preload.c -fPIC -m32 -ldl
所以现在我a.out
有libpreload.so
当我尝试运行它时
LD_PRELOAD=./libpreload.so ./a.out
./a.out: symbol lookup error: ./libpreload.so: undefined symbol: callme
为了调试这个我试过
LD_DEBUG=symbols LD_PRELOAD=./libpreload.so ./a.out
此的输出包括这一行
13184: symbol=callme; lookup in file=./a.out [0]
所以看起来它在寻找 callme 符号的正确位置。
的输出nm a.out
包括以下行
080483b4 T callme
我是否必须以使 callme 可以从 a.out 外部访问的方式进行编译?
任何帮助,将不胜感激。