如何确定我的 linux 平台是否支持强别名?
How do I find out if my linux platform supports strong aliases?
GCC 手册描述了 -fabi-compat-version=n
,它用于处理 GCC 3.4 到 9.2 以及可能更高版本的略有变化的 C++ ABI 中 C++ 名称重整的变化。它有一个重要的警告:
On targets that support strong aliases, G++ works around mangling changes by
creating an alias with the correct mangled name when defining a symbol with
an incorrect mangled name. This switch specifies which ABI version to use for
the alias.
但是,如何确定您的平台是否支持强别名并不是很明显。
找出别名的简单方法是编写一个小程序,使用 __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
查看它的符号table。这是在 CentOS 7 上为 x86-64 编译的版本:
nm ./a.out | egrep ' (main|strong_alias)'
000000000040052d T main
000000000040052d T strong_alias
我们可以看到main
和strong_alias
有相同的地址,因此是别名。
GCC 手册描述了 -fabi-compat-version=n
,它用于处理 GCC 3.4 到 9.2 以及可能更高版本的略有变化的 C++ ABI 中 C++ 名称重整的变化。它有一个重要的警告:
On targets that support strong aliases, G++ works around mangling changes by creating an alias with the correct mangled name when defining a symbol with an incorrect mangled name. This switch specifies which ABI version to use for the alias.
但是,如何确定您的平台是否支持强别名并不是很明显。
找出别名的简单方法是编写一个小程序,使用 __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
查看它的符号table。这是在 CentOS 7 上为 x86-64 编译的版本:
nm ./a.out | egrep ' (main|strong_alias)'
000000000040052d T main
000000000040052d T strong_alias
我们可以看到main
和strong_alias
有相同的地址,因此是别名。