首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dlsym()返回符号的奇怪地址

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

Stack Overflow用户
提问于 2012-08-10 18:24:35
回答 1查看 597关注 0票数 0

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

代码语言:javascript
复制
printf("strerror=%p, strerror_r=%p\n", strerror, strerror_r);
strerror=0x8049ec0, strerror_r=0x8049e20

2)。dlsym版本:

代码语言:javascript
复制
rtldDefault= dlopen(0, RTLD_NOW | RTLD_GLOBAL);
dlsym(rtldDefault, "strerror_r"); ==> strerror_r=0xb76544e0

代码语言:javascript
复制
dlsym(rtldDefault, "strerror"); ==> strerror=0x8049ec0

3)。其他:

代码语言:javascript
复制
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时什么也不做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-10 19:02:02

如果您查看/usr/include/string.h中的strerror_r声明

/*可重入版本的GNU _r‘,strerror'. There are 2 flavors of返回字符串并可能使用提供的临时缓冲区,也可能不使用提供的临时缓冲区,而POSIX _r’将字符串填充到缓冲区中。要使用POSIX版本,需要不带-D_GNU_SOURCE的-D_XOPEN_SOURCE=600或-D_POSIX_C_SOURCE=200112L,否则首选GNU版本。*/

然后是一些令人困惑的声明

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

代码语言:javascript
复制
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的检查

代码语言:javascript
复制
00000000      DF *UND*  00000000  GLIBC_2.3.4 __xpg_strerror_r

所以,在问你的问题时,只需执行dlsym(rtldDefault, "__xpg_strerror_r")

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11899728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档