我有一个用 2 个不同的编译器编译的程序:
GCC 3.4.4 PowerPC 交叉编译器
GCC 4.8.1 MinGW 编译器
在程序中,我使用了汇编程序指令 .weak
。文档说:
使具有弱绑定(bind)的符号对链接器全局可见。
所以我是这样的:
__asm__(".weak " "foo" "\n.set " "foo" "," "dummy_foo" "\n");
清除 foo
weak 并给它一个 dummy_foo
的别名。
当我为 PowerPC 交叉编译时,这段代码在 GCC 3.4.4 下工作正常,但当我为 x86 目标编译时它不适用于 GCC 4.8.1。 - 代码编译,但 foo
未声明为 weak
并且我的链接器给了我一个 undefined reference 。这里有什么问题?
//编辑:
正如 BSH 所建议的,它必须是:
__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");
如果我将此行放入与我的 foo()
声明相同的 C 文件中,它就可以正常工作。当我把它放在一个单独的 C 文件中时,问题仍然存在(然后它适用于 GCC 3.4.4 交叉编译器,但不适用于 GCC 4.8.1)
最佳答案
在MinGW中,符号以下划线为前缀,_foo
,需要改成:
__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");
或考虑使用 attribute __attribute__((weak, alias("dummy_foo")))
改为 foo
。
关于c - 汇编程序 .weak 指令仅适用于交叉编译 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765335/