【问题标题】:Is it possible to change calling convention in gcc for x64?是否可以为 x64 更改 gcc 中的调用约定?
【发布时间】:2021-12-20 11:15:55
【问题描述】:

我正在编写一个 C 程序,在该程序中,我在更改参数并将调用转发给实际函数之前截取指针调用的函数的参数,并且这种转发是在汇编中完成的。我知道在编译到 x86 时,可以使用 attribute((stdcall)) 在每个函数的基础上标记调用约定,所以我需要知道两件事:

  1. 是否可以更改 gcc 在 x64 模式下使用的调用约定,还是仅在 32 位程序中可用?
  2. 如果可能,是否可以将这些注释或类似注释应用于函数指针,以便确保正确调用函数?

如果其他编译器支持而 gcc 不支持,我愿意使用它们。

【问题讨论】:

    标签: c gcc compilation clang calling-convention


    【解决方案1】:

    GCC 在 x86-64 上支持两种调用约定:大多数类 Unix 系统上使用的 System V ABI 约定和 Windows 上使用的 Microsoft x64 约定。您可以使用__attribute__((ms_abi))__attribute__((sysv_abi)) 为函数选择一个特定的函数。这些属性也可以应用于函数指针。见https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc/x86-Function-Attributes.html#x86-Function-Attributes

    Try on godbolt。请注意,foo1ptr1 的参数按照 MS 约定在 ecxedx 中传递,而 foo2ptr2 按照 SysV 使用 ediesi

    clang 的行为相同。

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 1970-01-01
      • 2020-02-27
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多