我有一些.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选项编译器之间的区别?感谢。
博
答案 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
中。