如何确定我的linux平台是否支持强别名? > GCC手册描述了- Fabi-CopaTealValueN/Cuth>,它用于处理GCC 3.4到9.2的稍有变化的C++ ABI中的C++名称篡改的变化,并且可能稍后。它有一个重要的警告:
在支持强别名的目标上,G++通过 使用定义符号时使用正确的名称创建别名 错误的名称。此开关指定要用于的ABI版本 别名如何确定我的linux平台是否支持强别名? > GCC手册描述了- Fabi-CopaTealValueN/Cuth>,它用于处理GCC 3.4到9.2的稍有变化的C++ ABI中的C++名称篡改的变化,并且可能稍后。它有一个重要的警告:,linux,gcc,linker,alias,abi,Linux,Gcc,Linker,Alias,Abi,在支持强别名的目标上,G++通过 使用定义符号时使用正确的名称创建别名 错误的名称。此开关指定要用于的ABI版本 别名 但是,如何确定您的平台是否支持强别名,目前还不清楚 最简单的方法是编写一个小程序,使用\uuuu attribute\uuuu创建别名,然后使用nm查看别名是否存在。下面是示例代码,它是经典“Hello,World”程序的变体: /* strong_alias.c compile with 'gcc strong_alias.c' run ./a.out to c
但是,如何确定您的平台是否支持强别名,目前还不清楚 最简单的方法是编写一个小程序,使用
\uuuu attribute\uuuu
创建别名,然后使用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")));
我们可以看到,
main
和strong\u alias
具有相同的地址,因此是别名 +1获得完整的答案。但这有点糟糕,因为前处理器应该能够完成这项工作,而不需要像Autotools这样的东西来解决。@jww Autotools?使用命令行和编辑器做这种事情不是更容易吗?我就是这样做的:唯一不平凡的部分是理解\uuuu属性\uuuu
语法。您如何以源代码形式分发程序,并使其在不同的平台和编译器上正确运行?您肯定不是要求用户手动执行此类操作,然后在CFLAGS
和cxflags
中设置定义。啊,现在我同意您的看法。
nm ./a.out | egrep ' (main|strong_alias)'
000000000040052d T main
000000000040052d T strong_alias