汇编程序.weak指令仅适用于Cross Compile GCC

时间:2013-11-04 10:02:19

标签: c gcc assembly linker weak-references

我有一个程序,我用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)

1 个答案:

答案 0 :(得分:1)

在MinGW中,符号前缀为下划线_foo,您需要将其更改为:

__asm__(".weak " "_foo" "\n.set " "_foo" "," "_dummy_foo" "\n");

或者考虑使用attribute __attribute__((weak, alias("dummy_foo")))代替foo

相关问题