[all-commits] [llvm/llvm-project] 0fbf28: [ELF] --no-dynamic-linker: don't emit undefined we...

Fangrui Song via All-commits all-commits at lists.llvm.org
Thu Jan 23 12:25:21 PST 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 0fbf28f7aae0ceb70071cac56de345e3ff04439c
      https://github.com/llvm/llvm-project/commit/0fbf28f7aae0ceb70071cac56de345e3ff04439c
  Author: Fangrui Song <maskray at google.com>
  Date:   2020-01-23 (Thu, 23 Jan 2020)

  Changed paths:
    M lld/ELF/Config.h
    M lld/ELF/Driver.cpp
    M lld/ELF/Symbols.cpp
    A lld/test/ELF/weak-undef-no-dynamic-linker.s

  Log Message:
  -----------
  [ELF] --no-dynamic-linker: don't emit undefined weak symbols to .dynsym

I felt really sad to push this commit for my selfish purpose to make
glibc -static-pie build with lld. Some code constructs in glibc require
R_X86_64_GOTPCREL/R_X86_64_REX_GOTPCRELX referencing undefined weak to
be resolved to a GOT entry not relocated by R_X86_64_GLOB_DAT (GNU ld
behavior), e.g.

csu/libc-start.c
  if (__pthread_initialize_minimal != NULL)
    __pthread_initialize_minimal ();

elf/dl-object.c
  void
  _dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
  {
    /* We modify the list of loaded objects.  */
    __rtld_lock_lock_recursive (GL(dl_load_write_lock));

Emitting a GLOB_DAT will make the address equal &__ehdr_start (true
value) and cause elf/ldconfig to segfault. glibc really should move away
from weak references, which do not have defined semantics.

Temporarily special case --no-dynamic-linker.




More information about the All-commits mailing list