假设我有一个用gcc编译的C对象文件app.o
。如何将文件路径转储到从其编译app.c
的原始app.o
中。我的目标是使用binutils和gcc toolsuite创建所有符号+相应源文件路径的列表。
我绝对不是期望一个一体化的解决方案。因此,我尝试使用多种工具来收集所需的信息。
用文本编辑器检查目标文件后发现,(文件确实来自许多不可读的二进制胡言乱语)包含对app.c
的引用,作为嵌入到目标文件格式。但是,我没有找到使用objdump
或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)。但是我并没有计划写我自己的目标文件解析器只是为了到达那个字符串。
答案 0 :(得分:0)
要在发布问题后的几分钟内回答我自己的问题(不是!):
readelf -s app.o
打印包含源文件名(app.c
)的符号表。这样,我可以运行gcc -M app.c
,然后解析所有头文件以收集符号声明。