mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-04 01:26:41 +00:00
Revert "[llvm-objdump] Printing relocations in executable and shared object files. This partially reverts r215844 by removing test objdump-reloc-shared.test which stated GNU objdump doesn't print relocations, it does."
This reverts commit r263971. It produces the wrong results for .rela.dyn. I will add a test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263987 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5061f597c1
commit
05601d5da5
@ -640,6 +640,9 @@ ELFObjectFile<ELFT>::section_rel_end(DataRefImpl Sec) const {
|
||||
template <class ELFT>
|
||||
section_iterator
|
||||
ELFObjectFile<ELFT>::getRelocatedSection(DataRefImpl Sec) const {
|
||||
if (EF.getHeader()->e_type != ELF::ET_REL)
|
||||
return section_end();
|
||||
|
||||
const Elf_Shdr *EShdr = getSection(Sec);
|
||||
uintX_t Type = EShdr->sh_type;
|
||||
if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)
|
||||
@ -679,20 +682,14 @@ ELFObjectFile<ELFT>::getRelocationSymbol(DataRefImpl Rel) const {
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
uint64_t ELFObjectFile<ELFT>::getRelocationOffset(DataRefImpl Rel) const {
|
||||
const Elf_Shdr *sec = getRelSection(Rel);
|
||||
uint64_t Offset = sec->sh_type == ELF::SHT_REL ?
|
||||
getRel(Rel)->r_offset :
|
||||
getRela(Rel)->r_offset;
|
||||
if (EF.getHeader()->e_type == ELF::ET_EXEC ||
|
||||
EF.getHeader()->e_type == ELF::ET_DYN) {
|
||||
// For an executable file or a shared object, the value is the virtual
|
||||
// address of the storage unit affected by the relocation.
|
||||
auto SectionIter = getRelocatedSection(toDRI(sec));
|
||||
if (SectionIter != section_end())
|
||||
Offset -= SectionIter->getAddress();
|
||||
}
|
||||
return Offset;
|
||||
uint64_t ELFObjectFile<ELFT>::getRelocationOffset(DataRefImpl Rel) const {
|
||||
assert(EF.getHeader()->e_type == ELF::ET_REL &&
|
||||
"Only relocatable object files have relocation offsets");
|
||||
const Elf_Shdr *sec = getRelSection(Rel);
|
||||
if (sec->sh_type == ELF::SHT_REL)
|
||||
return getRel(Rel)->r_offset;
|
||||
|
||||
return getRela(Rel)->r_offset;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
|
5
test/Object/objdump-reloc-shared.test
Normal file
5
test/Object/objdump-reloc-shared.test
Normal file
@ -0,0 +1,5 @@
|
||||
RUN: llvm-objdump -r %p/Inputs/elf-reloc-no-sym.x86_64 \
|
||||
RUN: | FileCheck %s
|
||||
|
||||
; CHECK: elf-reloc-no-sym.x86_64: file format ELF64-x86-64
|
||||
; CHECK-NOT: {{.}}
|
Binary file not shown.
@ -1,9 +0,0 @@
|
||||
// This test checks that relocation in nonrelocatable files are printed
|
||||
// RUN: llvm-objdump -r %p/Inputs/relocations-in-nonrelocatable.elf-x86_64 | FileCheck %s
|
||||
|
||||
// (main.c)
|
||||
// void g(void){}
|
||||
// int main(void) { g(); };
|
||||
// gcc main.c -o main -Wl,--emit-relocs
|
||||
|
||||
CHECK: 00000000000000f8 R_X86_64_PC32 g-4-P
|
@ -1188,6 +1188,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
void llvm::PrintRelocations(const ObjectFile *Obj) {
|
||||
StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 :
|
||||
"%08" PRIx64;
|
||||
// Regular objdump doesn't print relocations in non-relocatable object
|
||||
// files.
|
||||
if (!Obj->isRelocatableObject())
|
||||
return;
|
||||
|
||||
for (const SectionRef &Section : ToolSectionFilter(*Obj)) {
|
||||
if (Section.relocation_begin() == Section.relocation_end())
|
||||
|
Loading…
x
Reference in New Issue
Block a user