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 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 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