[英]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.