如何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 文件中声明 randextern "C"。然后您可以将其编译为 C++。

  • 使用 GCC 选项强制编译为 C -x c