[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