1

我希望能够从我预加载的库中调用可执行文件。去做这个 -

我有一个简单的可执行文件

主程序

#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.outlibpreload.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 外部访问的方式进行编译?

任何帮助,将不胜感激。

4

1 回答 1

1

添加-rdynamic到程序的编译标志。默认情况下,只有共享库与动态符号表(动态链接器(例如/lib/ld-linux.so.2)用于通过名称查找函数地址的表)链接。

如果没有动态符号表,您也不能dlsym在 self 二进制上使用。

于 2014-03-20T15:16:08.483 回答