[all-commits] [llvm/llvm-project] 6b0eb5: [ELF] Improve --gc-sections compatibility with GNU...

Fangrui Song via All-commits all-commits at lists.llvm.org
Tue Nov 19 08:56:20 PST 2019


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 6b0eb5a6727590472e2e9cbf65fa2d7c3a18d2b5
      https://github.com/llvm/llvm-project/commit/6b0eb5a6727590472e2e9cbf65fa2d7c3a18d2b5
  Author: Fangrui Song <maskray at google.com>
  Date:   2019-11-19 (Tue, 19 Nov 2019)

  Changed paths:
    M lld/ELF/InputFiles.cpp
    M lld/ELF/InputSection.h
    M lld/ELF/MarkLive.cpp
    A lld/test/ELF/gc-sections-group.s
    A lld/test/ELF/linkerscript/discard-group.s

  Log Message:
  -----------
  [ELF] Improve --gc-sections compatibility with GNU ld regarding section groups

Based on D70020 by serge-sans-paille.

The ELF spec says:

> Furthermore, there may be internal references among these sections that would not make sense if one of the sections were removed or replaced by a duplicate from another object. Therefore, such groups must be included or omitted from the linked object as a unit. A section cannot be a member of more than one group.

GNU ld has 2 behaviors that we don't have:

- Group members (nextInSectionGroup != nullptr) are subject to garbage collection.
  This includes non-SHF_ALLOC SHT_NOTE sections.
  In particular, discarding non-SHF_ALLOC SHT_NOTE sections is an expected behavior by the Annobin
  project. See
  https://developers.redhat.com/blog/2018/02/20/annobin-storing-information-binaries/
  for more information.
- Groups members are retained or discarded as a unit.
  Members may have internal references that are not expressed as
  SHF_LINK_ORDER, relocations, etc. It seems that we should be more conservative here:
  if a section is marked live, mark all the other member within the
  group.

Both behaviors are reasonable. This patch implements them.

A new field InputSectionBase::nextInSectionGroup tracks the next member
within a group. on ELF64, this increases sizeof(InputSectionBase) froms
144 to 152.

InputSectionBase::dependentSections tracks section dependencies, which
is used by both --gc-sections and /DISCARD/. We can't overload it for
the "next member" semantic, because we should allow /DISCARD/ to discard
sections independent of --gc-sections (GNU ld behavior). This behavior
may be reasonably used by `/DISCARD/ : { *(.ARM.exidx*) }` or `/DISCARD/
: { *(.note*) }` (new test `linkerscript/discard-group.s`).

Reviewed By: ruiu

Differential Revision: https://reviews.llvm.org/D70146




More information about the All-commits mailing list