__xstat动态符号解决在64位错误

问题描述 投票:0回答:1

我试图动态地使用dlopen和dlsym负荷统计功能。从明星家庭功能被包裹在相应的功能qazxsw POI,qazxsw POI ITP。

继狙击的代码,编译并在32位模式下进行编译时的作品(包括__xstat获得stat结构了一个例子)

__xstat64

sys/stat.h

可执行而不64位计算机上#include <iostream> #include <dlfcn.h> #include <sys/stat.h> typedef int (*xstat_f) (int __ver, const char *__filename, struct stat *__stat_buf); int main() { auto* h = dlopen("libc.so.6", RTLD_LAZY); if(!h) { return 1; // invalid handle } auto f = (xstat_f)dlsym(h, "__xstat"); if(!f) { return 1; // invalid handle } struct stat s = {}; const auto r = f(3, "/tmp", &s); if (r != 0) { perror("stat"); return errno; } return 0; } 开关编译返回EINVAL(无效的参数)。

是什么原因?

此外,我做了一个最小的测试

g++ main.cpp -o main -ldl -m32

并使用-m32,两个可执行文件,32位和64位,表明#include <iostream> #include <sys/stat.h> int main(){ struct stat s; const auto x = stat("/tmp", &s); if(x != 0) return errno; return 0; } 解析为objdump -T,所以我用正确的符号。此外,我已经试过的stat__xstat,相同的结果组合。

c++ linux shared-libraries
1个回答
0
投票

__xstat声明如下:

__xstat/__xstat64

在文档参数ver是等,struct stat/stat64,这并非完全如此,因为在源代码描述的,int __xstat(int ver, const char *path, (struct stat *stat_buf)) 的定义如下:

ver shall be 3 or the behavior of these functions is undefined

这就是为什么在64位qazxsw POI呼叫下降,参数qazxsw POI应该被设置为1,和3 32位编译。


推荐问答