是什么让调用约定不同?

What makes the calling convention different?

据我所知,调用约定取决于平台是 Windows 还是 Linux。

我想知道,

  1. 编译器使调用约定不同。
  2. 平台使调用约定不同。

哪个是真的? 如果只有 2 为真,调用约定是否由平台定义,编译器是否仅遵循定义的约定?

平台通常定义一个或多个“标准”调用约定。如果编译器想要使用这些约定与平台上的其他工具或组件进行互操作,则需要遵循这些约定,但可以在内部使用它们自己的不同调用约定。

唯一真正的要求是任何调用者和被调用者都需要就它们之间的调用约定达成一致。

相关:Why does Windows64 use a different calling convention from all other OSes on x86-64?讲调用约定是谁定义的

在那种情况下,GCC 开发人员有效地代表整个平台决定了 x86-64 System V ABI。

显然,编译器开发人员是最有可能设计出好的编译器的人,但是一旦设置好,其他制作新编译器的人如果想要兼容就必须遵循它。

所有 non-Windows 操作系统选择遵循相同的 x86-64 System V 调用约定,因为它设计得非常好,因此它涵盖的平台集增长到包括所有 non-Windows 操作系统。部分原因是他们都使用 GCC 和 GCC-compatible 编译器。这不像不同编译器的开发人员聚集在一起就他们都遵循该平台的调用约定达成一致,当时(2000 年代初)只有一个主要的免费 non-Windows C 编译器。