dyk*_*eag 6 c linux symbol-tables symbol-table
我正在为在Linux机器上运行的C编写的应用程序实现一些有限的远程调试功能.目标是与应用程序通信并查找任意变量的值或运行任意函数.
我能够通过dlsym()调用查找符号,但我无法确定返回的地址是指函数还是变量.有没有办法通过此符号表确定输入信息?
您可以读取该文件/proc/self/maps并解析每行的前三个字段:
<begin-addr>-<end-addr> rwxp ...
Run Code Online (Sandbox Code Playgroud)
然后搜索包含您要查找的地址的行并检查权限:
r-x:是代码;rw-:可写数据;r--:为只读数据;rwxp:生成的代码,...)。例如下面的程序:
#include <stdio.h>
void foo() {}
int x;
int main()
{
int y;
printf("%p\n%p\n%p\n", foo, &x, &y);
scanf("%*s");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...在我的系统中给出以下输出:
0x400570
0x6009e4
0x7fff4c9b4e2c
Run Code Online (Sandbox Code Playgroud)
...这些是来自以下内容的相关内容/proc/<pid>/maps:
00400000-00401000 r-xp 00000000 00:1d 641656 /tmp/a.out
00600000-00601000 rw-p 00000000 00:1d 641656 /tmp/a.out
....
7fff4c996000-7fff4c9b7000 rw-p 00000000 00:00 0 [stack]
....
Run Code Online (Sandbox Code Playgroud)
所以地址是:code、data和data。