【发布时间】:2017-01-12 07:41:19
【问题描述】:
根据手册页 extra_info 包含绝对路径名。我不确定我是否正确理解了手册页,但我无法获得文件的绝对路径名。这是我尝试过的:
源代码:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <link.h>
#include <stdio.h>
int main2(int i)
{
return 2+i;
}
int main(void)
{
Dl_info i={0};
int r;
// struct link_map ei_={0}, *ei=&ei_;
struct link_map *ei=0;
void *ptr = (void*)main2;
r = dladdr1(ptr, &i, (void**)&ei, RTLD_DL_LINKMAP);
if(r)
{
printf("name = %s [%s]\n", i.dli_sname, ei->l_name);
}
return 1;
}
这样编译:
gcc -g3 -rdynamic -ldl dlerr.c
结果:
name = main2 []
gdb 会话:
24 printf("name = %s [%s]\n", i.dli_sname, ei->l_name);
(gdb)
name = main2 []
27 return 1;
(gdb) p i
$1 = {dli_fname = 0x7fffffffe5a7 "/home/user/learn/dlerr/a.out", dli_fbase = 0x400000,
dli_sname = 0x400674 "main2", dli_saddr = 0x4008bd <main2>}
(gdb) p *ei
$2 = {l_addr = 0, l_name = 0x7ffff7ffe6d8 "", l_ld = 0x600e08, l_next = 0x7ffff7ffe6e0,
l_prev = 0x0}
(gdb)
注意:info 参数目前给出了所需的路径,但在复杂的项目中,我们经常发现在调试时会打印相对路径(未尝试过此 API)。所以当手册页说 extra_info 给出绝对路径时,我想依赖它。同样, *info 和 *extra_info 至少按照手册页返回路径名不是互斥的。 (gcc 版本是 4.8.x)。
【问题讨论】: