[llvm-dev] Gold Linker and Weak Functions

Peter Collingbourne via llvm-dev llvm-dev at lists.llvm.org
Fri Oct 19 12:59:28 PDT 2018


This may be a gold bug. I know that there was a bug in some versions of
gold that caused the wrong symbol binding and/or visibility to appear in
the output file. This bug also ended up manifesting as gold plugin test
failures. Does the problem go away if you use a very recent (git master)
version of gold?

Peter

On Thu, Sep 27, 2018 at 3:28 PM Bill Wendling <isanbard at gmail.com> wrote:

> It appears as if the gold linker doesn't resolve weak functions to the
> strong definition with regular LTO (ThinLTO seems to work).
>
> weak.c:
> #define __init __attribute__ ((__section__(".init.text")))
> #define __weak __attribute__ ((weak))
>
> int __init __weak early_irq_init(void)
> {
> return 0;
> }
>
> strong.c:
> #define __init __attribute__ ((__section__(".init.text")))
>
> extern int arch_early_irq_init(void);
>
> int __init early_irq_init(void)
> {
> return arch_early_irq_init();
> }
>
> Compiled like so:
>
>   clang -flto -c weak.c
>   clang -flto -c strong.c
>
> Linked:
>
>   ld.gold -plugin llvm-r337625.install/lib/LLVMgold.so -r -o bad.o weak.o
> strong.o
>
> The resulting object file has a weak reference to "early_irq_init":
>
>   $ nm bad.o
>   0000000000000000 W early_irq_init
>   $ objdump -d bad.o
>
>   bad.o:     file format elf64-x86-64
>
>
>   Disassembly of section .init.text:
>
>   0000000000000000 <early_irq_init>:
>      0: 55                    push   %rbp
>      1: 48 89 e5              mov    %rsp,%rbp
>      4: 31 c0                xor    %eax,%eax
>      6: 5d                    pop    %rbp
>      7: c3                    retq
>
> I've been combing through the gold linker code, but I haven't found the
> correct set of attributes to get it to work. Note that if I change the weak
> symbol to a symbol *reference* then everything links correctly.
>
> -bw
>


-- 
-- 
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181019/f97e4d82/attachment.html>


More information about the llvm-dev mailing list