【问题标题】:How do you call into an executable from library constructor loaded with LD_PRELOAD?如何从加载了 LD_PRELOAD 的库构造函数调用可执行文件?
【发布时间】: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.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 外部访问的方式进行编译?

任何帮助将不胜感激。

【问题讨论】:

    标签: c gcc ld shared-libraries ld-preload


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 2020-11-25
      • 2017-04-27
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多