我正在编写一个 C 程序,在其中拦截由指针调用的函数的参数,然后更改它们并将调用转发到实际函数,并且此转发是在汇编中完成的。我知道当编译到 x86 时,可以使用 attribute((stdcall)) 在每个函数的基础上标记调用约定,所以我需要知道两件事:
- 是否可以更改 gcc 在 x64 模式下使用的调用约定,或者仅在 32 位程序中可用?
- 如果可能,是否可以将这些或类似的注释应用于函数指针,以便我可以确保正确调用函数?
如果其他编译器支持这一点而 gcc 不支持,我愿意使用其他编译器。
最佳答案
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 。请注意,foo1
和 ptr1
根据 MS 约定在 ecx
和 edx
中传递参数,而 foo2
和 ptr2
按照 SysV 使用 edi
和 esi
。
clang 的行为相同。
关于c - 是否可以更改 x64 的 gcc 中的调用约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69869519/