请理解我正在使用 Autotools / Automake / Autoconf,并且我无法使用重定向因为它需要在autotools生成的make文件中逐个命令地应用。
我需要一种方法让自动工具创建一个 make 文件,其中包含生成和保存与每个相关的编译器和/或汇编器列表的规定个人源码在包里。
我的第一次尝试是将“-Wa,-acdhln -g”添加到 CCFLAGS 中。这确实产生了复合 c/汇编程序列表,但它去了航站楼,不进入文件。如果我捕获 make 输出(使用重定向),我将得到 47 个不同的列表以及散布的构建命令。
我希望发生的事情,乐观地阅读 GCC 文档总体选项 - 使用 GNU 编译器集合,
-o file
将输出放置在文件 file 中。这适用于生成的任何类型的输出,无论是可执行文件、目标文件、汇编程序文件还是预处理的 C 代码。如果不指定-o,则默认将可执行文件放在a.out中,source.suffix的目标文件放在source.o中,其汇编程序文件放在source.s中,预编译头文件放在source.suffix.gch中,以及标准输出上的所有预处理 C 源代码。
用于显示文件 {file}.o 和 {file}.s,基于 GCC 命令行中的“-o {file}.o”。
所发生的情况是,程序集列表显然已发送到标准输出。
编辑添加 2016 年 10 月 23 日。我现在意识到文档正在讨论诸如编译器输出文件作为输入传递给汇编器,以及汇编器输出文件作为输入传递给链接器之类的事情。我想要捕获的汇编器列表文件也不会。
这也适用于使用 -save-temps 选项;它只会保存汇编器的输出,即链接器输入文件,而不是汇编器列表文件。
该文档的另一种解释可能意味着每个输出文件都将放置在 -o 操作数中指定的单个文件中,或者混合在一起,或者与最后创建的文件覆盖先前创建的文件。 (例如,编译器通道的输出覆盖了汇编器通道的输出,再覆盖了集合通道的输出。)
由于这似乎适得其反,我假设 GCC(顶级执行程序)可能足够聪明调整不同通道的文件名。这似乎不是真的。从“-o”中省略文件名似乎正是我们想要的,只是目标文件总是命名为“a.out”而不是“{source}.o”。为什么选择源输出名称常量对我来说毫无意义,但每次 GCC 调用后的重命名步骤可能会将“a.out”更改为“{source}.o”。
咨询GNU 汇编器文档关于 -o 的说明更少,并且没有处理输出列表的选项。汇编器版本 tigcc 记录了该列表作为标准输出发出。
Unix 的 GNU 和 GNU 构建标准修订版没有解决这个问题吗?
(我是疯了,还是我只是生活在一个叫做 Unix 的非现实中???)
所以现在看起来 Make 需要告诉 GCC 当执行汇编步骤时,标准输出应该放在[电子邮件受保护]文件。考虑到 GCC 选项的行为方式(以及快速查看规范文件的使用方式),我怀疑这是无法完成的。也许 Automake(或 libtools?)可以创建多步编译操作,分离出各个步骤,以便捕获汇编输出。
但,由于 make 文件是由 autotools 生成的,我需要一种方法告诉 autotools 创建 make 文件这将创建/捕获程序集输出文件。这项任务似乎需要重写一些 autoconf/automake 规则和/或宏。
最后,我正在使用其他人使用自动工具创建的包,打包并下载给我。我没有进行自动工具打包,也没有创建巨大的 *.ac 文件,而且我不想破解它们,如果可以避免的话。
我只需要获取一些程序集和链接映射来尝试调试包的问题。
答案1
我最终崩溃并编写了一个真实的程序来分析捕获的终端输出并提取列表文件。虽然它适用于我的特定系统/构建配置/包,但我只能将其作为示例提供。它当然不是一个易于使用的工具。
抱歉,这确实不是克服自动工具缺点的一般答案。