[PATCH] D70020: [lld] Better support for group semantic wrt. notes

serge via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 12 13:06:46 PST 2019


serge-sans-paille added a comment.

> I think this approach may have a problem when we consider /DISCARD/ in a linker script. I'll propose an alternative fix which I believe will improve the case and improve the compatibility with GNU ld, in the hope that you won't mind :)

The following patch is a frail tentative at supporting /DISCARD/ in linker script:

  diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
  index cebbd89..1d5c8d7 100644
  --- a/lld/ELF/LinkerScript.cpp
  +++ b/lld/ELF/LinkerScript.cpp
  @@ -442,6 +442,9 @@ LinkerScript::computeInputSections(const InputSectionDescription *cmd) {
   }
   
   void LinkerScript::discard(InputSectionBase *s) {
  +  if(!s->isLive())
  +    return;
  +
     if (s == in.shStrTab || s == mainPart->relaDyn || s == mainPart->relrDyn)
       error("discarding " + s->name + " section is not allowed");
   
  diff --git a/lld/test/ELF/linkerscript/discard-section-group.test b/lld/test/ELF/linkerscript/discard-section-group.test
  new file mode 100644
  index 0000000..e5b090f
  --- /dev/null
  +++ b/lld/test/ELF/linkerscript/discard-section-group.test
  @@ -0,0 +1,47 @@
  +# REQUIRES: x86
  +# RUN: yaml2obj %s -o %t.o
  +#
  +# RUN: echo "SECTIONS { /DISCARD/ : { *(.text.foo*) } }" > %t0.script
  +# RUN: ld.lld -o %t0 --script %t0.script %t.o
  +# RUN: llvm-readobj -S %t0 | FileCheck %s
  +#
  +# RUN: echo "SECTIONS { /DISCARD/ : { *(.text.foo*) } /DISCARD/ : { *(.note*) } }" > %t1.script
  +# RUN: ld.lld -o %t1 --script %t1.script %t.o
  +# RUN: llvm-readobj -S %t1 | FileCheck %s
  +#
  +# RUN: echo "SECTIONS { /DISCARD/ : { *(.note*) } }" > %t2.script
  +# RUN: ld.lld -o %t2 --script %t2.script %t.o
  +# RUN: llvm-readobj -S %t2 | FileCheck %s
  +
  +# CHECK-NOT: .text
  +# CHECK-NOT: .note
  +
  +--- !ELF
  +FileHeader:
  +  Class:           ELFCLASS64
  +  Data:            ELFDATA2LSB
  +  Type:            ET_REL
  +  Machine:         EM_X86_64
  +Sections:
  +  - Name:            .group
  +    Type:            SHT_GROUP
  +    Link:            .symtab
  +    Info:            foo
  +    Members:
  +      - SectionOrType:    GRP_COMDAT
  +      - SectionOrType:    .text.foo
  +      - SectionOrType:    .note.text.foo
  +  - Name:            .note.text.foo
  +    Type:            SHT_NOTE
  +    Flags:           [ SHF_GROUP ]
  +    Content:         "DEAD"
  +  - Name:            .text.foo
  +    Type:            SHT_PROGBITS
  +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
  +    Content:         "00"
  +Symbols:
  +  - Name:            foo
  +    Binding:         STB_GLOBAL
  +    Type:            STT_FUNC
  +    Section:         .text.foo
  +    Size:            0x08

So at first glance it looks possible to apply a patch on top of this one to support /DISCARD/, and I'd be happier if we can do it that way rather than discard this review.

That being said, if you're alternative fix improves the case, let's put ego aside and go that way :-)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70020/new/

https://reviews.llvm.org/D70020





More information about the llvm-commits mailing list