如何知道链接到二进制可执行文件的调试符号文件的名称 and/or 路径?

How to know the name and/or path of the debug symbol file which is linked to a binary executable?

如何知道 link 编译为二进制可执行文件的调试符号文件的名称 and/or 路径?

假设你这样做了:

objcopy --only-keep-debug foo foo.dbg
objcopy --strip-debug foo
objcopy --add-gnu-debuglink=foo.dbg foo

现在foo.dbg有调试符号,foo只有link到foo.dbg gdb可以使用。 由于 gdb 可以从 foo 知道符号文件,我们如何在没有实际 运行 gdb 的情况下知道相同的内容?

我观察到,即使我将可执行文件从 foo 重命名为 xyz,gdb 仍然会从 foo.dbg 加载符号,所以它不像 binaryname.extension, 扩展名是可选的。

how can we know same without actually running gdb?

这些命令中的任何一个都会告诉您:

readelf -x.gnu_debuglink foo
objdump -sj.gnu_debuglink foo

objcopy --add-gnu-debuglink 只是添加包含给定路径的 .gnu_debuglink 部分,以及调试文件的校验和。

更多信息here