[英]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.cpp
为shared.c
,则它将按预期工作。
具有可疑价值的其他替代方法是:
在您的shared.cpp
文件中声明rand
为extern "C"
。 然后可以将其编译为C ++。
使用GCC选项-xc
强制将编译为C。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.