C 如何预加载自己编译的库?
我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是include语句中的库 这就是我正在做的,到目前为止还没有工作C 如何预加载自己编译的库?,c,linux,gcc,ld-preload,C,Linux,Gcc,Ld Preload,我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是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 =
//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;
}
最后
$ LD_PRELOAD=/home/bob/desarrollo/libshared.so ./prograndom
不打印33,只是随机数…< /p> 你的程序是C程序,但是
extern "C" int rand();
这就是链接器将要查找的rand
。因此,您的预加载将没有效果
如果将文件名从shared.cpp
更改为shared.c
,则它将按预期工作
其他价值可疑的备选方案包括:
- 在
文件中声明shared.cpp
为rand
。然后可以将其编译为C++。extern“C”
- 使用GCC选项
强制编译为C-xc
你的程序是C程序,但是 这是一个问题,因为它意味着你的函数<代码> RAND (在<代码>共享.CPP )将被编译为C++函数,其名称被损坏以包含其类型签名。但是,您主要包括#include,其作用是声明:
这就是链接器将要查找的extern "C" int rand();
。因此,您的预加载将没有效果rand
shared.cpp
更改为shared.c
,则它将按预期工作
其他价值可疑的备选方案包括:
- 在
文件中声明shared.cpp
为rand
。然后可以将其编译为C++。extern“C”
- 使用GCC选项
强制编译为C-xc
main
尝试预加载,您可能会遇到问题?这样做的全部目的是不触及主程序代码。我想我在编辑时已经回答了这个问题。但最好将rand
编译为C函数。毕竟,你正在替换C函数。如果我想在C++中做这件事,我应该做些什么改变?@洪鲁鲁:你必须声明<代码> RAND 你想用“<代码>外部”C“< /代码>”,以匹配<代码> RAND >你试图重写。但是如果您使用编译为C的main
尝试预加载,您可能会遇到问题?这样做的全部目的是不触及主程序代码。我想我在编辑时已经回答了这个问题。但最好将rand
编译为C函数。毕竟,您正在替换一个C函数。