【问题标题】:Weak linkage with inline assembly与内联汇编的链接较弱
【发布时间】:2018-12-03 09:09:20
【问题描述】:

我正在尝试将ELF 格式的weak 符号属性与内联汇编一起使用。当我尝试使用.weak 汇编指令时,汇编输出包含.weak.global 指令。

foo.c

__asm(".weak foo");
void foo(void)
{
    /* EMPTY FUNCTION! */
}

foo.s

#APP
    .weak foo
#NO_APP
    .global foo

代码运行良好;但是在这种情况下,当链接器看到符号既是全局的又是弱的时,会不会引起任何问题?

【问题讨论】:

    标签: c gcc elf inline-assembly


    【解决方案1】:

    不要使用内联汇编来尝试绕过编译器,使用__attribute__((weak)) 让编译器自己发出.weakgcc function attributes in the docs

    __attribute__((weak))
    void foo(void){
    }
    

    Compiled on the Godbolt compiler explorer with gcc and clang:

        .text
        .intel_syntax noprefix
        .file   "example.cpp"
        .weak   foo()                 # -- Begin function foo()
        .p2align        4, 0x90
        .type   foo(),@function
    foo():                                # @foo()
    .Lfunc_begin0:
            ret
    .Lfunc_end0:
        .size   foo(), .Lfunc_end0-foo()
    

    【讨论】:

    • 我知道__attribute___Pragma 可能是更好的解决方案;但我仍然想知道同时包含 .weak.global 作为符号是否有问题。
    • @kurtfu:我不确定。但是不能保证编译器不会在全局范围内重新排序。不过,我猜.weak foo 不一定要在标签之前,所以没关系。对于 C++,您必须自己手动修改名称。 (在某些平台上,您必须在 ELF/Linux 上使用 .weak _foo.weak foo。不确定这些平台(例如 OS X)中是否有弱符号。)无论如何,关键是属性位于至少与使用 GAS 指令的 GNU C inline-asm 语法一样可移植。
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2018-07-09
    • 2010-12-16
    相关资源
    最近更新 更多