c - 是否可以更改 x64 的 gcc 中的调用约定?

标签 c gcc compilation clang calling-convention

我正在编写一个 C 程序,在其中拦截由指针调用的函数的参数,然后更改它们并将调用转发到实际函数,并且此转发是在汇编中完成的。我知道当编译到 x86 时,可以使用 attribute((stdcall)) 在每个函数的基础上标记调用约定,所以我需要知道两件事:

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

如果其他编译器支持这一点而 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 。请注意,foo1ptr1 根据 MS 约定在 ecxedx 中传递参数,而 foo2ptr2 按照 SysV 使用 ediesi

clang 的行为相同。

关于c - 是否可以更改 x64 的 gcc 中的调用约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69869519/

相关文章:

c - 有没有办法在读取文本文件后删除第一个字符?

c - 在 C 中对 char 输入使用 malloc

c - C 中的游程解码

c++ - Void 类型函数不打印出结构成员变量

linux - 选择linux上两个版本的gcc作为非管理员

c - 使用 PPC 程序集引用其他文件中的符号

java - 为什么在 Linux 中从命令行运行 Java 类文件时会出现 NoClassDefFoundError?

java - 如何使用泛型(java)在编译时检测类差异

c - libc、newlib 和 uclibc 接口(interface)之间有区别吗?

c++ - mingw64-gcc 上的可变参数可能存在错误