[llvm-objdump] - Disassemble non-executable sections if specifically requested.

This is https://bugs.llvm.org/show_bug.cgi?id=41897.

Previously -d + -j .data had no effect, that wasn't consistent with GNU,
which proccesses .data in that case. With this patch we follow this behavior.

Diffeential revision: https://reviews.llvm.org/D62848

llvm-svn: 362596
This commit is contained in:
George Rimar 2019-06-05 11:37:53 +00:00
parent 5a81af547c
commit b42196661b
3 changed files with 53 additions and 8 deletions

View File

@ -0,0 +1,43 @@
# RUN: yaml2obj %s -o %t.o
## By default, only executable sections are disassembled,
## but with the use of the --section flag, we can change this behavior.
## Show that llvm-objdump can disassemble the specified sections.
# RUN: llvm-objdump -d %t.o | FileCheck %s --check-prefix=TEXT \
# RUN: --implicit-check-not=.rodata --implicit-check-not=.data
# RUN: llvm-objdump -d %t.o --section=.rodata \
# RUN: | FileCheck %s --check-prefix=RODATA \
# RUN: --implicit-check-not=.text --implicit-check-not=.data
# RUN: llvm-objdump -d %t.o --section=.rodata --section=.text \
# RUN: | FileCheck %s --check-prefixes=RODATA,TEXT \
# RUN: --implicit-check-not=.data
# RUN: llvm-objdump -d %t.o --section=.rodata --section=.text --section=.data \
# RUN: | FileCheck %s --check-prefixes=RODATA,TEXT,DATA
# RODATA: Disassembly of section .rodata
# TEXT: Disassembly of section .text
# DATA: Disassembly of section .data
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .rodata
Type: SHT_PROGBITS
Flags: [SHF_ALLOC]
Content: '00'
- Name: .text
Type: SHT_PROGBITS
Flags: [SHF_ALLOC, SHF_EXECINSTR]
Content: '00'
- Name: .data
Type: SHT_PROGBITS
Flags: [SHF_ALLOC, SHF_WRITE]
Content: '00'

View File

@ -1,16 +1,11 @@
## Test that --section works correctly for -d with -r.
# RUN: yaml2obj %s -o %t.o
## Show non-executable sections are not disassembled even if specified,
## and that only the specified executable sections are disassembled.
## Show that only the specified sections are disassembled.
## Also show that no relocation sections are dumped because none are
## specified.
## FIXME: This is different behaviour to GNU objdump, which dumps the non-
## executable sections if requested explicitly.
## See https://bugs.llvm.org/show_bug.cgi?id=41897.
# RUN: llvm-objdump -d -r %t.o --section=.text --section=.rodata \
# RUN: | FileCheck %s --check-prefixes=DISASM,RELOC --implicit-check-not=.text2 \
# RUN: --implicit-check-not=.rodata
# RUN: | FileCheck %s --check-prefixes=DISASM,RELOC --implicit-check-not=.text2
# DISASM: Disassembly of section .text:
# DISASM-EMPTY:
@ -18,6 +13,12 @@
# DISASM-NEXT: 400: e8 00 00 00 00 callq 0 <.text+0x5>
# RELOC-NEXT: 00000401: R_X86_64_PC32 foo+1
# RELOC-NEXT: 00000401: R_X86_64_GOT32 foo
# DISASM: Disassembly of section .rodata:
# DISASM-EMPTY:
# DISASM-NEXT: 0000000000000000 .rodata:
# DISASM-NEXT: 0: 00 00 addb %al, (%rax)
# RELOC-NEXT: 0000000000000000: R_X86_64_NONE foo
# DISASM-NEXT: 2: 00 00 addb %al, (%rax)
--- !ELF
FileHeader:

View File

@ -1095,7 +1095,8 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
array_pod_sort(AbsoluteSymbols.begin(), AbsoluteSymbols.end());
for (const SectionRef &Section : ToolSectionFilter(*Obj)) {
if (!DisassembleAll && (!Section.isText() || Section.isVirtual()))
if (FilterSections.empty() && !DisassembleAll &&
(!Section.isText() || Section.isVirtual()))
continue;
uint64_t SectionAddr = Section.getAddress();