【问题标题】:What are the differences between compiling assembly using gcc and as使用 gcc 和 as 编译程序集有什么区别
【发布时间】:2019-07-03 02:49:46
【问题描述】:

我正在学习如何使用汇编语言(顺便在 Raspberry Pi 上),我想知道使用 gccas 进行编译之间有什么区别。

到目前为止,我注意到的差异是:

  • 我应该使用as 进行额外的链接步骤。
  • 在 Raspberry Pi 上,as 似乎比 gcc 本身更能识别架构。我必须先告诉gcc 架构,然后才能使用整数除法等指令。
  • 使用gcc,我可以轻松访问C 标准库函数。我认为使用as 可以做到这一点,但我还没有弄清楚。

我想坚持使用特定的编译器。我应该注意哪些其他差异。使用其中任何一种都有优点/缺点吗?

【问题讨论】:

    标签: gcc assembly raspberry-pi gnu-assembler


    【解决方案1】:

    gcc 只是一个运行as 的前端(以及ld,除非您使用-c 停止在目标文件处而不进行链接)。使用gcc -v 查看它运行了什么以及它传递了哪些命令行选项。

    如果要链接库,一般使用gcc。它知道传递给ld 以设置库路径的正确命令行选项,以及将内容放入ld 命令行的顺序。

    您可能会发现 gcc -nostdlib-nostartfiles 很有用,例如如果您想编写自己的 _start 但仍要链接库。还有-no-pie 和/或-static,具体取决于您要如何链接。


    如果您想了解有关工具链和链接的更多信息,请务必使用ld 选项,看看更改选项时会出现什么问题。和/或使用readelf -a 检查生成的可执行文件。

    【讨论】:

    • Here 是有关gccld 之间链接差异的一些更详细信息。也许有帮助。
    【解决方案2】:

    您也可以在汇编中访问 C 标准库函数。只需遵循GCC calling convention 并使用标准printf call。 你必须先用as 编译你的汇编程序来创建一个目标文件。之后,您可以使用链接器链接所有必需的库(例如stdio)。

    【讨论】:

    • stdio 函数是标准 C 库的一部分。在像 RPi 这样的 GNU/Linux 系统上,库是 libc.sold 的链接选项是 -lc
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2017-02-11
    • 2010-10-14
    • 2011-08-16
    相关资源
    最近更新 更多