gpt4 book ai didi

c - dlsym() 返回符号的奇怪地址

转载 作者:行者123 更新时间:2023-11-30 15:55:39 32 4
gpt4 key购买 nike

1).直接打印函数地址:

printf("strerror=%p, strerror_r=%p\n", strerror, strerror_r);
strerror=0x8049ec0, strerror_r=0x8049e20

2). dlsym 版本:

rtldDefault= dlopen(0, RTLD_NOW | RTLD_GLOBAL);
dlsym(rtldDefault, "strerror_r"); ==> strerror_r=0xb76544e0

但是

dlsym(rtldDefault, "strerror"); ==> strerror=0x8049ec0

3).其他:

dlsym((void*)0, "strerror_r") ==> strerror_r=0xb76544e0
dlsym((void*)-1, "strerror_r") ==> strerror_r=0xb76544e0

如何使用 dlsym() 获取 strerror_r=0x8049e20

我已经先打印了strerror_r的地址,然后调用dlsym()。

strerror_r=0xb76544e0 是错误的地址,我用这个地址调用 strerror_r 只是什么也不做。

最佳答案

如果您查看 /usr/include/string.hstrerror_r 的声明:

/* Reentrant version of strerror'.
There are 2 flavors of
strerror_r', GNU which returns the string and may or may not use the supplied temporary buffer and POSIX one which fills the string into the buffer. To use the POSIX version, -D_XOPEN_SOURCE=600 or -D_POSIX_C_SOURCE=200112L without -D_GNU_SOURCE is needed, otherwise the GNU version is preferred. */
[and then some quite confusing declarations]

使用 gcc -save-temps 和默认配置编译示例程序,我得到以下预编译声明:

extern int strerror_r (int __errnum, char *__buf, size_t __buflen) 
__asm__ ("" "__xpg_strerror_r") __attribute__ ((__nothrow__ , __leaf__))
__attribute__ ((__nonnull__ (2)));

因此看起来 strerror_r 函数链接到符号 __xpg_strerror_r

确实,检查生成的二进制文件objdump -t a.out | grep strerror:

00000000      DF *UND*  00000000  GLIBC_2.3.4 __xpg_strerror_r

因此,提出您的问题时,只需执行dlsym(rtldDefault, "__xpg_strerror_r")即可。

关于c - dlsym() 返回符号的奇怪地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11899728/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com