c - 汇编程序 .weak 指令仅适用于交叉编译 GCC

标签 c gcc assembly linker weak-references

我有一个用 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/

相关文章:

c - 如果有的话,编译器什么时候会在指针取消引用优化方面保持保守?

c - 为什么我会收到段错误 11?

c++ - 绕行并使用 _thiscall 作为 Hook (GCC 调用约定)

c++ - 链接上 undefined symbol ___gxx_personality_v0

assembly - x86 指令 "call dword ptr ds:[00923030h]"是什么意思?

c - 程序陷入停滞

使用 cl.exe unicode 转换错误进行编译

c++ - 在 C++ 项目中使用共享库的问题

assembly - 如何使用 NASM 在汇编中添加两个 Quad 字?

c - 将变量移动到 cl 并使用内联汇编执行 shr