forked from OSchip/llvm-project
[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:
parent
8ccf6da056
commit
b85f1857a1
|
@ -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
|
||||
|
|
|
@ -41,6 +41,7 @@ DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
|
|||
case typeLiteral16:
|
||||
case typeDTraceDOF:
|
||||
case typeCompactUnwindInfo:
|
||||
case typeNote:
|
||||
return permR__;
|
||||
|
||||
case typeData:
|
||||
|
|
|
@ -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___;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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.
|
@ -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
|
||||
|
|
@ -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: }
|
Loading…
Reference in New Issue