Gcc Windows中的Fastcall名称装饰不易移植

Gcc Windows中的Fastcall名称装饰不易移植,gcc,mingw,fastcall,Gcc,Mingw,Fastcall,我在Windows中使用mingw以C和汇编语言编译代码,其中有几个函数具有fastcall调用约定(如Microsoft所定义)。如果我在声明中使用uu fastcall,mingw将执行Windows和name所做的操作: 在名称前面加一个at符号(@);参数列表中的at符号后跟字节数(十进制)作为名称的后缀 这个很好用。我在组件中有以下形式的标签: .global @myfunction@4 @myfunction@4: ....code.... 但当我移植到Linux(x86,

我在Windows中使用mingw以C和汇编语言编译代码,其中有几个函数具有fastcall调用约定(如Microsoft所定义)。如果我在声明中使用uu fastcall,mingw将执行Windows和name所做的操作:

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

这个很好用。我在组件中有以下形式的标签:

.global @myfunction@4
@myfunction@4:
    ....code....
但当我移植到Linux(x86,32位)时,这证明了一个大问题。Gcc突然不喜欢uuFastCall(或者说uuCDECL),也根本不喜欢@in标签。我不确定如何统一这两个问题——要么让Linux中的gcc喜欢@,要么让Windows中的mingw不添加@

另外:我可以使用
\uuuuuuuuuuuu属性(\uuuu cdecl\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)
来代替
\uuuuuuucdecl
,但我对它的用途感到困惑。我假设在函数名之前,但我看到人们把它放在声明之后和分号之前。我可以做任何一件事吗?

相关答案:

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

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

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

我明白了——kill at但似乎不起作用:“gcc-Wall-mconsole-Wl,--kill at-o fastest.exe fastest.c fastest asm.s”