gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:16 25 4
gpt4 key购买 nike

有谁知道如何使用 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 来完成此操作

谢谢

最佳答案

简短回答,“不,但是......”

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 来完成它们。

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

关于linux - 如何使用 gcc 从目标文件生成所有可能的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35262283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com