summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2015-10-21 17:09:47 +0000
committerDavide Italiano <davide@freebsd.org>2015-10-21 17:09:47 +0000
commit6e91c598b9f3b2fa5f7cfd158cb6eebb6a6ae8f4 (patch)
treea1adf8170adf76153b940a44f87b2312b864dcc9
parente3bf4fd546eea6743ab2944427bcb872a8cece0a (diff)
downloadbcm5719-llvm-6e91c598b9f3b2fa5f7cfd158cb6eebb6a6ae8f4.tar.gz
bcm5719-llvm-6e91c598b9f3b2fa5f7cfd158cb6eebb6a6ae8f4.zip
[ELF2] Add support for -z origin.
llvm-svn: 250907
-rw-r--r--lld/ELF/Config.h1
-rw-r--r--lld/ELF/Driver.cpp2
-rw-r--r--lld/ELF/OutputSections.cpp8
-rw-r--r--lld/test/elf2/dt_flags.s10
4 files changed, 14 insertions, 7 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 5aa1e001418..86410f85621 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -59,6 +59,7 @@ struct Configuration {
bool Verbose;
bool ZNodelete = false;
bool ZNow = false;
+ bool ZOrigin = false;
ELFKind EKind = ELFNoneKind;
uint16_t EMachine = llvm::ELF::EM_NONE;
uint64_t EntryAddr = -1;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 14a1d3d6ff8..4d7e489c87e 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -163,6 +163,8 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
Config->ZNodelete = true;
else if (Arg->getValue() == StringRef("now"))
Config->ZNow = true;
+ else if (Arg->getValue() == StringRef("origin"))
+ Config->ZOrigin = true;
}
for (auto *Arg : Args) {
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index d5c96cf5c12..c04147a4c74 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -349,9 +349,9 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() {
++NumEntries; // DT_INIT
if (FiniSym)
++NumEntries; // DT_FINI
- if (Config->Bsymbolic || Config->ZNow)
+ if (Config->Bsymbolic || Config->ZNow || Config->ZOrigin)
++NumEntries; // DT_FLAGS
- if (Config->ZNodelete || Config->ZNow)
+ if (Config->ZNodelete || Config->ZNow || Config->ZOrigin)
++NumEntries; // DT_FLAGS_1
++NumEntries; // DT_NULL
@@ -434,6 +434,8 @@ template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
Flags |= DF_SYMBOLIC;
if (Config->ZNow)
Flags |= DF_BIND_NOW;
+ if (Config->ZOrigin)
+ Flags |= DF_ORIGIN;
if (Flags)
WriteVal(DT_FLAGS, Flags);
Flags = 0;
@@ -441,6 +443,8 @@ template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
Flags |= DF_1_NODELETE;
if (Config->ZNow)
Flags |= DF_1_NOW;
+ if (Config->ZOrigin)
+ Flags |= DF_1_ORIGIN;
if (Flags)
WriteVal(DT_FLAGS_1, Flags);
diff --git a/lld/test/elf2/dt_flags.s b/lld/test/elf2/dt_flags.s
index 2d39aabd523..925a8f4303f 100644
--- a/lld/test/elf2/dt_flags.s
+++ b/lld/test/elf2/dt_flags.s
@@ -2,19 +2,19 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: ld.lld2 -shared %t -o %t.so
-# RUN: ld.lld2 -z now -z nodelete -Bsymbolic %t %t.so -o %t1
+# RUN: ld.lld2 -z now -z nodelete -z origin -Bsymbolic %t %t.so -o %t1
# RUN: ld.lld2 %t %t.so -o %t2
# RUN: llvm-readobj -dynamic-table %t1 | FileCheck -check-prefix=FLAGS %s
# RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s
# FLAGS: DynamicSection [
-# FLAGS: 0x000000000000001E FLAGS SYMBOLIC BIND_NOW
-# FLAGS: 0x000000006FFFFFFB FLAGS_1 NOW NODELETE
+# FLAGS: 0x000000000000001E FLAGS ORIGIN SYMBOLIC BIND_NOW
+# FLAGS: 0x000000006FFFFFFB FLAGS_1 NOW NODELETE ORIGIN
# FLAGS: ]
# CHECK: DynamicSection [
-# CHECK-NOT: 0x000000000000001E FLAGS SYMBOLIC BIND_NOW
-# CHECK-NOT: 0x000000006FFFFFFB FLAGS_1 NOW NODELETE
+# CHECK-NOT: 0x000000000000001E FLAGS ORIGIN SYMBOLIC BIND_NOW
+# CHECK-NOT: 0x000000006FFFFFFB FLAGS_1 NOW NODELETE ORIGIN
# CHECK: ]
.globl _start
OpenPOWER on IntegriCloud