我有一个程序,我用2个不同的编译器编译:
GCC 3.4.4 PowerPC交叉编译器
GCC 4.8.1 MinGW编译器
在程序中我正在使用汇编程序指令.weak
。文档说:
Makes a symbol with weak binding globally visible to the linker.
所以我想这样:
__asm__(".weak " "foo" "\n.set " "foo" "," "dummy_foo" "\n");
清除foo
弱者,并为dummy_foo
添加别名。
当我在PowerPC上交叉编译时,这个代码在GCC 3.4.4下工作正常,但是当我为x86目标编译时它不适用于GCC 4.8.1。 - 代码编译,但foo
未声明weak
,我的链接器给我一个未定义的引用。这有什么问题?
//编辑:
正如BSH建议的那样,它必须是:
__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");
如果我将此行放入与foo()
声明相同的C-File中,则可以正常工作。当我把它放在一个单独的C文件中时,问题仍然存在(然后它适用于GCC 3.4.4交叉编译器,但不适用于GCC 4.8.1)
答案 0 :(得分:1)
在MinGW中,符号前缀为下划线_foo
,您需要将其更改为:
__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");
或者考虑使用attribute __attribute__((weak, alias("dummy_foo")))
代替foo
。