[PATCH] D78389: [ELF] Keep local symbols when both --emit-relocs and --discard-all are specified

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 17 11:20:31 PDT 2020


MaskRay created this revision.
MaskRay added reviewers: grimar, ikudrin, ruiu.
Herald added subscribers: llvm-commits, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.

This fixes a bug as exposed by D77807 <https://reviews.llvm.org/D77807>.

Add tests for {--emit-relocs,-r} x {--discard-locals,--discard-all} x {--no-gc-sections,--gc-sections}


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D78389

Files:
  lld/ELF/Writer.cpp
  lld/test/ELF/emit-relocs-discard-locals.s


Index: lld/test/ELF/emit-relocs-discard-locals.s
===================================================================
--- /dev/null
+++ lld/test/ELF/emit-relocs-discard-locals.s
@@ -0,0 +1,51 @@
+# REQUIRES: x86
+## Test that --emit-relocs keeps local symbols and overrids --discard-{locals,all}.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 -save-temp-labels %s -o %t.o
+
+# RUN: ld.lld --emit-relocs --discard-locals %t.o -o %tlocal
+# RUN: llvm-nm %tlocal | FileCheck --check-prefixes=NM,NM_NOGC %s
+# RUN: llvm-readobj -r %tlocal | FileCheck --check-prefix=REL %s
+# RUN: ld.lld --emit-relocs --discard-locals --gc-sections %t.o -o %tlocal.gc
+# RUN: llvm-nm %tlocal.gc | FileCheck --check-prefix=NM %s
+# RUN: llvm-readobj -r %tlocal | FileCheck --check-prefix=REL %s
+
+# RUN: ld.lld --emit-relocs --discard-all %t.o -o %tall
+# RUN: llvm-nm %tall | FileCheck --check-prefixes=NM,NM_NOGC %s
+# RUN: llvm-readobj -r %tall | FileCheck --check-prefix=REL %s
+
+## -r keeps symbols and relocations similar to --emit-relocs.
+# RUN: ld.lld -r --discard-locals %t.o -o %tlocal.ro
+# RUN: llvm-nm %tlocal.ro | FileCheck --check-prefixes=NM,NM_NOGC %s
+# RUN: llvm-readobj -r %tlocal.ro | FileCheck --check-prefix=REL %s
+
+# RUN: ld.lld -r --discard-all %t.o -o %tall.ro
+# RUN: llvm-nm %tall.ro | FileCheck --check-prefixes=NM,NM_NOGC %s
+# RUN: llvm-readobj -r %tall.ro | FileCheck --check-prefix=REL %s
+
+# NM:           t .Lunused
+# NM_NOGC-NEXT: t .Lunused_gc
+# NM-NEXT:      t .Lused
+# NM-NEXT:      T _start
+# NM-NEXT:      t unused
+# NM_NOGC-NEXT: t unused_gc
+# NM-NEXT:      t used
+
+# REL:      .rela.text {
+# REL-NEXT:   R_X86_64_PLT32 .Lused 0xFFFFFFFFFFFFFFFC
+# REL-NEXT:   R_X86_64_PLT32 used 0xFFFFFFFFFFFFFFFC
+# REL-NEXT: }
+
+.globl _start
+_start:
+  jmp .Lused at plt
+  call used at plt
+
+.Lunused:
+.Lused:
+unused:
+used:
+
+.section unreferenced,"ax"
+.Lunused_gc:
+unused_gc:
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -560,8 +560,7 @@
 
 // The main function of the writer.
 template <class ELFT> void Writer<ELFT>::run() {
-  if (config->discard != DiscardPolicy::All)
-    copyLocalSymbols();
+  copyLocalSymbols();
 
   if (config->copyRelocs)
     addSectionSymbols();
@@ -650,6 +649,9 @@
   if (config->emitRelocs)
     return true;
 
+  if (config->discard == DiscardPolicy::All)
+    return false;
+
   // In ELF assembly .L symbols are normally discarded by the assembler.
   // If the assembler fails to do so, the linker discards them if
   // * --discard-locals is used.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78389.258376.patch
Type: text/x-patch
Size: 2613 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200417/9a999ad2/attachment.bin>


More information about the llvm-commits mailing list