将多个 C 代码编译为一个汇编文件

标签 c gcc assembly compilation

我想将多个 C 文件编译成一个汇编文件(它们是相互关联的,当你编译它时你将得到一个二进制文件)。在 GCC 中有可能吗?

例如看看this repo . make 文件将生成一个文件(二进制文件)。

但是我想将它们编译为程序集,检测代码,然后将它们编译为二进制文件。显然,如果我将所有程序集文件都放在一个 *.s 文件中,对我来说会更容易。

有什么想法吗?

最佳答案

我看到三种方法:

  • 使用cat 连接程序集文件。这应该有效,除非两个或多个翻译单元使用同名的静态变量。如果标签被使用两次,这可能会有问题。您可以使用这样的 sed 脚本预处理单个文件,使标签独一无二:

    s/\.L\([[:alnum:]]*\)/.L$ident\1/
    

    其中 $ident 是每个程序集文件的唯一字符串。这会将 .Lfoo 变成 .Lidentfoo

  • 制作一个看起来像这样的 C 源文件并编译它,和以前一样警告:

    #include "module1.c"
    #include "module2.c"
    ...
    #include "modulen.c"
    
  • 使用ld -r 对一组目标文件执行部分链接。这为您提供了一个包含其他文件内容的大目标文件。然后,您可以使用 objconv 之类的工具来反汇编目标文件、检测它并重新组装。请注意,这可能不是您所需要的。

关于将多个 C 代码编译为一个汇编文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38205999/

相关文章:

c - 为什么修改调用 dirname() 返回的字符串文字不会引发段错误?

c - 编译器优化应用于哪个级别?

c - 使用 libxlsxwriter 构建程序时对 [...] 的 undefined reference

linux - 为什么我在 `ret' 时会出现段错误? (FASM)

assembly - 从软盘读取数据问题

c - C 中的程序流程

c++ - Linux/CUPS 打印示例/教程?

c++ - g++-8 和早期版本之间的奇怪行为

assembly - 在 Commodore 64 上动态更新图 block 数据的更好方法

c# - Objective C 前端 - Java/C# 后端