如何确定我的Linux平台是否支持强别名?

时间:2019-09-26 11:49:01

标签: linux gcc linker alias abi

GCC手册描述了-fabi-compat-version=n,它用于处理GCC 3.4至9.2以及以后可能稍有变化的C ++ ABI中C ++名称处理的变化。它有一个重要警告:

  

在支持强别名的目标上,G ++通过以下方式解决更改问题:   使用以下命令定义符号时,使用正确的名称创建别名   拼写错误的名称。此开关指定要使用的ABI版本   别名。

但是,如何确定您的平台是否确实支持强别名并不是很明显。

1 个答案:

答案 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

我们可以看到mainstrong_alias具有相同的地址,因此是别名。