[llvm-dev] Gold Linker and Weak Functions

Bill Wendling via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 27 15:28:22 PDT 2018


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180927/542941c8/attachment.html>


More information about the llvm-dev mailing list