簡體   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