[PATCH] D54624: [LLD][ELF] Error if _GLOBAL_OFFSET_TABLE_ is defined in input objects
Peter Smith via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 16 06:11:58 PST 2018
peter.smith updated this revision to Diff 174363.
peter.smith added a comment.
I've updated the patch to inline the call for _GLOBAL_OFFSET_TABLE_ so that addOptionalRegular remains unchanged. The cast to defined can be removed if/when https://reviews.llvm.org/D54627 lands.
https://reviews.llvm.org/D54624
Files:
ELF/Writer.cpp
test/ELF/global-offset-table-position-redef-err.s
Index: test/ELF/global-offset-table-position-redef-err.s
===================================================================
--- /dev/null
+++ test/ELF/global-offset-table-position-redef-err.s
@@ -0,0 +1,13 @@
+# REQUIRES x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s
+
+# On some targets the location of the _GLOBAL_OFFSET_TABLE_ symbol table can
+# matter for the correctness of some relocations. Follow the example of ld.gold
+# and give a multiple definition error if input objects attempt to redefine it.
+
+# CHECK: ld.lld: error: duplicate symbol: _GLOBAL_OFFSET_TABLE_
+.data
+.global _GLOBAL_OFFSET_TABLE_
+_GLOBAL_OFFSET_TABLE_:
+.word 0
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -213,9 +213,15 @@
// _GLOBAL_OFFSET_TABLE_ and _SDA_BASE_ from the 32-bit ABI. It is used to
// represent the TOC base which is offset by 0x8000 bytes from the start of
// the .got section.
- ElfSym::GlobalOffsetTable = addOptionalRegular(
- (Config->EMachine == EM_PPC64) ? ".TOC." : "_GLOBAL_OFFSET_TABLE_",
- Out::ElfHeader, Target->GotBaseSymOff);
+ // We do not allow _GLOBAL_OFFSET_TABLE_ to be defined by input objects as the
+ // correctness of some relocations depends on its value.
+ StringRef GotTableSymName =
+ (Config->EMachine == EM_PPC64) ? ".TOC." : "_GLOBAL_OFFSET_TABLE_";
+ if (Symtab->find(GotTableSymName))
+ ElfSym::GlobalOffsetTable = cast<Defined>(Symtab->addDefined(
+ GotTableSymName, STV_HIDDEN, STT_NOTYPE, Target->GotBaseSymOff,
+ /*Size=*/0, STB_GLOBAL, Out::ElfHeader,
+ /*File=*/nullptr));
// __ehdr_start is the location of ELF file headers. Note that we define
// this symbol unconditionally even when using a linker script, which
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54624.174363.patch
Type: text/x-patch
Size: 1890 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181116/1207334a/attachment-0001.bin>
More information about the llvm-commits
mailing list