Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets LD#u预加载编译。因此使用gcc或g++;_Sockets_Gcc_Ld Preload - Fatal编程技术网

Sockets LD#u预加载编译。因此使用gcc或g++;

Sockets LD#u预加载编译。因此使用gcc或g++;,sockets,gcc,ld-preload,Sockets,Gcc,Ld Preload,我有一个套接字API的包装器,在我的应用程序使用LD_preload之前预加载它。但是,当我使用g++编译.so包装器库时,它不起作用,也就是说,套接字实现的glibc版本是picketd 这就是我如何编译包装器.so库(其中之一): 以下是我编译和运行udp客户端的方式: g++ -Wall udp_client.cpp -o udp_client LD_PRELOAD=./socket_hooks.so ./udp_client 现在,当我启用调试(export LD_debug=all

我有一个套接字API的包装器,在我的应用程序使用LD_preload之前预加载它。但是,当我使用g++编译.so包装器库时,它不起作用,也就是说,套接字实现的glibc版本是picketd

这就是我如何编译包装器.so库(其中之一):

以下是我编译和运行udp客户端的方式:

g++ -Wall udp_client.cpp  -o udp_client
LD_PRELOAD=./socket_hooks.so ./udp_client
现在,当我启用调试(export LD_debug=all)并使用.so编译运行时,使用gcc(工作版本)编译的示例我看到:

 17278: symbol=socket;  lookup in file=./udp_client [0]
 17278: symbol=socket;  lookup in file=./socket_hooks.so [0]
 17278: binding file ./udp_client [0] to ./socket_hooks.so [0]: normal symbol `socket' [GLIBC_2.2.5]
当我编译时。因此使用g++我看到以下内容:

 17285: symbol=socket;  lookup in file=./udp_client [0]
 17285: symbol=socket;  lookup in file=./socket_hooks.so [0]
 17285: symbol=socket;  lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
 17285: binding file ./udp_client [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `socket' [GLIBC_2.2.5]
在这两种情况下,都会找到“socket”符号,但在后一种情况下,不会拾取该符号,而是使用libc


你能解释这里发生的事情吗?< /P> < P>当你用C++编译器编译你的模块时,你的符号被命名为“MulnMulk”以支持函数重载,例如,“代码> Socket < /C>”可以转换为<代码>这就是为什么运行时加载器找不到它-它在寻找

socket
,而不是
\u z10socketii

为了禁用名称篡改,您必须使用
extern“C”
(可能与
\uuucplusplus
宏结合使用)声明带有C链接的函数,以便与C编译器保持兼容:

#ifdef __cplusplus
extern "C" {
#endif

int socket(int domain, int type, int protocol);

#ifdef __cplusplus
}
#endif
或者,根据每个符号设置链接:

#ifdef __cplusplus
#define DONT_MANGLE_ME extern "C"
#else
#define DONT_MANGLE_ME
#endif

DONT_MANGLE_ME int socket(int domain, int type, int protocol);

显示
objdump-T socket\u hooks.so
nm-D socket\u hooks.so
。我认为函数名在C++中被修改,所以你需要声明你的函数为代码>外“C”< /代码>。谢谢,这正是问题所在!
#ifdef __cplusplus
#define DONT_MANGLE_ME extern "C"
#else
#define DONT_MANGLE_ME
#endif

DONT_MANGLE_ME int socket(int domain, int type, int protocol);