1

我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是 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,只是随机数...

4

1 回答 1

7

您的程序是 C 程序,但cpp文件扩展名暗示 C++,GCC 会以这种方式解释它。

这是一个问题,因为这意味着您的函数rand(in shared.cpp) 将被编译为 C++ 函数,其名称被修改以包含其类型签名。但是,在 main you#include <stdlib.h>中,它具有声明的效果:

extern "C" int rand();

这就是rand链接器要寻找的。因此,您的 PRELOAD 将无效。

如果您将文件名从 更改shared.cppshared.c,那么它将按预期工作。

其他具有可疑价值的替代品是:

  • 声明randextern "C"您的shared.cpp文件中。然后,您可以将其编译为 C++。

  • 使用 GCC 选项强制编译为-x cC。

于 2016-02-11T03:00:08.660 回答