GCC手册描述了-fabi-compat-version=n
,它用于处理GCC 3.4至9.2以及以后可能稍有变化的C ++ ABI中C ++名称处理的变化。它有一个重要警告:
在支持强别名的目标上,G ++通过以下方式解决更改问题: 使用以下命令定义符号时,使用正确的名称创建别名 拼写错误的名称。此开关指定要使用的ABI版本 别名。
但是,如何确定您的平台是否确实支持强别名并不是很明显。
答案 0 :(得分:2)
找出答案的简单方法是编写一个小程序,该程序使用__attribute__
创建别名,然后使用nm
查看别名是否存在。这是示例代码,它是经典的“ Hello,World”程序的变体:
/* strong_alias.c
compile with 'gcc strong_alias.c'
run ./a.out to check it works, and then run 'nm ./a.out'
to check that strong_alias() has the same address as main() */
#include <stdio.h>
int main( int argc, char *argv[])
{
printf( "Hello, World\n");
return 0;
}
int strong_alias( int argc, char *argv[]) __attribute__ (( alias ("main")));
编译它并检查它是否运行,然后使用nm strong_alias
查看其符号表。这是在x86-64的CentOS 7上编译的版本:
nm ./a.out | egrep ' (main|strong_alias)'
000000000040052d T main
000000000040052d T strong_alias
我们可以看到main
和strong_alias
具有相同的地址,因此是别名。