我在Windows中使用mingw来编译C语言和程序集中的代码,其中有几个函数具有fastcall调用约定(正如Microsoft定义的那样)。如果我在声明中使用__fastcall,mingw会执行Windows的操作并命名装饰:
at符号(@)以名称为前缀;一个符号后跟参数列表中的字节数(十进制)后缀为名称
这很好用。我在组装中有标签:
.global @myfunction@4
@myfunction@4:
....code....
但是当我移植到Linux(x86,32位)时,这证明是一个大问题。 Gcc突然不喜欢__fastcall(或者__cdecl)并且根本不喜欢@在标签中。我不确定如何统一这两个问题 - 要么在Linux中使用gcc来喜欢@,要么在Windows中获取mingw以不添加@。
另外:我可以使用__attribute__(__cdecl__)
代替__cdecl
,但我对它的去向感到困惑。我假设在函数名称之前,但我看到人们在声明之后和分号之前放置它。我能做到吗?
答案 0 :(得分:1)
相关答案:Adding leading underscores to assembly symbols with GCC on Win32?
在同一平台上操作系统,平台甚至处理器之间移植时,名称修饰似乎是一个常见主题(例如IA32到IA64丢失了下划线)。
我解决这个问题的方法是从所有使用它的函数中删除@装饰,因为除了测试之外我不需要导出它们。其他函数使用宏从函数重新定义为_function(这就是宏汇编程序的用途)。
在这种情况下,我将汇编代码从.s重命名为.sx(Windows平台),并使用gcc预处理器检查_WIN32,从而重新定义导出全局符号以具有前导下划线。对_calloc和_free的调用也一样。