首页 > 解决方案 > 如何从目标文件转储到源的路径

问题描述

假设我有一个app.o用 gcc 编译的 C 目标文件。如何将文件路径转储到编译的原始文件app.c路径app.o。我的目标是使用 binutils 和 gcc 工具套件创建所有符号 + 相应源文件路径的列表。我绝不期待一个多合一的解决方案。所以我尝试使用多种工具来收集我需要的信息。

使用文本编辑器检查目标文件会发现(除了许多不可读的二进制乱码)该文件确实包含对app.c作为嵌入目标文件格式的字符串的引用。但是我没有找到使用objdumpor提取该字符串的方法nm

我希望objdump有一些标志可以提取这个源文件字符串,但是在尝试了man页面中记录的几乎所有选项之后,我仍然找不到它。

使用源文件的路径,我希望我可以运行gcc -M <path-to-source>. 这将允许我查看包含的所有标头app.c并找到源内声明。

假设一个简单的app.c像这样:

void foo(void) {
}

通过编译它gcc -c app.c -o app.o

运行objdump -t app.o会转储符号表,但不会在任何地方引用原始app.c. 运行cat app.o确实表明目标文件包含文件路径app.c(相对于编译时的 pwd)。但我并不完全打算编写自己的目标文件解析器来获取该字符串。

标签: cgccobjdumpobject-filesnm

解决方案


在发布后几分钟回答我自己的问题(呃!):

readelf -s app.o打印包含源文件名称的符号表 ( app.c)。这样我就可以运行gcc -M app.c然后解析所有头文件以收集符号声明。


推荐阅读