[llvm] r263971 - [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.
Colin LeMahieu via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 21 12:14:50 PDT 2016
Author: colinl
Date: Mon Mar 21 14:14:50 2016
New Revision: 263971
URL: http://llvm.org/viewvc/llvm-project?rev=263971&view=rev
Log:
[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.
In executable and shared object ELF files, relocations in the file contain the final virtual address rather than section offset so this is adjusted to display section offset.
Differential revision: http://reviews.llvm.org/D15965
Added:
llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64 (with props)
llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test
Removed:
llvm/trunk/test/Object/objdump-reloc-shared.test
Modified:
llvm/trunk/include/llvm/Object/ELFObjectFile.h
llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=263971&r1=263970&r2=263971&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Mon Mar 21 14:14:50 2016
@@ -640,9 +640,6 @@ ELFObjectFile<ELFT>::section_rel_end(Dat
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)
@@ -682,14 +679,20 @@ ELFObjectFile<ELFT>::getRelocationSymbol
}
template <class ELFT>
-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;
+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;
}
template <class ELFT>
Removed: llvm/trunk/test/Object/objdump-reloc-shared.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/objdump-reloc-shared.test?rev=263970&view=auto
==============================================================================
--- llvm/trunk/test/Object/objdump-reloc-shared.test (original)
+++ llvm/trunk/test/Object/objdump-reloc-shared.test (removed)
@@ -1,5 +0,0 @@
-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: {{.}}
Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64?rev=263971&view=auto
==============================================================================
Binary file - no diff available.
Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/relocations-in-nonrelocatable.elf-x86_64
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test?rev=263971&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/relocations-in-nonrelocatable.test Mon Mar 21 14:14:50 2016
@@ -0,0 +1,9 @@
+// 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
\ No newline at end of file
Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=263971&r1=263970&r2=263971&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Mar 21 14:14:50 2016
@@ -1188,10 +1188,6 @@ static void DisassembleObject(const Obje
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())
More information about the llvm-commits
mailing list