【发布时间】:2014-03-20 14:35:27
【问题描述】:
我希望能够从我预加载的库中调用可执行文件。为此 -
我有一个简单的可执行文件
main.c
#include <stdio.h>
void callme()
{
printf("callme\n");
}
int main(int argc, char *argv[])
{
callme();
return 0;
};
这是用
编译的gcc -m32 main.c
我现在想预加载一个库,以便在 main 之前调用 callme。
preload.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 外部访问的方式进行编译?
任何帮助将不胜感激。
【问题讨论】:
标签: c gcc ld shared-libraries ld-preload