如何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.cpp
更改为 shared.c
,那么它将按预期工作。
其他价值可疑的备选方案是:
在您的 shared.cpp
文件中声明 rand
为 extern "C"
。然后您可以将其编译为 C++。
使用 GCC 选项强制编译为 C -x c
。
我想知道这是如何工作的,创建一个库并预加载它以便程序可以使用它而不是 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 选项强制编译为 C
-x c
。