[PATCH] D58174: [yaml2obj] - Do not skip zeroes blocks if there are relocations against them.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 13 05:46:17 PST 2019


grimar created this revision.
grimar added reviewers: echristo, dblaikie, davide, jhenderson.
Herald added a subscriber: rupprecht.

This is for `-D -reloc` combination.

Recently I inspected an ELF object and was confused, because of the whole .rodata section
was skipped for me. It contained zero bytes, but I expected to see the relocations there.
I did not instantly realize that that happens because we skip all zero bytes after the rL350823 <https://reviews.llvm.org/rL350823>.

In this patch, I suggest to not skip the zero bytes that have a relocation against them when `-reloc` is used.
If `-reloc` is not used, then the behavior will be the same.


https://reviews.llvm.org/D58174

Files:
  test/tools/llvm-objdump/disasm-zeroes-relocations.test
  tools/llvm-objdump/llvm-objdump.cpp


Index: tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- tools/llvm-objdump/llvm-objdump.cpp
+++ tools/llvm-objdump/llvm-objdump.cpp
@@ -863,10 +863,6 @@
 // returns the number of zero bytes that can be skipped when dumping the
 // disassembly of the instructions in Buf.
 static size_t countSkippableZeroBytes(ArrayRef<uint8_t> Buf) {
-  // When -z or --disassemble-zeroes are given we always dissasemble them.
-  if (DisassembleZeroes)
-    return 0;
-
   // Find the number of leading zeroes.
   size_t N = 0;
   while (N < Buf.size() && !Buf[N])
@@ -1284,12 +1280,22 @@
         if (Index >= End)
           break;
 
-        if (size_t N =
-                countSkippableZeroBytes(Bytes.slice(Index, End - Index))) {
-          outs() << "\t\t..." << '\n';
-          Index += N;
-          if (Index >= End)
-            break;
+        // When -z or --disassemble-zeroes are given we always dissasemble them.
+        // Otherwise we might want to skip zero bytes we see.
+        if (!DisassembleZeroes) {
+          uint64_t MaxOffset = End - Index;
+          // For -reloc: if we have relocations around, we want to keep zeroes
+          // blocks, because want to show user the relocations.
+          if (RelCur != RelEnd)
+            MaxOffset = RelCur->getOffset() - Index;
+
+          if (size_t N =
+                  countSkippableZeroBytes(Bytes.slice(Index, MaxOffset))) {
+            outs() << "\t\t..." << '\n';
+            Index += N;
+            if (Index >= End)
+              break;
+          }
         }
 
         // Disassemble a real instruction or a data when disassemble all is
Index: test/tools/llvm-objdump/disasm-zeroes-relocations.test
===================================================================
--- /dev/null
+++ test/tools/llvm-objdump/disasm-zeroes-relocations.test
@@ -0,0 +1,44 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objdump -D -reloc %t
+
+## Check we do not skip zeroes blocks if have relocations pointed to these places.
+
+# CHECK:      Disassembly of section .rodata:
+# CHECK-NEXT: 0000000000000000 .rodata:
+# CHECK-NEXT:        0:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:                 0000000000000000:  R_X86_64_64  *ABS*
+# CHECK-NEXT:        2:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:        4:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:        6:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:        8:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:                 0000000000000008:  R_X86_64_64  *ABS*
+# CHECK-NEXT:        a:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:        c:       00 00   addb    %al, (%rax)
+# CHECK-NEXT:        e:       00 00   addb    %al, (%rax)
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .rodata
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    AddressAlign:    0x0000000000000001
+    Content:         '00000000000000000000000000000000'
+  - Name:            .rela.rodata
+    Type:            SHT_RELA
+    Flags:           [ SHF_INFO_LINK ]
+    Link:            .symtab
+    AddressAlign:    0x0000000000000008
+    EntSize:         0x0000000000000018
+    Info:            .rodata
+    Relocations:
+      - Offset:          0x0000000000000000
+        Symbol:          x
+        Type:            R_X86_64_64
+      - Offset:          0x0000000000000008
+        Symbol:          x
+        Type:            R_X86_64_64


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58174.186631.patch
Type: text/x-patch
Size: 3585 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190213/efdb018d/attachment.bin>


More information about the llvm-commits mailing list