c - 如何从目标文件转储到源的路径
问题描述
假设我有一个app.o
用 gcc 编译的 C 目标文件。如何将文件路径转储到编译的原始文件app.c
路径app.o
。我的目标是使用 binutils 和 gcc 工具套件创建所有符号 + 相应源文件路径的列表。我绝不期待一个多合一的解决方案。所以我尝试使用多种工具来收集我需要的信息。
使用文本编辑器检查目标文件会发现(除了许多不可读的二进制乱码)该文件确实包含对app.c
作为嵌入目标文件格式的字符串的引用。但是我没有找到使用objdump
or提取该字符串的方法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)。但我并不完全打算编写自己的目标文件解析器来获取该字符串。
解决方案
在发布后几分钟回答我自己的问题(呃!):
readelf -s app.o
打印包含源文件名称的符号表 ( app.c
)。这样我就可以运行gcc -M app.c
然后解析所有头文件以收集符号声明。
推荐阅读
- makefile - makefile 中命令的用途
- mysql - 在sql中计算加权平均值
- python-3.x - Django 无法获取模型模块
- docker - Debian 突然抛出 'libcrypt.so.1: cannot open shared object file: No such file or directory' in Docker
- javascript - 在 React Native 中每天进行一次条件渲染
- postgresql - Celery 容器中的 pg_dump 与其他容器中的 pg_dump 不同
- typescript - 从 CommonJS 切换到 ES2020 模块后必须附加 /index 以导入 index.d.ts
- node.js - MissingSchemaError:尚未为模型“农场”注册架构
- delphi - 选择哪一个,stdcall 还是 cdecl?
- java - 幂等Kafka生产者回调