使用gcc和as编译汇编之间有什么区别

时间:2019-07-03 02:49:46

标签: gcc assembly raspberry-pi gas

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

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

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

我想坚持使用特定的编译器。我应该知道还有什么其他区别。使用这两种方法都有优点/缺点吗?

2 个答案:

答案 0 :(得分:7)

gcc只是运行as(和ld的前端,除非您使用-c停在目标文件中而不进行链接)。使用gcc -v查看其运行以及传递的命令行选项。

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

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


如果您想了解有关工具链和链接的更多信息,请确保使用ld选项,并查看更改选项后会遇到的问题。和/或使用readelf -a检查生成的可执行文件。

答案 1 :(得分:1)

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