1

我有一个程序,我用 2 个不同的编译器编译:

PowerPC 的 GCC 3.4.4 交叉编译器

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

当我交叉编译 für PowerPC 时,此代码在 GCC 3.4.4 下运行良好,但当我为 x86 目标编译时,它不适用于 GCC 4.8.1。- 代码编译,但foo没有声明weak,我的链接器给了我一个未定义的引用。这里有什么问题?

//编辑:

正如 BSH 建议的那样,它必须是:

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

如果我将此行放入与我的声明相同的 C 文件中,foo()则可以正常工作。当我将它放在单独的 C 文件中时问题仍然存在(然后它适用于 GCC 3.4.4 交叉编译器,但不适用于 GCC 4.8.1 )

4

1 回答 1

1

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

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

或考虑改用with属性__attribute__((weak, alias("dummy_foo")))foo

于 2013-11-04T11:43:05.360 回答