[llvm-objcopy] Fill .symtab_shndx section correctly
Differential revision: https://reviews.llvm.org/D60555 llvm-svn: 358278
This commit is contained in:
parent
fb79ff6ab5
commit
88089fed9c
|
@ -3,6 +3,7 @@ RUN: llvm-objcopy %t %t2
|
|||
RUN: llvm-readobj --file-headers %t2 | FileCheck --check-prefix=EHDR %s
|
||||
RUN: llvm-readobj --sections %t2 | FileCheck --check-prefix=SECS %s
|
||||
RUN: llvm-readobj --symbols %t2 | grep "Symbol {" | wc -l | FileCheck --check-prefix=SYMS %s
|
||||
RUN: llvm-readobj -symbols %t2 | FileCheck %s --check-prefix=SYM_SEC_IDS
|
||||
|
||||
EHDR: Format: ELF64-x86-64
|
||||
EHDR-NEXT: Arch: x86_64
|
||||
|
@ -51,3 +52,52 @@ SECS-NEXT: AddressAlignment: 4
|
|||
SECS-NEXT: EntrySize: 4
|
||||
SECS: Index: 65287
|
||||
SYMS: 65284
|
||||
|
||||
SYM_SEC_IDS: Section: s9 (0xFEFF)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
SYM_SEC_IDS-NEXT: Symbol {
|
||||
SYM_SEC_IDS-NEXT: Name: s9 (37)
|
||||
SYM_SEC_IDS-NEXT: Value: 0x0
|
||||
SYM_SEC_IDS-NEXT: Size: 0
|
||||
SYM_SEC_IDS-NEXT: Binding: Local (0x0)
|
||||
SYM_SEC_IDS-NEXT: Type: None (0x0)
|
||||
SYM_SEC_IDS-NEXT: Other: 0
|
||||
SYM_SEC_IDS-NEXT: Section: s9 (0xFF01)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
SYM_SEC_IDS-NEXT: Symbol {
|
||||
SYM_SEC_IDS-NEXT: Name: s9 (37)
|
||||
SYM_SEC_IDS-NEXT: Value: 0x0
|
||||
SYM_SEC_IDS-NEXT: Size: 0
|
||||
SYM_SEC_IDS-NEXT: Binding: Local (0x0)
|
||||
SYM_SEC_IDS-NEXT: Type: None (0x0)
|
||||
SYM_SEC_IDS-NEXT: Other: 0
|
||||
SYM_SEC_IDS-NEXT: Section: s9 (0xFF00)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
SYM_SEC_IDS-NEXT: Symbol {
|
||||
SYM_SEC_IDS-NEXT: Name: s9 (37)
|
||||
SYM_SEC_IDS-NEXT: Value: 0x0
|
||||
SYM_SEC_IDS-NEXT: Size: 0
|
||||
SYM_SEC_IDS-NEXT: Binding: Local (0x0)
|
||||
SYM_SEC_IDS-NEXT: Type: None (0x0)
|
||||
SYM_SEC_IDS-NEXT: Other: 0
|
||||
SYM_SEC_IDS-NEXT: Section: s9 (0x1982)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
SYM_SEC_IDS-NEXT: Symbol {
|
||||
SYM_SEC_IDS-NEXT: Name: s9 (37)
|
||||
SYM_SEC_IDS-NEXT: Value: 0x0
|
||||
SYM_SEC_IDS-NEXT: Size: 0
|
||||
SYM_SEC_IDS-NEXT: Binding: Local (0x0)
|
||||
SYM_SEC_IDS-NEXT: Type: None (0x0)
|
||||
SYM_SEC_IDS-NEXT: Other: 0
|
||||
SYM_SEC_IDS-NEXT: Section: s9 (0xFF03)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
SYM_SEC_IDS-NEXT: Symbol {
|
||||
SYM_SEC_IDS-NEXT: Name: s9 (37)
|
||||
SYM_SEC_IDS-NEXT: Value: 0x0
|
||||
SYM_SEC_IDS-NEXT: Size: 0
|
||||
SYM_SEC_IDS-NEXT: Binding: Local (0x0)
|
||||
SYM_SEC_IDS-NEXT: Type: None (0x0)
|
||||
SYM_SEC_IDS-NEXT: Other: 0
|
||||
SYM_SEC_IDS-NEXT: Section: s9 (0xFF04)
|
||||
SYM_SEC_IDS-NEXT: }
|
||||
|
||||
|
|
|
@ -486,22 +486,30 @@ void SymbolTableSection::finalize() {
|
|||
}
|
||||
|
||||
void SymbolTableSection::prepareForLayout() {
|
||||
// Add all potential section indexes before file layout so that the section
|
||||
// index section has the approprite size.
|
||||
if (SectionIndexTable != nullptr) {
|
||||
for (const auto &Sym : Symbols) {
|
||||
if (Sym->DefinedIn != nullptr && Sym->DefinedIn->Index >= SHN_LORESERVE)
|
||||
SectionIndexTable->addIndex(Sym->DefinedIn->Index);
|
||||
else
|
||||
SectionIndexTable->addIndex(SHN_UNDEF);
|
||||
}
|
||||
}
|
||||
// Reserve proper amount of space in section index table, so we can
|
||||
// layout sections correctly. We will fill the table with correct
|
||||
// indexes later in fillShdnxTable.
|
||||
if (SectionIndexTable)
|
||||
SectionIndexTable->reserve(Symbols.size());
|
||||
// Add all of our strings to SymbolNames so that SymbolNames has the right
|
||||
// size before layout is decided.
|
||||
for (auto &Sym : Symbols)
|
||||
SymbolNames->addString(Sym->Name);
|
||||
}
|
||||
|
||||
void SymbolTableSection::fillShndxTable() {
|
||||
if (SectionIndexTable == nullptr)
|
||||
return;
|
||||
// Fill section index table with real section indexes. This function must
|
||||
// be called after assignOffsets.
|
||||
for (const auto &Sym : Symbols) {
|
||||
if (Sym->DefinedIn != nullptr && Sym->DefinedIn->Index >= SHN_LORESERVE)
|
||||
SectionIndexTable->addIndex(Sym->DefinedIn->Index);
|
||||
else
|
||||
SectionIndexTable->addIndex(SHN_UNDEF);
|
||||
}
|
||||
}
|
||||
|
||||
const Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) const {
|
||||
if (Symbols.size() <= Index)
|
||||
error("Invalid symbol index: " + Twine(Index));
|
||||
|
@ -1661,6 +1669,11 @@ template <class ELFT> Error ELFWriter<ELFT>::finalize() {
|
|||
|
||||
assignOffsets();
|
||||
|
||||
// layoutSections could have modified section indexes, so we need
|
||||
// to fill the index table after assignOffsets.
|
||||
if (Obj.SymbolTable != nullptr)
|
||||
Obj.SymbolTable->fillShndxTable();
|
||||
|
||||
// Finally now that all offsets and indexes have been set we can finalize any
|
||||
// remaining issues.
|
||||
uint64_t Offset = Obj.SHOffset + sizeof(Elf_Shdr);
|
||||
|
|
|
@ -481,9 +481,14 @@ private:
|
|||
public:
|
||||
virtual ~SectionIndexSection() {}
|
||||
void addIndex(uint32_t Index) {
|
||||
Indexes.push_back(Index);
|
||||
Size += 4;
|
||||
assert(Size > 0);
|
||||
Indexes.push_back(Index);
|
||||
}
|
||||
|
||||
void reserve(size_t NumSymbols) {
|
||||
Indexes.reserve(NumSymbols);
|
||||
Size = NumSymbols * 4;
|
||||
}
|
||||
void setSymTab(SymbolTableSection *SymTab) { Symbols = SymTab; }
|
||||
void initialize(SectionTableRef SecTable) override;
|
||||
void finalize() override;
|
||||
|
@ -524,6 +529,7 @@ public:
|
|||
SectionIndexTable = ShndxTable;
|
||||
}
|
||||
const SectionIndexSection *getShndxTable() const { return SectionIndexTable; }
|
||||
void fillShndxTable();
|
||||
const SectionBase *getStrTab() const { return SymbolNames; }
|
||||
const Symbol *getSymbolByIndex(uint32_t Index) const;
|
||||
Symbol *getSymbolByIndex(uint32_t Index);
|
||||
|
|
Loading…
Reference in New Issue