2

我在 Windows 中使用 mingw 编译 C 和汇编代码,其中几个函数具有 fastcall 调用约定(如 Microsoft 定义的那样)。如果我在声明中使用 __fastcall,mingw 会执行 Windows 所做的操作并进行 name 装饰:

名称前有一个 at 符号 (@);参数列表中后跟字节数(十进制)的 at 符号后缀为名称

这工作正常。我有以下形式的装配标签:

.global @myfunction@4
@myfunction@4:
    ....code....

但是当我移植到 Linux(x86,32 位)时,这被证明是一个大问题。Gcc 突然不喜欢 __fastcall (或 __cdecl )并且根本不喜欢标签中的@。我不确定如何统一这两个问题——要么让 Linux 中的 gcc 喜欢 @,要么让 Windows 中的 mingw 不添加 @。

另外:我可以使用__attribute__(__cdecl__)代替,__cdecl但我对它的去向感到困惑。我假设在函数名本身之前,但我看到人们把它放在声明之后和分号之前。我也可以吗?

4

1 回答 1

1

相关答案:在 Win32 上使用 GCC 为汇编符号添加前导下划线?

在同一平台上的操作系统、平台甚至处理器之间移植时,名称修饰似乎是一个常见主题(例如,IA32 到 IA64 丢失了下划线)。

我解决这个问题的方法是从所有使用它的函数中删除 @ 装饰,因为除了测试之外我不需要导出它们。使用宏将其他函数从函数重新定义为 _function(毕竟这就是宏汇编器的用途)。

在这种情况下,我将汇编代码从 .s 重命名为 .sx(Windows 平台),并使用 gcc 预处理器检查 _WIN32,从而将导出全局符号重新定义为具有前导下划线。对 _calloc 和 _free 的调用也是如此。

于 2014-06-24T10:22:40.800 回答