diff options
| author | Shankar Easwaran <shankare@codeaurora.org> | 2013-09-04 00:51:42 +0000 |
|---|---|---|
| committer | Shankar Easwaran <shankare@codeaurora.org> | 2013-09-04 00:51:42 +0000 |
| commit | b85f1857a16634315be63a45925b491186311d3a (patch) | |
| tree | 7469deabd510ebc2c2e6f91f4cedb498762e9509 /lld | |
| parent | 8ccf6da056e157521492d8f7ecc108a5afc61ecd (diff) | |
| download | bcm5719-llvm-b85f1857a16634315be63a45925b491186311d3a.tar.gz bcm5719-llvm-b85f1857a16634315be63a45925b491186311d3a.zip | |
[lld][ELF] Emit note sections
Emit note sections if the input contains a note section.
Also emit a note segment.
llvm-svn: 189896
Diffstat (limited to 'lld')
| -rw-r--r-- | lld/include/lld/Core/DefinedAtom.h | 1 | ||||
| -rw-r--r-- | lld/lib/Core/DefinedAtom.cpp | 1 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Atoms.h | 6 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/DefaultLayout.h | 3 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/SectionChunks.h | 5 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 1 | ||||
| -rw-r--r-- | lld/test/elf/X86_64/Inputs/note.o | bin | 0 -> 785 bytes | |||
| -rw-r--r-- | lld/test/elf/X86_64/Inputs/note.s | 11 | ||||
| -rw-r--r-- | lld/test/elf/X86_64/note-sections.test | 23 |
9 files changed, 51 insertions, 0 deletions
diff --git a/lld/include/lld/Core/DefinedAtom.h b/lld/include/lld/Core/DefinedAtom.h index 05288b71d1d..5d23f8da419 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 36bf5105c71..5f827690314 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 1b55d513863..ed58f4afc82 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 bca929b0aff..0eaedd4788c 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h @@ -340,6 +340,9 @@ Layout::SectionOrder DefaultLayout<ELFT>::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 98b34423b32..f9449e0af10 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<ELFT>::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 c6453572222..db823f64231 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -491,6 +491,7 @@ struct ScalarEnumerationTraits<lld::DefinedAtom::ContentType> { 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 Binary files differnew file mode 100644 index 00000000000..d86b0cf85d1 --- /dev/null +++ b/lld/test/elf/X86_64/Inputs/note.o 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 00000000000..0a0b03da6bb --- /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 00000000000..a49f95cf4a2 --- /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: } |

