汇编文件:.a .s .asm的区别是什么?

37
在MIPS模拟器“QTSpim”中,接受三种类型的文件:
  • .a
  • .s
  • .asm
这些文件类型有什么区别,如果有,是什么?
1个回答

52
在Unix/Linux系统中:
  • .a 是静态库的通常扩展名(多个.o文件的归档,使用ar(1)制作)。动态库,也称为共享对象,使用.so
  • .s 用于asm编译器输出。 (gcc -S foo.c将生成asm输出,默认文件名为foo.s
  • .S 用于手写的asm源文件gcc -c foo.S将其通过C预处理器(因此您可以使用#include<>#if#define和C样式注释)。一些C头文件,如asm/unistd.h仅有#define,因此可以在.S中包含这些文件,以获取类似于__NR_write系统调用号的定义,例如。

在x86中,有两个独立的汇编语法版本:AT&T(由Unix编译器如gcc使用)和Intel/NASM(带有一些方言,如MASM vs. NASM自身)。

.S适用于GNU as语法的asm,无论是否使用任何C预处理器功能。

在x86中,.asm更常与Intel语法NASM/YASM或MASM源代码相关联。在x86之外,如果它使用不同于GNU as的指令,则这可能是一个良好的选择来汇编源文件。

glibc源代码树将所有asm源文件均使用.S


具有gcc背景的人可能会将其MIPS asm放入.S.s文件中,而具有更多NASM/YASM经验(或Windows)的人可能会选择.asm

我建议不要使用.s文件,因为很容易通过gcc -S foo.c意外覆盖它。


1
.s 是后端生成的汇编代码,也就是编译器生成的汇编代码。实际手写汇编程序的传统 Unix 文件扩展名是大写的 .S。由于大多数编译器不会默认生成文本格式的汇编代码,因此 .S 更适用于与 .asm 进行比较。 - Marco van de Voort
2
实际上,.a 是由 ranlib 生成的库/归档文件的名称。从我25年前的记忆中得知,它实际上是指“归档文件”。 - David Hoelzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接