【问题标题】:Assembler .weak directive does only work with Cross Compile GCCAssembler .weak 指令仅适用于 Cross Compile GCC
【发布时间】:2013-11-04 10:02:19
【问题描述】:

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

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

【问题讨论】:

    标签: c gcc assembly linker weak-references


    【解决方案1】:

    在MinGW中,符号前加下划线,_foo,需要改成:

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

    或考虑将attribute __attribute__((weak, alias("dummy_foo")))foo 一起使用。

    【讨论】:

    • 好的,我错过了前面 _ for MinGW 的东西 - 不幸的是,这并不能解决问题。如果我将__asm__ 指令与foo() 的声明放在同一个文件中,则它可以工作-但是当我将__asm__ 指令放在单独的C 文件中时,它仅适用于GCC 3.4.4 交叉编译器而不是对于我的 GCC 4.8.1 。这也是我不使用attribute的原因,因为我想在另一个C文件中将函数声明为weak
    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2016-12-29
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多