diff --git a/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test b/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test --- a/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test +++ b/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test @@ -3,7 +3,7 @@ # When the Other field is 0, the LLVM format prints the output differently, # JSON formatting should always be consistent. -# RUN: yaml2obj %s -o %t.o +# RUN: yaml2obj %s --docnum=1 -o %t.o # RUN: llvm-readobj --symbols %t.o | FileCheck %s --check-prefix=LLVM # RUN: llvm-readobj --symbols --pretty-print --elf-output-style=JSON %t.o | FileCheck %s --check-prefix=JSON @@ -32,7 +32,6 @@ # JSON-NEXT: "Flags": [] # JSON-NEXT: }, - --- !ELF FileHeader: Class: ELFCLASS64 @@ -44,3 +43,365 @@ Other: [ STO_AARCH64_VARIANT_PCS ] - Name: bar Other: [ ] + +## Show that even without --expand-relocs the JSON output is always expanded +## while the LLVM output does not expand + +# RUN: yaml2obj %s --docnum=2 -o %t64 +# RUN: llvm-readobj -r %t64 \ +# RUN: | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines +# RUN: llvm-readobj --relocations %t64 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s --check-prefix=JSON-64 + +# LLVM-64:Relocations [ +# LLVM-64-NEXT: Section (2) .rel.text { +# LLVM-64-NEXT: 0x0 R_X86_64_NONE rel_0 +# LLVM-64-NEXT: 0x1 R_X86_64_PC32 rel_neg +# LLVM-64-NEXT: 0x5 R_X86_64_PLT32 rel_pos +# LLVM-64-NEXT: 0x9 R_X86_64_64 rel_64 +# LLVM-64-NEXT: } +# LLVM-64-NEXT: Section (3) .rela.text { +# LLVM-64-NEXT: 0x0 R_X86_64_NONE rela_0 0x0 +# LLVM-64-NEXT: 0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF +# LLVM-64-NEXT: 0x5 R_X86_64_PLT32 rela_pos 0x2 +# LLVM-64-NEXT: 0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000 +# LLVM-64-NEXT: 0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF +# LLVM-64-NEXT: } +# LLVM-64-NEXT:] + +# JSON-64: "Relocations": [Section (2) .rel.text { +# JSON-64: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 0, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_NONE", +# JSON-64-NEXT: "RawValue": 0 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rel_0", +# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: } +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 1, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_PC32", +# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rel_neg", +# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: } +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 5, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_PLT32", +# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rel_pos", +# JSON-64-NEXT: "RawValue": 3 +# JSON-64-NEXT: } +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 9, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_64", +# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rel_64", +# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: } +# JSON-64-NEXT: } +# JSON-64-NEXT: }} +# JSON-64-NEXT: Section (3) .rela.text { +# JSON-64-NEXT: , +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 0, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_NONE", +# JSON-64-NEXT: "RawValue": 0 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rela_0", +# JSON-64-NEXT: "RawValue": 5 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Addend": 0 +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 1, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_PC32", +# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rela_neg", +# JSON-64-NEXT: "RawValue": 6 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Addend": 18446744073709551615 +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 5, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_PLT32", +# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rela_pos", +# JSON-64-NEXT: "RawValue": 7 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Addend": 2 +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 18446744073709551615, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_64", +# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rela_minneg", +# JSON-64-NEXT: "RawValue": 8 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Addend": 9223372036854775808 +# JSON-64-NEXT: } +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { +# JSON-64-NEXT: "Offset": 9, +# JSON-64-NEXT: "Type": { +# JSON-64-NEXT: "Value": "R_X86_64_32S", +# JSON-64-NEXT: "RawValue": 11 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Symbol": { +# JSON-64-NEXT: "Value": "rela_maxpos", +# JSON-64-NEXT: "RawValue": 9 +# JSON-64-NEXT: }, +# JSON-64-NEXT: "Addend": 9223372036854775807 +# JSON-64-NEXT: } +# JSON-64-NEXT: }} +# JSON-64: ] + +## Show that --expand-relocs expands the relocation dump for LLVM style but +## the JSON output is always expanded + +# RUN: llvm-readobj -r --expand-relocs %t64 \ +# RUN: | FileCheck %s --check-prefix=LLVM-EXPAND-64 --match-full-lines --strict-whitespace +# RUN: llvm-readobj -r --expand-relocs %t64 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s --check-prefix=JSON-64 + +# LLVM-EXPAND-64:Relocations [ +# LLVM-EXPAND-64-NEXT: Section (2) .rel.text { +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x0 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_NONE (0) +# LLVM-EXPAND-64-NEXT: Symbol: rel_0 (1) +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x1 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_PC32 (2) +# LLVM-EXPAND-64-NEXT: Symbol: rel_neg (2) +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x5 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_PLT32 (4) +# LLVM-EXPAND-64-NEXT: Symbol: rel_pos (3) +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x9 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_64 (1) +# LLVM-EXPAND-64-NEXT: Symbol: rel_64 (4) +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Section (3) .rela.text { +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x0 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_NONE (0) +# LLVM-EXPAND-64-NEXT: Symbol: rela_0 (5) +# LLVM-EXPAND-64-NEXT: Addend: 0x0 +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x1 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_PC32 (2) +# LLVM-EXPAND-64-NEXT: Symbol: rela_neg (6) +# LLVM-EXPAND-64-NEXT: Addend: 0xFFFFFFFFFFFFFFFF +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x5 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_PLT32 (4) +# LLVM-EXPAND-64-NEXT: Symbol: rela_pos (7) +# LLVM-EXPAND-64-NEXT: Addend: 0x2 +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0xFFFFFFFFFFFFFFFF +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_64 (1) +# LLVM-EXPAND-64-NEXT: Symbol: rela_minneg (8) +# LLVM-EXPAND-64-NEXT: Addend: 0x8000000000000000 +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: Relocation { +# LLVM-EXPAND-64-NEXT: Offset: 0x9 +# LLVM-EXPAND-64-NEXT: Type: R_X86_64_32S (11) +# LLVM-EXPAND-64-NEXT: Symbol: rela_maxpos (9) +# LLVM-EXPAND-64-NEXT: Addend: 0x7FFFFFFFFFFFFFFF +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT: } +# LLVM-EXPAND-64-NEXT:] + + +# JSON-EXPAND-64:Relocations [ +# JSON-EXPAND-64-NEXT: Section (2) .rel.text { +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x0 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_NONE (0) +# JSON-EXPAND-64-NEXT: Symbol: rel_0 (1) +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x1 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_PC32 (2) +# JSON-EXPAND-64-NEXT: Symbol: rel_neg (2) +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x5 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_PLT32 (4) +# JSON-EXPAND-64-NEXT: Symbol: rel_pos (3) +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x9 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_64 (1) +# JSON-EXPAND-64-NEXT: Symbol: rel_64 (4) +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Section (3) .rela.text { +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x0 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_NONE (0) +# JSON-EXPAND-64-NEXT: Symbol: rela_0 (5) +# JSON-EXPAND-64-NEXT: Addend: 0x0 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x1 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_PC32 (2) +# JSON-EXPAND-64-NEXT: Symbol: rela_neg (6) +# JSON-EXPAND-64-NEXT: Addend: 0xFFFFFFFFFFFFFFFF +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x5 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_PLT32 (4) +# JSON-EXPAND-64-NEXT: Symbol: rela_pos (7) +# JSON-EXPAND-64-NEXT: Addend: 0x2 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0xFFFFFFFFFFFFFFFF +# JSON-EXPAND-64-NEXT: Type: R_X86_64_64 (1) +# JSON-EXPAND-64-NEXT: Symbol: rela_minneg (8) +# JSON-EXPAND-64-NEXT: Addend: 0x8000000000000000 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: Relocation { +# JSON-EXPAND-64-NEXT: Offset: 0x9 +# JSON-EXPAND-64-NEXT: Type: R_X86_64_32S (11) +# JSON-EXPAND-64-NEXT: Symbol: rela_maxpos (9) +# JSON-EXPAND-64-NEXT: Addend: 0x7FFFFFFFFFFFFFFF +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT:] + + + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: '00FFFFFFFF020000001234567890ABCDEF' + - Name: .rel.text + Type: SHT_REL + Info: .text + Link: [[LINK=.symtab]] + ShName: [[SHNAME=]] + EntSize: [[ENTSIZEREL=]] + Relocations: + - Symbol: rel_0 + Type: R_X86_64_NONE + - Offset: 0x1 + Symbol: rel_neg + Type: R_X86_64_PC32 + - Offset: 0x5 + Symbol: rel_pos + Type: R_X86_64_PLT32 + - Offset: 0x9 + Symbol: rel_64 + Type: R_X86_64_64 + - Name: .rela.text + Type: SHT_RELA + Info: .text + Link: [[LINK=.symtab]] + ShName: [[SHNAME=]] + EntSize: [[ENTSIZERELA=]] + Relocations: + - Symbol: rela_0 + Type: R_X86_64_NONE + Addend: 0 + - Offset: 0x1 + Symbol: rela_neg + Type: R_X86_64_PC32 + Addend: -1 + - Offset: 0x5 + Symbol: rela_pos + Type: R_X86_64_PLT32 + Addend: 2 + - Offset: 0xFFFFFFFFFFFFFFFF + Symbol: rela_minneg + Type: R_X86_64_64 + Addend: -9223372036854775808 ## Min 64-bit signed. + - Offset: 0x9 + Symbol: rela_maxpos + Type: R_X86_64_32S + Addend: 9223372036854775807 ## Max 64-bit signed. +Symbols: + - Name: rel_0 + Section: .text + Value: 0 + - Name: rel_neg + Section: .text + Value: 1 + - Name: rel_pos + Section: .text + Value: 2 + - Name: rel_64 + Section: .text + Value: 0xFFFFFFFFFFFFFFFF + - Name: rela_0 + Section: .text + Value: 0 + - Name: rela_neg + Section: .text + Value: 1 + - Name: rela_pos + Section: .text + Value: 2 + - Name: rela_minneg + Section: .text + Value: 3 + - Name: rela_maxpos + Section: .text + Value: 0xFFFFFFFFFFFFFFFF + + diff --git a/llvm/test/tools/llvm-readobj/ELF/relocations.test b/llvm/test/tools/llvm-readobj/ELF/relocations.test --- a/llvm/test/tools/llvm-readobj/ELF/relocations.test +++ b/llvm/test/tools/llvm-readobj/ELF/relocations.test @@ -9,6 +9,7 @@ # RUN: llvm-readobj --relocations %t64 \ # RUN: | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines + # LLVM-64:Relocations [ # LLVM-64-NEXT: Section (2) .rel.text { # LLVM-64-NEXT: 0x0 R_X86_64_NONE rel_0 @@ -47,8 +48,7 @@ # GNU-64-NEXT:ffffffffffffffff 0000000800000001 R_X86_64_64 0000000000000003 rela_minneg - 8000000000000000 # GNU-64-NEXT:0000000000000009 000000090000000b R_X86_64_32S ffffffffffffffff rela_maxpos + 7fffffffffffffff -## Show that --expand-relocs expands the relocation dump for LLVM style only -## (and not GNU). +## Show that --expand-relocs expands the relocation dump for LLVM style and not GNU. # RUN: llvm-readobj -r --expand-relocs %t64 \ # RUN: | FileCheck %s --check-prefix=LLVM-EXPAND-64 --match-full-lines --strict-whitespace # RUN: llvm-readelf -r --expand-relocs %t64 \ @@ -111,6 +111,137 @@ # LLVM-EXPAND-64-NEXT: } # LLVM-EXPAND-64-NEXT:] +# Show that JSON relocations are always expanded +# RUN: llvm-readobj -r %t64 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s --check-prefix=JSON-EXPAND-64 +# RUN: llvm-readobj -r --expand-relocs %t64 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s --check-prefix=JSON-EXPAND-64 + +# JSON-EXPAND-64: "Relocations": [Section (2) .rel.text { +# JSON-EXPAND-64: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 0, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_NONE", +# JSON-EXPAND-64-NEXT: "RawValue": 0 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rel_0", +# JSON-EXPAND-64-NEXT: "RawValue": 1 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 1, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_PC32", +# JSON-EXPAND-64-NEXT: "RawValue": 2 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rel_neg", +# JSON-EXPAND-64-NEXT: "RawValue": 2 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 5, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_PLT32", +# JSON-EXPAND-64-NEXT: "RawValue": 4 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rel_pos", +# JSON-EXPAND-64-NEXT: "RawValue": 3 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 9, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_64", +# JSON-EXPAND-64-NEXT: "RawValue": 1 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rel_64", +# JSON-EXPAND-64-NEXT: "RawValue": 4 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }} +# JSON-EXPAND-64-NEXT: Section (3) .rela.text { +# JSON-EXPAND-64-NEXT: , +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 0, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_NONE", +# JSON-EXPAND-64-NEXT: "RawValue": 0 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rela_0", +# JSON-EXPAND-64-NEXT: "RawValue": 5 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 0 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 1, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_PC32", +# JSON-EXPAND-64-NEXT: "RawValue": 2 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rela_neg", +# JSON-EXPAND-64-NEXT: "RawValue": 6 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 18446744073709551615 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 5, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_PLT32", +# JSON-EXPAND-64-NEXT: "RawValue": 4 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rela_pos", +# JSON-EXPAND-64-NEXT: "RawValue": 7 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 2 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 18446744073709551615, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_64", +# JSON-EXPAND-64-NEXT: "RawValue": 1 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rela_minneg", +# JSON-EXPAND-64-NEXT: "RawValue": 8 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775808 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 9, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Value": "R_X86_64_32S", +# JSON-EXPAND-64-NEXT: "RawValue": 11 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Value": "rela_maxpos", +# JSON-EXPAND-64-NEXT: "RawValue": 9 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775807 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: }} + --- !ELF FileHeader: Class: ELFCLASS64 @@ -202,6 +333,8 @@ # RUN: yaml2obj %s --docnum=1 -DENTSIZEREL=1 -o %t.broken.rel # RUN: llvm-readobj --relocations %t.broken.rel 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-LLVM +# RUN: llvm-readobj --relocations %t.broken.rel --elf-output-style=JSON --pretty-print 2>&1 \ +# RUN: | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-JSON # RUN: llvm-readelf --relocations %t.broken.rel 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-GNU @@ -229,11 +362,74 @@ # BROKEN-REL-GNU-NEXT: ffffffffffffffff 0000000800000001 R_X86_64_64 0000000000000003 rela_minneg - 8000000000000000 # BROKEN-REL-GNU-NEXT: 0000000000000009 000000090000000b R_X86_64_32S ffffffffffffffff rela_maxpos + 7fffffffffffffff +# BROKEN-REL-JSON: "Relocations": [Section (2) .rel.text { +# BROKEN-REL-JSON-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_REL section with index 2: section [index 2] has invalid sh_entsize: expected 16, but got 1 +# BROKEN-REL-JSON: "Relocation": { +# BROKEN-REL-JSON-NEXT: "Offset": 0, +# BROKEN-REL-JSON: "Relocation": { +# BROKEN-REL-JSON-NEXT: "Offset": 1, +# BROKEN-REL-JSON-NEXT: "Type": { +# BROKEN-REL-JSON-NEXT: "Value": "R_X86_64_PC32", +# BROKEN-REL-JSON-NEXT: "RawValue": 2 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Symbol": { +# BROKEN-REL-JSON-NEXT: "Value": "rela_neg", +# BROKEN-REL-JSON-NEXT: "RawValue": 6 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Addend": 18446744073709551615 +# BROKEN-REL-JSON-NEXT: } +# BROKEN-REL-JSON-NEXT:}, +# BROKEN-REL-JSON-NEXT:{ +# BROKEN-REL-JSON-NEXT: "Relocation": { +# BROKEN-REL-JSON-NEXT: "Offset": 5, +# BROKEN-REL-JSON-NEXT: "Type": { +# BROKEN-REL-JSON-NEXT: "Value": "R_X86_64_PLT32", +# BROKEN-REL-JSON-NEXT: "RawValue": 4 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Symbol": { +# BROKEN-REL-JSON-NEXT: "Value": "rela_pos", +# BROKEN-REL-JSON-NEXT: "RawValue": 7 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Addend": 2 +# BROKEN-REL-JSON-NEXT: } +# BROKEN-REL-JSON-NEXT:}, +# BROKEN-REL-JSON-NEXT:{ +# BROKEN-REL-JSON-NEXT: "Relocation": { +# BROKEN-REL-JSON-NEXT: "Offset": 18446744073709551615, +# BROKEN-REL-JSON-NEXT: "Type": { +# BROKEN-REL-JSON-NEXT: "Value": "R_X86_64_64", +# BROKEN-REL-JSON-NEXT: "RawValue": 1 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Symbol": { +# BROKEN-REL-JSON-NEXT: "Value": "rela_minneg", +# BROKEN-REL-JSON-NEXT: "RawValue": 8 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Addend": 9223372036854775808 +# BROKEN-REL-JSON-NEXT: } +# BROKEN-REL-JSON-NEXT:}, +# BROKEN-REL-JSON-NEXT:{ +# BROKEN-REL-JSON-NEXT: "Relocation": { +# BROKEN-REL-JSON-NEXT: "Offset": 9, +# BROKEN-REL-JSON-NEXT: "Type": { +# BROKEN-REL-JSON-NEXT: "Value": "R_X86_64_32S", +# BROKEN-REL-JSON-NEXT: "RawValue": 11 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Symbol": { +# BROKEN-REL-JSON-NEXT: "Value": "rela_maxpos", +# BROKEN-REL-JSON-NEXT: "RawValue": 9 +# BROKEN-REL-JSON-NEXT: }, +# BROKEN-REL-JSON-NEXT: "Addend": 9223372036854775807 +# BROKEN-REL-JSON-NEXT: } +# BROKEN-REL-JSON-NEXT:}} + + ## Case B: check the case when relocations can't be read from an SHT_RELA section. ## because of broken sh_entsize field. # RUN: yaml2obj %s --docnum=1 -DENTSIZERELA=1 -o %t.broken.rela # RUN: llvm-readobj --relocations %t.broken.rela 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-LLVM +# RUN: llvm-readobj --relocations %t.broken.rela 2>&1 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-JSON # RUN: llvm-readelf --relocations %t.broken.rela 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-GNU @@ -260,11 +456,71 @@ # BROKEN-RELA-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # BROKEN-RELA-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has invalid sh_entsize: expected 24, but got 1 + + +# BROKEN-RELA-JSON: "Relocations": [Section (2) .rel.text { +# BROKEN-RELA-JSON: "Relocation": { +# BROKEN-RELA-JSON-NEXT: "Offset": 0, +# BROKEN-RELA-JSON-NEXT: "Type": { +# BROKEN-RELA-JSON-NEXT: "Value": "R_X86_64_NONE", +# BROKEN-RELA-JSON-NEXT: "RawValue": 0 +# BROKEN-RELA-JSON-NEXT: }, +# BROKEN-RELA-JSON-NEXT: "Symbol": { +# BROKEN-RELA-JSON-NEXT: "Value": "rel_0", +# BROKEN-RELA-JSON-NEXT: "RawValue": 1 +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT:}, +# BROKEN-RELA-JSON-NEXT:{ +# BROKEN-RELA-JSON-NEXT: "Relocation": { +# BROKEN-RELA-JSON-NEXT: "Offset": 1, +# BROKEN-RELA-JSON-NEXT: "Type": { +# BROKEN-RELA-JSON-NEXT: "Value": "R_X86_64_PC32", +# BROKEN-RELA-JSON-NEXT: "RawValue": 2 +# BROKEN-RELA-JSON-NEXT: }, +# BROKEN-RELA-JSON-NEXT: "Symbol": { +# BROKEN-RELA-JSON-NEXT: "Value": "rel_neg", +# BROKEN-RELA-JSON-NEXT: "RawValue": 2 +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT:}, +# BROKEN-RELA-JSON-NEXT:{ +# BROKEN-RELA-JSON-NEXT: "Relocation": { +# BROKEN-RELA-JSON-NEXT: "Offset": 5, +# BROKEN-RELA-JSON-NEXT: "Type": { +# BROKEN-RELA-JSON-NEXT: "Value": "R_X86_64_PLT32", +# BROKEN-RELA-JSON-NEXT: "RawValue": 4 +# BROKEN-RELA-JSON-NEXT: }, +# BROKEN-RELA-JSON-NEXT: "Symbol": { +# BROKEN-RELA-JSON-NEXT: "Value": "rel_pos", +# BROKEN-RELA-JSON-NEXT: "RawValue": 3 +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT:}, +# BROKEN-RELA-JSON-NEXT:{ +# BROKEN-RELA-JSON-NEXT: "Relocation": { +# BROKEN-RELA-JSON-NEXT: "Offset": 9, +# BROKEN-RELA-JSON-NEXT: "Type": { +# BROKEN-RELA-JSON-NEXT: "Value": "R_X86_64_64", +# BROKEN-RELA-JSON-NEXT: "RawValue": 1 +# BROKEN-RELA-JSON-NEXT: }, +# BROKEN-RELA-JSON-NEXT: "Symbol": { +# BROKEN-RELA-JSON-NEXT: "Value": "rel_64", +# BROKEN-RELA-JSON-NEXT: "RawValue": 4 +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT: } +# BROKEN-RELA-JSON-NEXT:}} +# BROKEN-RELA-JSON-NEXT:Section (3) .rela.text { +# BROKEN-RELA-JSON-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has invalid sh_entsize: expected 24, but got 1 +# BROKEN-RELA-JSON-NEXT:} + ## Case C: check the case when relocations can't be read from SHT_REL/SHT_RELA sections ## because of broken sh_link fields. # RUN: yaml2obj %s --docnum=1 -DLINK=0xffff -o %t.broken.link # RUN: llvm-readobj --relocations %t.broken.link 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-LLVM +# RUN: llvm-readobj --relocations %t.broken.link 2>&1 --elf-output-style=JSON --pretty-print \ +# RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-JSON # RUN: llvm-readelf --relocations %t.broken.link 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-GNU @@ -285,6 +541,14 @@ # BROKEN-LINK-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535 +# BROKEN-LINK-JSON: "Relocations": [Section (2) .rel.text { +# BROKEN-LINK-JSON-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535 +# BROKEN-LINK-JSON-NEXT:} +# BROKEN-LINK-JSON-NEXT:Section (3) .rela.text { +# BROKEN-LINK-JSON-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535 +# BROKEN-LINK-JSON-NEXT:} +# BROKEN-LINK-JSON-NEXT: ] + ## Show that ELF32 is dumped correctly. # RUN: yaml2obj %s --docnum=2 -o %t32 # RUN: llvm-readobj -r %t32 \ @@ -309,6 +573,122 @@ # LLVM-32-NEXT: } # LLVM-32-NEXT:] +# RUN: llvm-readobj -r %t32 --pretty-print --elf-output-style=JSON \ +# RUN: | FileCheck %s --check-prefix=JSON-32 + +# JSON-32: "Relocations": [Section (2) .rel.text { +# JSON-32: "Relocation": { +# JSON-32-NEXT: "Offset": 0, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_NONE", +# JSON-32-NEXT: "RawValue": 0 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rel_0", +# JSON-32-NEXT: "RawValue": 1 +# JSON-32-NEXT: } +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 1, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_PC32", +# JSON-32-NEXT: "RawValue": 2 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rel_neg", +# JSON-32-NEXT: "RawValue": 2 +# JSON-32-NEXT: } +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 5, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_PLT32", +# JSON-32-NEXT: "RawValue": 4 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rel_pos", +# JSON-32-NEXT: "RawValue": 3 +# JSON-32-NEXT: } +# JSON-32-NEXT: } +# JSON-32-NEXT:}} +# JSON-32-NEXT: Section (3) .rela.text { +# JSON-32-NEXT: , +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 0, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_NONE", +# JSON-32-NEXT: "RawValue": 0 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rela_0", +# JSON-32-NEXT: "RawValue": 4 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Addend": 0 +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 1, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_PC32", +# JSON-32-NEXT: "RawValue": 2 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rela_neg", +# JSON-32-NEXT: "RawValue": 5 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Addend": 4294967295 +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 5, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_PLT32", +# JSON-32-NEXT: "RawValue": 4 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rela_pos", +# JSON-32-NEXT: "RawValue": 6 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Addend": 2 +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 4294967295, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_32", +# JSON-32-NEXT: "RawValue": 1 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rela_minneg", +# JSON-32-NEXT: "RawValue": 7 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Addend": 2147483648 +# JSON-32-NEXT: } +# JSON-32-NEXT:}, +# JSON-32-NEXT:{ +# JSON-32-NEXT: "Relocation": { +# JSON-32-NEXT: "Offset": 9, +# JSON-32-NEXT: "Type": { +# JSON-32-NEXT: "Value": "R_386_GOT32", +# JSON-32-NEXT: "RawValue": 3 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Symbol": { +# JSON-32-NEXT: "Value": "rela_maxpos", +# JSON-32-NEXT: "RawValue": 8 +# JSON-32-NEXT: }, +# JSON-32-NEXT: "Addend": 2147483647 +# JSON-32-NEXT: } +# JSON-32-NEXT:}} + + # RUN: llvm-readelf -r %t32 \ # RUN: | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines # RUN: llvm-readelf --relocs %t32 \ @@ -330,13 +710,16 @@ # GNU-32-NEXT:ffffffff 00000701 R_386_32 00000003 rela_minneg - 80000000 # GNU-32-NEXT:00000009 00000803 R_386_GOT32 ffffffff rela_maxpos + 7fffffff -## Show that --expand-relocs expands the relocation dump for LLVM style only -## (and not GNU). +## Show that --expand-relocs expands the relocation dump for LLVM style and not GNU. # RUN: llvm-readobj -r --expand-relocs %t32 \ # RUN: | FileCheck %s --check-prefix=LLVM-EXPAND-32 --strict-whitespace --match-full-lines # RUN: llvm-readelf -r --expand-relocs %t32 \ # RUN: | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines +## Show that JSON outup always expands relocations +# RUN: llvm-readobj -r --expand-relocs %t32 --elf-output-style=JSON --pretty-print\ +# RUN: | FileCheck %s --check-prefix=JSON-32 + # LLVM-EXPAND-32:Relocations [ # LLVM-EXPAND-32-NEXT: Section (2) .rel.text { # LLVM-EXPAND-32-NEXT: Relocation { @@ -463,6 +846,7 @@ ## Check we report a warning when the name of a relocation section can't be read. Check we continue dumping. # RUN: yaml2obj %s --docnum=1 -DSHNAME=0xffffffff -o %tshname # RUN: llvm-readobj --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=LLVM-SHNAME +# RUN: llvm-readobj --relocs %tshname --elf-output-style=JSON --pretty-print 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=JSON-SHNAME # RUN: llvm-readelf --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=GNU-SHNAME # LLVM-SHNAME: Relocations [ @@ -483,6 +867,132 @@ # LLVM-SHNAME-NEXT: } # LLVM-SHNAME-NEXT: ] +# JSON-SHNAME: "Relocations": [ +# JSON-SHNAME-SAME: warning: '[[FILE]]': unable to get the name of SHT_REL section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table +# JSON-SHNAME-NEXT: Section (2) { +# JSON-SHNAME: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 0, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_NONE", +# JSON-SHNAME-NEXT: "RawValue": 0 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rel_0", +# JSON-SHNAME-NEXT: "RawValue": 1 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 1, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_PC32", +# JSON-SHNAME-NEXT: "RawValue": 2 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rel_neg", +# JSON-SHNAME-NEXT: "RawValue": 2 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 5, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_PLT32", +# JSON-SHNAME-NEXT: "RawValue": 4 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rel_pos", +# JSON-SHNAME-NEXT: "RawValue": 3 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 9, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_64", +# JSON-SHNAME-NEXT: "RawValue": 1 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rel_64", +# JSON-SHNAME-NEXT: "RawValue": 4 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }} +# JSON-SHNAME: warning: '[[FILE]]': unable to get the name of SHT_RELA section with index 3: a section [index 3] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table +# JSON-SHNAME-NEXT: Section (3) { +# JSON-SHNAME: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 0, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_NONE", +# JSON-SHNAME-NEXT: "RawValue": 0 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rela_0", +# JSON-SHNAME-NEXT: "RawValue": 5 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Addend": 0 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 1, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_PC32", +# JSON-SHNAME-NEXT: "RawValue": 2 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rela_neg", +# JSON-SHNAME-NEXT: "RawValue": 6 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Addend": 18446744073709551615 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 5, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_PLT32", +# JSON-SHNAME-NEXT: "RawValue": 4 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rela_pos", +# JSON-SHNAME-NEXT: "RawValue": 7 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Addend": 2 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 18446744073709551615, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_64", +# JSON-SHNAME-NEXT: "RawValue": 1 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rela_minneg", +# JSON-SHNAME-NEXT: "RawValue": 8 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Addend": 9223372036854775808 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: { +# JSON-SHNAME-NEXT: "Relocation": { +# JSON-SHNAME-NEXT: "Offset": 9, +# JSON-SHNAME-NEXT: "Type": { +# JSON-SHNAME-NEXT: "Value": "R_X86_64_32S", +# JSON-SHNAME-NEXT: "RawValue": 11 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Symbol": { +# JSON-SHNAME-NEXT: "Value": "rela_maxpos", +# JSON-SHNAME-NEXT: "RawValue": 9 +# JSON-SHNAME-NEXT: }, +# JSON-SHNAME-NEXT: "Addend": 9223372036854775807 +# JSON-SHNAME-NEXT: } +# JSON-SHNAME-NEXT: }} + # GNU-SHNAME: warning: '[[FILE]]': unable to get the name of SHT_REL section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table # GNU-SHNAME: Relocation section '' at offset 0x51 contains 4 entries: # GNU-SHNAME-NEXT: Offset Info Type Symbol's Value Symbol's Name @@ -505,6 +1015,8 @@ # RUN: yaml2obj %s --docnum=3 -o %t3 # RUN: llvm-readobj --relocs %t3 2>&1 | \ # RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=LLVM-SYMNDX +# RUN: llvm-readobj --relocs %t3 --elf-output-style=JSON --pretty-print 2>&1 | \ +# RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=JSON-SYMNDX # RUN: llvm-readelf --relocs %t3 2>&1 | \ # RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=GNU-SYMNDX @@ -515,6 +1027,13 @@ # LLVM-SYMNDX-NEXT: } # LLVM-SYMNDX-NEXT: ] +# JSON-SYMNDX: "Relocations": [ +# JSON-SYMNDX-SAME: Section (1) .rela.text { +# JSON-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 0 in SHT_RELA section with index 1: unable to read an entry with index 2 from SHT_SYMTAB section with index 2: can't read an entry at 0x30: it goes past the end of the section (0x30) +# JSON-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 1 in SHT_RELA section with index 1: unable to read an entry with index 3 from SHT_SYMTAB section with index 2: can't read an entry at 0x48: it goes past the end of the section (0x30) +# JSON-SYMNDX-NEXT: } +# JSON-SYMNDX-NEXT: ] + # GNU-SYMNDX: Relocation section '.rela.text' at offset 0x40 contains 2 entries: # GNU-SYMNDX-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # GNU-SYMNDX-NEXT: warning: '[[FILE]]': unable to print relocation 0 in SHT_RELA section with index 1: unable to read an entry with index 2 from SHT_SYMTAB section with index 2: can't read an entry at 0x30: it goes past the end of the section (0x30) diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -708,6 +708,13 @@ protected: void printSymbolOtherField(const Elf_Sym &Symbol) const; + virtual void printExpandedRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName); + virtual void printDefaultRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName); + ScopedPrinter &W; }; @@ -725,6 +732,10 @@ const Archive *A) override; virtual void printZeroSymbolOtherField(const Elf_Sym &Symbol) const override; + void printDefaultRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName) override; + private: std::unique_ptr FileScope; }; @@ -6684,6 +6695,30 @@ W.startLine() << W.hex(R) << "\n"; } +template +void LLVMELFDumper::printExpandedRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName) { + DictScope Group(W, "Relocation"); + W.printHex("Offset", R.Offset); + W.printNumber("Type", RelocName, R.Type); + W.printNumber("Symbol", !SymbolName.empty() ? SymbolName : "-", R.Symbol); + if (R.Addend) + W.printHex("Addend", (uintX_t)*R.Addend); +} + +template +void LLVMELFDumper::printDefaultRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName) { + raw_ostream &OS = W.startLine(); + OS << W.hex(R.Offset) << " " << RelocName << " " + << (!SymbolName.empty() ? SymbolName : "-"); + if (R.Addend) + OS << " " << W.hex((uintX_t)*R.Addend); + OS << "\n"; +} + template void LLVMELFDumper::printRelRelaReloc(const Relocation &R, const RelSymbol &RelSym) { @@ -6692,19 +6727,9 @@ this->Obj.getRelocationTypeName(R.Type, RelocName); if (opts::ExpandRelocs) { - DictScope Group(W, "Relocation"); - W.printHex("Offset", R.Offset); - W.printNumber("Type", RelocName, R.Type); - W.printNumber("Symbol", !SymbolName.empty() ? SymbolName : "-", R.Symbol); - if (R.Addend) - W.printHex("Addend", (uintX_t)*R.Addend); + printExpandedRelRelaReloc(R, SymbolName, RelocName); } else { - raw_ostream &OS = W.startLine(); - OS << W.hex(R.Offset) << " " << RelocName << " " - << (!SymbolName.empty() ? SymbolName : "-"); - if (R.Addend) - OS << " " << W.hex((uintX_t)*R.Addend); - OS << "\n"; + printDefaultRelRelaReloc(R, SymbolName, RelocName); } } @@ -7585,3 +7610,10 @@ const Elf_Sym &Symbol) const { this->printSymbolOtherField(Symbol); } + +template +void JSONELFDumper::printDefaultRelRelaReloc(const Relocation &R, + const StringRef SymbolName, + const StringRef RelocName) { + this->printExpandedRelRelaReloc(R, SymbolName, RelocName); +}