【问题标题】:Can you explain why gcc -S output something like assemble?你能解释一下为什么 gcc -S 输出类似 assemble 的东西吗?
【发布时间】:2011-02-01 18:45:00
【问题描述】:
$ gcc -S buffer-overflow.c && cat buffer-overflow.s 
_foo: 
        pushl   %ebp           ;2 
        movl    %esp, %ebp     ;3 
        subl    $16, %esp      ;4 
        movl    LC1, %eax      ;5 
        movl    %eax, -4(%ebp) ;6 
        leal    -4(%ebp), %eax ;7 
        leal    8(%eax), %edx  ;8 
        movl    $_bad, %eax    ;9 
        movl    %eax, (%edx)   ;10 
        leave 
        ret 

_main: 
    ... 
        call    _foo            ;1 
    ... 

帮助信息说它不应该编译也不汇编:

 -S                       Compile only; do not assemble or link

为什么它们是矛盾的?

【问题讨论】:

  • 汇编实际上只是将机器码从文本形式转换为二进制形式。
  • 人们总是采用口头捷径,不同的人以不同的方式使用术语。特别是 gcc 文档对于“compile”、“assemble”和“link”有它们的含义;并且这些术语中的每一个都可以隐藏输入的几个单独的传递和转换。试图强加你从其他来源获得的定义是愚蠢和徒劳的。现在是学习处理自然语言歧义的好时机。

标签: gcc switch-statement


【解决方案1】:

compilinglinking 概念的一个很好的解释是 here

另外,请参阅SO thread(编译和链接之间的区别)。

【讨论】:

  • 它说“编译是将源代码转换为目标代码的行为。”,但实际上这里不是这样。或者当我们说编译时,我们实际上是指编译和汇编?
  • @Mask:来自 Wikipedia(en.wikipedia.org/wiki/Compiler):“编译器是将用计算机语言(源语言)编写的源代码转换为另一种计算机语言的东西。”所以编译+组装=编译:)
【解决方案2】:

这是由于同根的“汇编”语言(又称汇编程序)和代码的“汇编”(“-S”帮助所指的过程)的差异。

【讨论】:

    【解决方案3】:

    assemble表示将compile阶段的结果翻译,link表示将gcc不同执行阶段的结果组合成一个可执行文件或库。

    compile 阶段获取预处理阶段的结果,并大致生成汇编代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多