diff options
author | Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com> | 2025-03-26 20:18:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-26 20:18:23 +0100 |
commit | bcad0501062325457cc9dae4b8b083e3bd2a04e3 (patch) | |
tree | 14eff0ee8d628a93d314ed7117966b59fc803e55 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 9b7a7e4b9e44a73978c374f95f90332620f87ce8 (diff) | |
download | llvm-bcad0501062325457cc9dae4b8b083e3bd2a04e3.zip llvm-bcad0501062325457cc9dae4b8b083e3bd2a04e3.tar.gz llvm-bcad0501062325457cc9dae4b8b083e3bd2a04e3.tar.bz2 |
[llvm-objdump][ARM] Find ELF file PLT entries for arm, thumb (#130764)
This implements arm, armeb, thumb, thumbeb PLT entries parsing support
in ELF for llvm-objdump.
Implementation is similar to AArch64MCInstrAnalysis::findPltEntries. PLT
entry signatures are based on LLD code for PLT generation
(ARM::writePlt).
llvm-objdump tests are produced from lld/test/ELF/arm-plt-reloc.s,
lld/test/ELF/armv8-thumb-plt-reloc.s.
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 8b6f58a..c897881 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1233,12 +1233,7 @@ addMissingWasmCodeSymbols(const WasmObjectFile &Obj, } } -static void addPltEntries(const MCSubtargetInfo &STI, const ObjectFile &Obj, - std::map<SectionRef, SectionSymbolsTy> &AllSymbols, - StringSaver &Saver) { - auto *ElfObj = dyn_cast<ELFObjectFileBase>(&Obj); - if (!ElfObj) - return; +static DenseMap<StringRef, SectionRef> getSectionNames(const ObjectFile &Obj) { DenseMap<StringRef, SectionRef> Sections; for (SectionRef Section : Obj.sections()) { Expected<StringRef> SecNameOrErr = Section.getName(); @@ -1248,13 +1243,23 @@ static void addPltEntries(const MCSubtargetInfo &STI, const ObjectFile &Obj, } Sections[*SecNameOrErr] = Section; } + return Sections; +} + +static void addPltEntries(const MCSubtargetInfo &STI, const ObjectFile &Obj, + DenseMap<StringRef, SectionRef> &SectionNames, + std::map<SectionRef, SectionSymbolsTy> &AllSymbols, + StringSaver &Saver) { + auto *ElfObj = dyn_cast<ELFObjectFileBase>(&Obj); + if (!ElfObj) + return; for (auto Plt : ElfObj->getPltEntries(STI)) { if (Plt.Symbol) { SymbolRef Symbol(*Plt.Symbol, ElfObj); uint8_t SymbolType = getElfSymbolType(Obj, Symbol); if (Expected<StringRef> NameOrErr = Symbol.getName()) { if (!NameOrErr->empty()) - AllSymbols[Sections[Plt.Section]].emplace_back( + AllSymbols[SectionNames[Plt.Section]].emplace_back( Plt.Address, Saver.save((*NameOrErr + "@plt").str()), SymbolType); continue; } else { @@ -1770,9 +1775,34 @@ disassembleObject(ObjectFile &Obj, const ObjectFile &DbgObj, if (Obj.isELF() && Obj.sections().empty()) createFakeELFSections(Obj); + DisassemblerTarget *PltTarget = DT; + auto SectionNames = getSectionNames(Obj); + if (SecondaryTarget && isArmElf(Obj)) { + auto PltSectionRef = SectionNames.find(".plt"); + if (PltSectionRef != SectionNames.end()) { + bool PltIsThumb = false; + for (auto [Addr, SymbolName] : AllMappingSymbols[PltSectionRef->second]) { + if (Addr != 0) + continue; + + if (SymbolName == 't') { + PltIsThumb = true; + break; + } + if (SymbolName == 'a') + break; + } + + if (PrimaryTarget.SubtargetInfo->checkFeatures("+thumb-mode")) + PltTarget = PltIsThumb ? &PrimaryTarget : &*SecondaryTarget; + else + PltTarget = PltIsThumb ? &*SecondaryTarget : &PrimaryTarget; + } + } BumpPtrAllocator A; StringSaver Saver(A); - addPltEntries(*DT->SubtargetInfo, Obj, AllSymbols, Saver); + addPltEntries(*PltTarget->SubtargetInfo, Obj, SectionNames, AllSymbols, + Saver); // Create a mapping from virtual address to section. An empty section can // cause more than one section at the same address. Sort such sections to be |