mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 02:25:19 +00:00
[Object][ELF] Add support for dumping dynamic relocations when sections are stripped.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240703 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -265,6 +265,7 @@ private:
|
||||
DynRegionInfo DynHashRegion;
|
||||
DynRegionInfo DynStrRegion;
|
||||
DynRegionInfo DynSymRegion;
|
||||
DynRegionInfo DynRelaRegion;
|
||||
|
||||
// Pointer to SONAME entry in dynamic string table
|
||||
// This is set the first time getLoadName is called.
|
||||
@@ -363,6 +364,21 @@ public:
|
||||
return Elf_Sym_Iter(0, nullptr, true);
|
||||
}
|
||||
|
||||
Elf_Rela_Iter begin_dyn_rela() const {
|
||||
if (DynRelaRegion.Addr)
|
||||
return Elf_Rela_Iter(DynRelaRegion.EntSize,
|
||||
(const char *)DynRelaRegion.Addr);
|
||||
return Elf_Rela_Iter(0, nullptr);
|
||||
}
|
||||
|
||||
Elf_Rela_Iter end_dyn_rela() const {
|
||||
if (DynRelaRegion.Addr)
|
||||
return Elf_Rela_Iter(
|
||||
DynRelaRegion.EntSize,
|
||||
(const char *)DynRelaRegion.Addr + DynRelaRegion.Size);
|
||||
return Elf_Rela_Iter(0, nullptr);
|
||||
}
|
||||
|
||||
Elf_Rela_Iter begin_rela(const Elf_Shdr *sec) const {
|
||||
return Elf_Rela_Iter(sec->sh_entsize,
|
||||
(const char *)(base() + sec->sh_offset));
|
||||
@@ -762,6 +778,38 @@ ELFFile<ELFT>::ELFFile(StringRef Object, std::error_code &EC)
|
||||
}
|
||||
}
|
||||
|
||||
// Scan dynamic table.
|
||||
for (Elf_Dyn_Iter DynI = begin_dynamic_table(), DynE = end_dynamic_table();
|
||||
DynI != DynE; ++DynI) {
|
||||
switch (DynI->d_tag) {
|
||||
case ELF::DT_RELA: {
|
||||
uint64_t VBase = 0;
|
||||
const uint8_t *FBase = nullptr;
|
||||
for (Elf_Phdr_Iter PhdrI = begin_program_headers(),
|
||||
PhdrE = end_program_headers();
|
||||
PhdrI != PhdrE; ++PhdrI) {
|
||||
if (PhdrI->p_type != ELF::PT_LOAD)
|
||||
continue;
|
||||
if (DynI->getPtr() >= PhdrI->p_vaddr &&
|
||||
DynI->getPtr() < PhdrI->p_vaddr + PhdrI->p_memsz) {
|
||||
VBase = PhdrI->p_vaddr;
|
||||
FBase = base() + PhdrI->p_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!VBase)
|
||||
return;
|
||||
DynRelaRegion.Addr = FBase + DynI->getPtr() - VBase;
|
||||
break;
|
||||
}
|
||||
case ELF::DT_RELASZ:
|
||||
DynRelaRegion.Size = DynI->getVal();
|
||||
break;
|
||||
case ELF::DT_RELAENT:
|
||||
DynRelaRegion.EntSize = DynI->getVal();
|
||||
}
|
||||
}
|
||||
|
||||
EC = std::error_code();
|
||||
}
|
||||
|
||||
|
@@ -293,7 +293,7 @@ struct Elf_Dyn_Impl : Elf_Dyn_Base<ELFT> {
|
||||
using Elf_Dyn_Base<ELFT>::d_un;
|
||||
int64_t getTag() const { return d_tag; }
|
||||
uint64_t getVal() const { return d_un.d_val; }
|
||||
uint64_t getPtr() const { return d_un.ptr; }
|
||||
uint64_t getPtr() const { return d_un.d_ptr; }
|
||||
};
|
||||
|
||||
// Elf_Rel: Elf Relocation
|
||||
|
Reference in New Issue
Block a user