[lld] r238169 - [ELF] Add support for -z origin/now options.
Davide Italiano
davide at freebsd.org
Mon May 25 18:57:33 PDT 2015
Author: davide
Date: Mon May 25 20:57:32 2015
New Revision: 238169
URL: http://llvm.org/viewvc/llvm-project?rev=238169&view=rev
Log:
[ELF] Add support for -z origin/now options.
Differential Revision: http://reviews.llvm.org/D9963
Added:
lld/trunk/test/elf/zoption_dtflags.test
Modified:
lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
lld/trunk/lib/Driver/GnuLdDriver.cpp
lld/trunk/lib/ReaderWriter/ELF/OutputELFWriter.cpp
Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=238169&r1=238168&r2=238169&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Mon May 25 20:57:32 2015
@@ -97,6 +97,12 @@ public:
OMAGIC,
};
+ /// \brief ELF DT_FLAGS.
+ enum DTFlag : uint32_t {
+ DT_NOW = 1 << 1,
+ DT_ORIGIN = 1 << 2,
+ };
+
llvm::Triple getTriple() const { return _triple; }
uint64_t getPageSize() const { return _maxPageSize; }
@@ -329,6 +335,10 @@ public:
// --wrap option.
void addWrapForSymbol(StringRef sym) { _wrapCalls.insert(sym); }
+ // \brief Set DT_FLAGS flag.
+ void setDTFlag(DTFlag f) { _dtFlags |= f; };
+ bool getDTFlag(DTFlag f) { return (_dtFlags & f); };
+
const llvm::StringSet<> &wrapCalls() const { return _wrapCalls; }
void setUndefinesResolver(std::unique_ptr<File> resolver);
@@ -383,6 +393,7 @@ protected:
bool _armTarget1Rel = false;
bool _mipsPcRelEhRel = false;
uint64_t _maxPageSize = 0x1000;
+ uint32_t _dtFlags = 0;
OutputMagic _outputMagic = OutputMagic::DEFAULT;
StringRefVector _inputSearchPaths;
Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=238169&r1=238168&r2=238169&view=diff
==============================================================================
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Mon May 25 20:57:32 2015
@@ -584,9 +584,13 @@ bool GnuLdDriver::parse(int argc, const
for (auto *arg : parsedArgs->filtered(OPT_z)) {
StringRef opt = arg->getValue();
- if (opt == "muldefs") {
+ if (opt == "muldefs")
ctx->setAllowDuplicates(true);
- } else if (opt.startswith("max-page-size")) {
+ else if (opt == "now")
+ ctx->setDTFlag(ELFLinkingContext::DTFlag::DT_NOW);
+ else if (opt == "origin")
+ ctx->setDTFlag(ELFLinkingContext::DTFlag::DT_ORIGIN);
+ else if (opt.startswith("max-page-size")) {
// Parse -z max-page-size option.
// The default page size is considered the minimum page size the user
// can set, check the user input if its atleast the minimum page size
Modified: lld/trunk/lib/ReaderWriter/ELF/OutputELFWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/OutputELFWriter.cpp?rev=238169&r1=238168&r2=238169&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/OutputELFWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/OutputELFWriter.cpp Mon May 25 20:57:32 2015
@@ -140,6 +140,21 @@ void OutputELFWriter<ELFT>::buildDynamic
if (!soname.empty() && _ctx.getOutputELFType() == llvm::ELF::ET_DYN)
_dynamicTable->addEntry(DT_SONAME, _dynamicStringTable->addString(soname));
+ // Add DT_FLAGS/DT_FLAGS_1 entries if necessary.
+ uint32_t dtflags = 0, dt1flags = 0;
+ if (_ctx.getDTFlag(ELFLinkingContext::DTFlag::DT_NOW)) {
+ dtflags |= DF_BIND_NOW;
+ dt1flags |= DF_1_NOW;
+ }
+ if (_ctx.getDTFlag(ELFLinkingContext::DTFlag::DT_ORIGIN)) {
+ dtflags |= DF_ORIGIN;
+ dt1flags |= DF_1_ORIGIN;
+ }
+ if (dtflags != 0)
+ _dynamicTable->addEntry(DT_FLAGS, dtflags);
+ if (dt1flags != 0)
+ _dynamicTable->addEntry(DT_FLAGS_1, dt1flags);
+
// The dynamic symbol table need to be sorted earlier because the hash
// table needs to be built using the dynamic symbol table. It would be
// late to sort the symbols due to that in finalize. In the dynamic symbol
Added: lld/trunk/test/elf/zoption_dtflags.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/zoption_dtflags.test?rev=238169&view=auto
==============================================================================
--- lld/trunk/test/elf/zoption_dtflags.test (added)
+++ lld/trunk/test/elf/zoption_dtflags.test Mon May 25 20:57:32 2015
@@ -0,0 +1,90 @@
+# Test that -z {origin, now} options work.
+#
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor gnu -target x86_64 %t.o -e=main -z now -z origin -o %t1
+#RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s
+#
+#CHECK: 0x000000000000001E FLAGS ORIGIN BIND_NOW
+#CHECK: 0x000000006FFFFFFB FLAGS_1 NOW ORIGIN
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E58B45FC5DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000900000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 48
+Symbols:
+ Local:
+ - Name: local
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x0000000000000009
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000024
+...
More information about the llvm-commits
mailing list