【问题标题】:How can I compile to assembly with gcc如何使用 gcc 编译为程序集
【发布时间】:2011-12-22 17:46:05
【问题描述】:

如何使用 gcc 编译为程序集而不是可执行文件。我知道有一个 -S 标志,但是我在 makefile 中的什么地方使用它。例如,如果我使用标志 -O3 -o exe_name,我应该将 -S 标志放在哪里?

【问题讨论】:

  • 你的意思是目标文件而不是程序集?

标签: c linux gcc x86


【解决方案1】:

您可以要求 GCC 生成程序集文件,而不是目标文件(或可执行文件)。

例如:

gcc -Wall -c test.c

将从 test.c (test.o) 生成一个目标文件。

gcc -Wall -o test test.c

将从 test.c 中生成一个名为“test”的可执行文件

gcc -Wall -S test.c

将从 test.c (test.s) 生成一个汇编文件

【讨论】:

  • 非常不同意:您对程序集进行编译,然后对目标文件进行assemble。例如,我系统上-S 的文档说Stop after the stage of compilation proper; do not assemble.
  • 你为什么说你不“编译”成汇编?这正是它正在做的事情!编译!机器码又名汇编!编译好后,写成0-1或者字母就行了。
  • 在我看来,编译就是把源代码变成机器码。汇编是源代码,即使非常接近机器代码。
  • @Macmade,编译也可以意味着将高级语言结构转换为低级操作码(顺便说一句,可以在汇编中表示,然后转换为机器码)。您的里程可能会有所不同(特别是对于像 C# 这样的“托管”语言,它先编译为 CIL,然后编译为机器代码)。
  • @Pacerier 是的,所以?
【解决方案2】:

几乎可以放在任何地方。

gcc -O3 -S -o output.asm ...

将生成的程序集存储在output.asm

【讨论】:

  • 默认情况下-S 写类似filename.s 所以我认为-o 参数是不必要的
  • 正确,只需要选择输出文件的名称即可。
【解决方案3】:

我建议也使用-fverbose-asm,因为生成的汇编程序有一些生成的 cmets 可以“解释”代码。例如:

gcc -S -fverbose-asm -O2 foo.c

将在foo.s(带有一些cmets)中生成通过编译foo.c产生的汇编代码

要了解 GCC 优化的作用,甚至可以尝试 -fdump-tree-all(但这会产生 数百 个文件!)。

【讨论】:

猜你喜欢
  • 2012-02-13
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多