From 6b936bf6c7a76485a6c8b51ed553a329ac7b2d7d Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Wed, 10 May 2017 16:20:33 +0000 Subject: [PATCH] [ELF] Define __ehdr_start unconditionally even when using linker script This behavior differs from the semantics implemented by GNU linkers which only define this symbol iff ELF headers are in the memory mapped segment. Differential Revision: https://reviews.llvm.org/D33019 llvm-svn: 302687 --- lld/ELF/Writer.cpp | 9 ++++++--- lld/test/ELF/linkerscript/ehdr_start.s | 14 +++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 5d810a79c522..e31f64ea9058 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -859,13 +859,16 @@ template void Writer::addReservedSymbols() { if (!In::DynSymTab) Symtab::X->addIgnored("__tls_get_addr"); + // __ehdr_start is the location of ELF file headers. Note that we define + // this symbol unconditionally even when using a linker script, which + // differs from the behavior implemented by GNU linker which only define + // this symbol if ELF headers are in the memory mapped segment. + addOptionalRegular("__ehdr_start", Out::ElfHeader, 0, STV_HIDDEN); + // If linker script do layout we do not need to create any standart symbols. if (Script->Opt.HasSections) return; - // __ehdr_start is the location of ELF file headers. - addOptionalRegular("__ehdr_start", Out::ElfHeader, 0, STV_HIDDEN); - auto Add = [](StringRef S) { return addOptionalRegular(S, Out::ElfHeader, 0, STV_DEFAULT); }; diff --git a/lld/test/ELF/linkerscript/ehdr_start.s b/lld/test/ELF/linkerscript/ehdr_start.s index 935fa2bf3391..4da158a83956 100644 --- a/lld/test/ELF/linkerscript/ehdr_start.s +++ b/lld/test/ELF/linkerscript/ehdr_start.s @@ -2,9 +2,17 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: echo "SECTIONS { }" > %t.script -# RUN: not ld.lld %t.o -script %t.script -o %t 2>&1 | FileCheck %s -# CHECK: error: undefined symbol: __ehdr_start -# CHECK: >>> referenced by {{.*}}:(.text+0x0) +# RUN: ld.lld %t.o -script %t.script -o %t +# RUN: llvm-readobj -symbols %t | FileCheck %s +# CHECK: Name: __ehdr_start (1) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other [ (0x2) +# CHECK-NEXT: STV_HIDDEN (0x2) +# CHECK-NEXT: ] +# CHECK-NEXT: Section: .text (0x1) .text .global _start, __ehdr_start