如何使用gcc从目标文件生成所有可能的二进制文件

时间:2016-02-08 04:19:09

标签: linux gcc

有谁知道如何使用gcc从目标文件生成所有可能的二进制文件?我知道您可以使用:“gcc -MM”为某些给定的源文件生成所有.o文件。

但是如何使用gcc从目标文件生成所有可能的二进制文件 在一个项目中?

示例:我使用“gcc -MM”生成:a.o,b.o,c.o,d.o 如果有人试图生成从每个.o文件构建的二进制文件列表,如下所示:

a: b.o c.o d.o
b: a.o c.o d.o
c: a.o b.o d.o
d: a.o b.o b.o

我可以使用Perl脚本执行此操作,但我很好奇是否有某种方法可以使用gcc

由于

1 个答案:

答案 0 :(得分:1)

简短回答,"不,但......"

gcc -MM可以为您foo.o: bar.h,因为foo.cc包含指令:

#include "bar.h"

这很容易。但是foo.cc也可以包含声明:

int bar_f1(int);

gcc如何知道哪个目标文件包含此函数的二进制代码?或者,如果有两个目标文件包含具有此签名的函数,它应该使用哪个?它不能。

...除非......

答案很长,"是的,如果......"

如果你没有给源文件提供其他源文件中的事物声明,也没有给出相应源文件中未包含的任何内容的头文件声明,并且还给出了源文件包含int main(...)固定名称的文件,例如main.cc,然后您可以获取gcc -MM的输出:

bar.o: bar.h baz.h
foo.o: bar.h
main.o: foo.h zot.h
pan.o: pan.h
zot.o: zot.h

并将其转换为:(例如使用Perl或sed)进入:

main: bar.o foo.o zot.o

理论上,你可以通过扫描目标文件和构建依赖树来实现没有这些限制(*);这可能等同于扫描int main(...)的存在,隔离这些文件并将它们中的每一个链接到所有其他文件,或者只是列出它们,如果你想要的只是一个没有依赖项的可执行文件列表(我还不确定你想要什么?。这些东西仍然需要你自己编写脚本,我知道单独使用gcc无法做到这一点。

(*)您仍然必须避免对同一事物有两个定义。