[lld][ELF] Emit note sections

Emit note sections if the input contains a note section.

Also emit a note segment.

llvm-svn: 189896
This commit is contained in:
Shankar Easwaran 2013-09-04 00:51:42 +00:00
parent 8ccf6da056
commit b85f1857a1
9 changed files with 51 additions and 0 deletions

View File

@ -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

View File

@ -41,6 +41,7 @@ DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
case typeLiteral16:
case typeDTraceDOF:
case typeCompactUnwindInfo:
case typeNote:
return permR__;
case typeData:

View File

@ -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___;
}

View File

@ -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:

View File

@ -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();

View File

@ -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);
}
};

Binary file not shown.

View File

@ -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

View File

@ -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: }