C 如何预加载自己编译的库?

C 如何预加载自己编译的库?,c,linux,gcc,ld-preload,C,Linux,Gcc,Ld Preload,我想知道这是如何工作的,创建一个库并预加载它,以便程序可以使用它而不是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 =

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

$ LD_PRELOAD=/home/bob/desarrollo/libshared.so ./prograndom

不打印33,只是随机数…< /p> 你的程序是C程序,但是CPP这是一个问题,因为它意味着你的函数<代码> RAND (在<代码>共享.CPP )将被编译为C++函数,其名称被损坏以包含其类型签名。但是,您主要包括#include,其作用是声明:

extern "C" int rand();
这就是链接器将要查找的
rand
。因此,您的预加载将没有效果

如果将文件名从
shared.cpp
更改为
shared.c
,则它将按预期工作

其他价值可疑的备选方案包括:

  • shared.cpp
    文件中声明
    rand
    extern“C”
    。然后可以将其编译为C++。
  • 使用GCC选项
    -xc
    强制编译为C


你的程序是C程序,但是CPP文件扩展名意味着C++,GCC会这样解释。

这是一个问题,因为它意味着你的函数<代码> RAND (在<代码>共享.CPP )将被编译为C++函数,其名称被损坏以包含其类型签名。但是,您主要包括#include,其作用是声明:

extern "C" int rand();
这就是链接器将要查找的
rand
。因此,您的预加载将没有效果

如果将文件名从
shared.cpp
更改为
shared.c
,则它将按预期工作

其他价值可疑的备选方案包括:

  • shared.cpp
    文件中声明
    rand
    extern“C”
    。然后可以将其编译为C++。
  • 使用GCC选项
    -xc
    强制编译为C


如果我想在C++中这样做,我应该做些什么改变?@洪鲁鲁:你必须声明<代码> RAND 你想使用“代码>外部”C“< /Cord>”,以匹配<代码> RAND >你试图重写。但是如果您使用编译为C的
main
尝试预加载,您可能会遇到问题?这样做的全部目的是不触及主程序代码。我想我在编辑时已经回答了这个问题。但最好将
rand
编译为C函数。毕竟,你正在替换C函数。如果我想在C++中做这件事,我应该做些什么改变?@洪鲁鲁:你必须声明<代码> RAND 你想用“<代码>外部”C“< /代码>”,以匹配<代码> RAND >你试图重写。但是如果您使用编译为C的
main
尝试预加载,您可能会遇到问题?这样做的全部目的是不触及主程序代码。我想我在编辑时已经回答了这个问题。但最好将
rand
编译为C函数。毕竟,您正在替换一个C函数。