c - 如何找出用于构建二进制文件的 *.c 和 *.h 文件?

标签 c linux gcc build

我正在构建一个构建多个共享库和可执行文件的项目。用于构建这些二进制文件的所有源文件都在一个/src 目录中。因此,弄清楚哪些源文件用于构建每个二进制文件并不明显(存在多对多关系)。

我的目标是编写一个脚本来为每个二进制文件解析一组 C 文件,并确保只从中调用正确的函数。

一个选项似乎是尝试从 Makefile 中提取此信息。但这不适用于生成的文件和 header (由于依赖于包含)。

另一种选择可能是简单地浏览调用图,但这会变得很复杂,因为很多函数是通过使用函数指针调用的。

还有其他想法吗?

最佳答案

您可以先使用调试信息 (gcc -g) 编译项目,然后使用 objdump 获取包含了哪些源文件。

objdump -W <some_compiled_binary>

Dwarf 格式应该包含您要查找的信息。

 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    < c>   DW_AT_producer    : (indirect string, offset: 0x5f): GNU C 4.4.3 
    <10>   DW_AT_language    : 1    (ANSI C)
    <11>   DW_AT_name        : (indirect string, offset: 0x28): test_3.c    
    <15>   DW_AT_comp_dir    : (indirect string, offset: 0x36): /home/auselen/trials    
    <19>   DW_AT_low_pc      : 0x82f0   
    <1d>   DW_AT_high_pc     : 0x8408   
    <21>   DW_AT_stmt_list   : 0x0  

在这个例子中,我从 test_3 编译了目标文件,它位于 .../trials 目录中。那么当然你需要围绕这个写一些脚本来收集相关的源文件名。

关于c - 如何找出用于构建二进制文件的 *.c 和 *.h 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186656/

相关文章:

c - C语言中如何比较float变量和double变量?

c - 函数中赋值的指针返回后为空

c# - 在Linux的同一台计算机上运行多个实例时的.Net Core垃圾回收

linux - 使用 rpmrebuild 修改 rpm

windows - 我的 gcc.exe 在哪里?

c - 关于用 C 语言为 FreeBSD 开发命令行应用程序的权威书籍是什么?

c - 尝试在 xv6 操作系统中实现三重间接寻址时 XV6 崩溃

linux - iptables 将端口转发到另一个网络

c++ - 构建小型中小企业客户端的未定义引用

c++ - 是否必须定义所有静态类方法,即使未使用?