summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorShankar Easwaran <shankare@codeaurora.org>2013-09-04 00:51:42 +0000
committerShankar Easwaran <shankare@codeaurora.org>2013-09-04 00:51:42 +0000
commitb85f1857a16634315be63a45925b491186311d3a (patch)
tree7469deabd510ebc2c2e6f91f4cedb498762e9509 /lld
parent8ccf6da056e157521492d8f7ecc108a5afc61ecd (diff)
downloadbcm5719-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.h1
-rw-r--r--lld/lib/Core/DefinedAtom.cpp1
-rw-r--r--lld/lib/ReaderWriter/ELF/Atoms.h6
-rw-r--r--lld/lib/ReaderWriter/ELF/DefaultLayout.h3
-rw-r--r--lld/lib/ReaderWriter/ELF/SectionChunks.h5
-rw-r--r--lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp1
-rw-r--r--lld/test/elf/X86_64/Inputs/note.obin0 -> 785 bytes
-rw-r--r--lld/test/elf/X86_64/Inputs/note.s11
-rw-r--r--lld/test/elf/X86_64/note-sections.test23
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
new file mode 100644
index 00000000000..d86b0cf85d1
--- /dev/null
+++ b/lld/test/elf/X86_64/Inputs/note.o
Binary files differ
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: }
OpenPOWER on IntegriCloud