gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com