使用选项-c直接调用汇编程序和调用编译器之间的区别

时间:2017-07-13 11:56:24

标签: gcc assembly gas

我有一些.s汇编代码在C中汇编。我想要.o目标文件。我找到了两种获取.o文件的方法。

第一个是使用编译器并在汇编后停止(使用-c选项):

.\HightecInstall\bin\ppc-vle-gcc -Wa,--gdwarf-2 -DDEFAULT -fno-inline -c -o sample.o sample.s

第二种是直接调用汇编程序:

.\HightecInstall\bin\ppc-vle-as --gdwarf-2 -DDEFAULT -fno-inline -o sample.o sample.s

由于直接调用汇编程序,我认为“-Wa”不是必需的。但第二个不起作用。它给了我“无法识别的选项-EFAULT”等错误。

如果我想将.s文件转换为.o文件,是否有人知道直接调用汇编程序-as与使用-c选项编译器之间的区别?感谢。

2 个答案:

答案 0 :(得分:1)

原始汇编器是一种非常原始的工具,因此它不支持常规的GCC标志(-D-f等)。它的命令行语法在不同平台上也会发生变化,因此通常建议使用gcc来汇编.s文件(类似于我们通常使用gcc进行链接而不是调用{{1} })。

答案 1 :(得分:0)

-D被GNU汇编程序默默地忽略为非选项参数

  

http://man7.org/linux/man-pages/man1/as.1.html

     

-D被忽略。接受此选项是为了与脚本兼容              调用其他汇编程序。

因此-DDEFAULT的解析与-D -D -EFAULT基本上相同。没有-E或-EF选项,因此您会收到错误消息。


即使使用gcc,您的文件也有一个.s后缀(不是.S),因此gcc不会通过C预处理程序运行它。因此-DDEFAULT无效。像-fno-inline这样的C到asm代码生成选项也没有。

-gdwarf-2对于GAS直接或通过gcc调用具有类似的效果。但是,当传递给汇编器时,它会生成调试信息以用于asm的源代码级调试 。即每个asm源代码行的源代码行信息,映射到/来自机器代码地址。

我不确定通过gcc运行汇编程序时会发生什么。如果您是从使用.s运行的C编译器获得的,则用于发出调试信息的汇编程序指令已经存在于-g中。