是否可以确定符号是否是C中的变量或函数?

dyk*_*eag 6 c linux symbol-tables symbol-table

我正在为在Linux机器上运行的C编写的应用程序实现一些有限的远程调试功能.目标是与应用程序通信并查找任意变量的值或运行任意函数.

我能够通过dlsym()调用查找符号,但我无法确定返回的地址是指函数还是变量.有没有办法通过此符号表确定输入信息?

rod*_*igo 2

您可以读取该文件/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)

所以地址是:codedatadata