From b85f1857a16634315be63a45925b491186311d3a Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Wed, 4 Sep 2013 00:51:42 +0000 Subject: [PATCH] [lld][ELF] Emit note sections Emit note sections if the input contains a note section. Also emit a note segment. llvm-svn: 189896 --- lld/include/lld/Core/DefinedAtom.h | 1 + lld/lib/Core/DefinedAtom.cpp | 1 + lld/lib/ReaderWriter/ELF/Atoms.h | 6 +++++ lld/lib/ReaderWriter/ELF/DefaultLayout.h | 3 +++ lld/lib/ReaderWriter/ELF/SectionChunks.h | 5 ++++ .../ReaderWriter/YAML/ReaderWriterYAML.cpp | 1 + lld/test/elf/X86_64/Inputs/note.o | Bin 0 -> 785 bytes lld/test/elf/X86_64/Inputs/note.s | 11 +++++++++ lld/test/elf/X86_64/note-sections.test | 23 ++++++++++++++++++ 9 files changed, 51 insertions(+) create mode 100644 lld/test/elf/X86_64/Inputs/note.o create mode 100644 lld/test/elf/X86_64/Inputs/note.s create mode 100644 lld/test/elf/X86_64/note-sections.test diff --git a/lld/include/lld/Core/DefinedAtom.h b/lld/include/lld/Core/DefinedAtom.h index 05288b71d1da..5d23f8da4198 100644 --- a/lld/include/lld/Core/DefinedAtom.h +++ b/lld/include/lld/Core/DefinedAtom.h @@ -147,6 +147,7 @@ public: typeDataDirectoryEntry, // linker created for data directory header [PECOFF] typeThreadZeroFill, // Uninitialized thread local data(TBSS) [ELF] typeThreadData, // Initialized thread local data(TDATA) [ELF] + typeNote, // Identifies note sections [ELF] }; // Permission bits for atoms and segments. The order of these values are diff --git a/lld/lib/Core/DefinedAtom.cpp b/lld/lib/Core/DefinedAtom.cpp index 36bf5105c714..5f8276903147 100644 --- a/lld/lib/Core/DefinedAtom.cpp +++ b/lld/lib/Core/DefinedAtom.cpp @@ -41,6 +41,7 @@ DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) { case typeLiteral16: case typeDTraceDOF: case typeCompactUnwindInfo: + case typeNote: return permR__; case typeData: diff --git a/lld/lib/ReaderWriter/ELF/Atoms.h b/lld/lib/ReaderWriter/ELF/Atoms.h index 1b55d513863e..ed58f4afc82a 100644 --- a/lld/lib/ReaderWriter/ELF/Atoms.h +++ b/lld/lib/ReaderWriter/ELF/Atoms.h @@ -296,6 +296,9 @@ public: if (_symbol->st_shndx == llvm::ELF::SHN_COMMON) return _contentType = typeZeroFill; + if (_section->sh_type == llvm::ELF::SHT_NOTE) + return _contentType = typeNote; + switch (_section->sh_type) { case llvm::ELF::SHT_PROGBITS: flags &= ~llvm::ELF::SHF_ALLOC; @@ -436,6 +439,9 @@ public: case llvm::ELF::SHT_FINI_ARRAY: return _permissions = permRW_; + case llvm::ELF::SHT_NOTE: + return _permissions = permR__; + default: return _permissions = perm___; } diff --git a/lld/lib/ReaderWriter/ELF/DefaultLayout.h b/lld/lib/ReaderWriter/ELF/DefaultLayout.h index bca929b0affe..0eaedd4788c2 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h @@ -340,6 +340,9 @@ Layout::SectionOrder DefaultLayout::getSectionOrder( case DefinedAtom::typeStub: return ORDER_PLT; + case DefinedAtom::typeNote: + return ORDER_NOTE; + case DefinedAtom::typeThreadData: return ORDER_TDATA; case DefinedAtom::typeThreadZeroFill: diff --git a/lld/lib/ReaderWriter/ELF/SectionChunks.h b/lld/lib/ReaderWriter/ELF/SectionChunks.h index 98b34423b322..f9449e0af100 100644 --- a/lld/lib/ReaderWriter/ELF/SectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h @@ -155,6 +155,10 @@ public: case DefinedAtom::typeZeroFill: this->_type = SHT_NOBITS; break; + + case DefinedAtom::typeNote: + this->_type = SHT_NOTE; + break; } switch (permissions) { @@ -281,6 +285,7 @@ const lld::AtomLayout &AtomSection::appendAtom(const Atom *atom) { case DefinedAtom::typeStub: case DefinedAtom::typeResolver: case DefinedAtom::typeThreadData: + case DefinedAtom::typeNote: _atoms.push_back(new (_alloc) lld::AtomLayout(atom, fOffset, 0)); this->_fsize = fOffset + definedAtom->size(); this->_msize = mOffset + definedAtom->size(); diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index c6453572222d..db823f642317 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -491,6 +491,7 @@ struct ScalarEnumerationTraits { lld::DefinedAtom::typeThreadData); io.enumCase(value, "thread-zero-fill", lld::DefinedAtom::typeThreadZeroFill); + io.enumCase(value, "note", lld::DefinedAtom::typeNote); } }; diff --git a/lld/test/elf/X86_64/Inputs/note.o b/lld/test/elf/X86_64/Inputs/note.o new file mode 100644 index 0000000000000000000000000000000000000000..d86b0cf85d192de0d6342e7df287428ada37e1f1 GIT binary patch literal 785 zcmb<-^>JfjWMqH=Mg}_u1P><4z%T>BWN-kp9T+$mSb>lMNHZ{`yDBsKCHkg0i_jzG)O-)nz#cRAI3%3uMU&|g$ud*b%1)=ftU%1k%0r0 zBZDjmWTV?J2oyuN8>A%$L;!&Wgo2akaSr06+YM4Y11eYn)d_MVEDeB!B%tD)KpLC< h0#HG0_Cd80q?oa$P>_AtTnrM&<`R%NdZ+=d1^`ZBA7KCh literal 0 HcmV?d00001 diff --git a/lld/test/elf/X86_64/Inputs/note.s b/lld/test/elf/X86_64/Inputs/note.s new file mode 100644 index 000000000000..0a0b03da6bb7 --- /dev/null +++ b/lld/test/elf/X86_64/Inputs/note.s @@ -0,0 +1,11 @@ + .section ".note.ident", "a" + .p2align 2 + .long 1f - 0f # name size (not including padding) + .long 3f - 2f # desc size (not including padding) + .long 0x01234567 # type +0: .asciz "NaMe" # name +1: .p2align 2 +2: .long 0x76543210 # desc + .long 0x89abcdef +3: .p2align 2 + diff --git a/lld/test/elf/X86_64/note-sections.test b/lld/test/elf/X86_64/note-sections.test new file mode 100644 index 000000000000..a49f95cf4a27 --- /dev/null +++ b/lld/test/elf/X86_64/note-sections.test @@ -0,0 +1,23 @@ +# This tests the functionality that lld is able to recreate the note sections +# if they appear in the input + +RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/note.o \ +RUN: --noinhibit-exec -o %t -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NOTESECTIONS %s +RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NOTESEGMENT %s + + +NOTESECTIONS: Section { +NOTESECTIONS: Index: 1 +NOTESECTIONS: Name: .note.ident (1) +NOTESECTIONS: Type: SHT_NOTE (0x7) +NOTESECTIONS: Size: 28 +NOTESECTIONS: AddressAlignment: 4 +NOTESECTIONS: } + +NOTESEGMENT: ProgramHeader { +NOTESEGMENT: Type: PT_NOTE (0x4) +NOTESEGMENT: FileSize: 28 +NOTESEGMENT: MemSize: 28 +NOTESEGMENT: Alignment: 4 +NOTESEGMENT: }