繁体   English   中英

我如何LD_PRELOAD自己的编译库?

[英]How can I LD_PRELOAD my own compiled library?

我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是include语句中的那个。

这是我正在做的事情,到目前为止还没有工作。

//shared.cpp
int rand(){
    return 33;
}

//prograndom.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    srand(time(NULL));
    int i = 10;
    while(i--) printf("%d\n", rand()%100);
    return 0;
}

然后在终端中:

$ gcc -shared -fPIC shared.cpp -o libshared.so
$ gcc prograndom.cpp -o prograndom
$ export LD_PRELOAD=/home/bob/desarrollo/libshared.so

最后

$ LD_PRELOAD=/home/bob/desarrollo/libshared.so ./prograndom

不会打印33,只是随机数...

您的程序是C程序,但是cpp文件扩展名暗含C ++,GCC会以这种方式解释它。

这是一个问题,因为这意味着您的函数rand (在shared.cpp )将被编译为C ++函数,其名称被修饰为包括其类型签名。 但是,主要是#include <stdlib.h> ,它具有声明的作用:

extern "C" int rand();

这就是链接器将要寻找的rand 因此,您的PRELOAD无效。

如果将文件名从shared.cppshared.c ,则它将按预期工作。

具有可疑价值的其他替代方法是:

  • 在您的shared.cpp文件中声明randextern "C" 然后可以将其编译为C ++。

  • 使用GCC选项-xc强制将编译为C。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM