答案1
strip
您的二进制文件的符号是否已被ped?如果是这样,就不会有符号表,你也没有希望找到这个符号。你可以通过readelf
- 这里我的hello
二进制文件找到做有它的符号表:
$ readelf -S hello | grep -i symtab
[28] .symtab SYMTAB 0000000000000000 000018f8
$
另外,当你运行GDB时,你的程序实际上启动了吗?看起来这个符号在符号表加载之前无法解析。当您第一次启动 GDB 时它不会被加载,但应该在您点击 时加载main()
。您可以简单地main()
在程序中放置一个断点run
,然后在遇到main()
断点时检查变量:
Reading symbols from hello...(no debugging symbols found)...done.
(gdb) x/s *((char **)environ)
No symbol table is loaded. Use the "file" command.
(gdb) b main
Breakpoint 1 at 0x4005c8
(gdb) r
Starting program: /home/ubuntu/hello
Breakpoint 1, 0x00000000004005c8 in main ()
(gdb) x/s *((char **)environ)
0x7fffffffe38f: "XDG_VTNR=7"
(gdb)
答案2
在gdb
你可以使用命令show environment
。作为检查进程环境的替代方法是:
$ sed 's/\x0/\n/g' /proc/<PID>/environ
该sed
命令是将 NUL 分隔符转换为换行符以提高可读性所必需的。
这两种方法的优点(除了简单之外)是,符号表是否被删除并不重要:-)