[llvm] r362969 - [ELF][llvm-objdump] Treat dynamic tag values as virtual addresses instead of offsets

Wolfgang Pieb via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 10 10:50:24 PDT 2019


Author: wolfgangp
Date: Mon Jun 10 10:50:24 2019
New Revision: 362969

URL: http://llvm.org/viewvc/llvm-project?rev=362969&view=rev
Log:
[ELF][llvm-objdump] Treat dynamic tag values as virtual addresses instead of offsets

The ELF gABI requires the tag values of DT_REL, DT_RELA and DT_JMPREL to be
treated as virtual addresses. They were treated as offsets. Fixes PR41832.

Differential Revision: https://reviews.llvm.org/D62972

Added:
    llvm/trunk/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test
Modified:
    llvm/trunk/include/llvm/Object/ELFObjectFile.h

Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=362969&r1=362968&r2=362969&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Mon Jun 10 10:50:24 2019
@@ -776,7 +776,7 @@ ELFObjectFile<ELFT>::dynamic_relocation_
     }
   }
   for (const Elf_Shdr &Sec : *SectionsOrErr) {
-    if (is_contained(Offsets, Sec.sh_offset))
+    if (is_contained(Offsets, Sec.sh_addr))
       Res.emplace_back(toDRI(&Sec), this);
   }
   return Res;

Added: llvm/trunk/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test?rev=362969&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/elf-dynamic-relocs.test Mon Jun 10 10:50:24 2019
@@ -0,0 +1,113 @@
+## Show that llvm-objdump can dump dynamic relocations.
+## Specifically, we are checking that the tags DT_RELA, DT_REL and DT_JMPREL
+## properly identify relocation tables.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --dynamic-reloc %t | FileCheck --implicit-check-not=R_X86 %s
+
+# CHECK:      file format ELF64-x86-64
+# CHECK:      DYNAMIC RELOCATION RECORDS
+# CHECK-NEXT: 0000000000000000 R_X86_64_RELATIVE *ABS*
+# CHECK-NEXT: 0000000000000000 R_X86_64_JUMP_SLOT bar
+# CHECK-NEXT: 0000000000000008 R_X86_64_NONE foo
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name:         .foo
+    Type:         SHT_PROGBITS
+    Size:         16
+    Flags:        [SHF_ALLOC]
+    Address:      0x100000
+    AddressAlign: 0x100
+  - Name:         .got.plt
+    Type:         SHT_PROGBITS
+    Flags:        [SHF_WRITE, SHF_ALLOC]
+    Address:      0x100100
+    AddressAlign: 0x1000
+  - Name:         .rela.dyn
+    Type:         SHT_RELA
+    Address:      0x100200
+    AddressAlign: 0x100
+    Info:         .foo
+    Link:         .dynsym
+    Flags:        [SHF_ALLOC]
+    Relocations:
+      - Offset: 0
+        Type:   R_X86_64_RELATIVE
+        Addend: 0
+  - Name:         .rela.plt
+    Type:         SHT_RELA
+    Address:      0x100300
+    AddressAlign: 0x100
+    Info:         .got.plt
+    Link:         .dynsym
+    Flags:        [SHF_ALLOC]
+    Relocations:
+      - Offset: 0
+        Symbol: 2 # bar
+        Type:   R_X86_64_JUMP_SLOT
+  - Name:         .rel.dyn
+    Type:         SHT_REL
+    Address:      0x100400
+    AddressAlign: 0x100
+    Info:         .foo
+    Link:         .dynsym
+    Flags:        [SHF_ALLOC]
+    Relocations:
+      - Offset: 8
+        Symbol: 1 # foo
+        Type:   R_X86_64_NONE
+  - Name:         .dynamic
+    Type:         SHT_DYNAMIC
+    Address:      0x100500
+    AddressAlign: 0x100
+    Link:         .dynstr
+    Flags:        [SHF_ALLOC]
+    Entries:
+      - Tag: DT_RELA
+        Value: 0x100200
+      - Tag: DT_RELASZ
+        Value: 24
+      - Tag: DT_RELAENT
+        Value: 24
+      - Tag: DT_JMPREL
+        Value: 0x100300
+      - Tag: DT_PLTREL
+        Value: 7
+      - Tag: DT_PLTRELSZ
+        Value: 24
+      - Tag: DT_REL
+        Value: 0x100400
+      - Tag: DT_RELSZ
+        Value: 16
+      - Tag: DT_RELENT
+        Value: 16
+      - Tag: DT_NULL
+        Value: 0
+ProgramHeaders:
+  - Type:     PT_LOAD
+    VAddr:    0x100000
+    Align:    0x100
+    Sections:
+      - Section: .foo
+      - Section: .rela.dyn
+      - Section: .rela.plt
+      - Section: .rel.dyn
+      - Section: .dynamic
+  - Type:     PT_DYNAMIC
+    VAddr:    0x100500
+    Align:    0x100
+    Sections:
+      - Section: .dynamic
+DynamicSymbols:
+  - Name:    foo
+    Section: .foo
+    Binding: STB_GLOBAL
+  - Name:    bar
+    Type:    STT_FUNC
+    Binding: STB_GLOBAL




More information about the llvm-commits mailing list