## Check llvm-readobj and llvm-readelf print relocations as expected. ## Show that ELF64 is dumped correctly. # RUN: yaml2obj %s --docnum=1 -o %t64 # RUN: llvm-readobj -r %t64 \ # RUN: | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines # RUN: llvm-readobj --relocs %t64 \ # RUN: | FileCheck %s --check-prefix=LLVM-64 --strict-whitespace --match-full-lines # 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 # 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:] # RUN: llvm-readelf -r %t64 \ # RUN: | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines # RUN: llvm-readelf --relocs %t64 \ # RUN: | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines # RUN: llvm-readelf --relocations %t64 \ # RUN: | FileCheck %s --check-prefix=GNU-64 --strict-whitespace --match-full-lines # GNU-64:Relocation section '.rel.text' at offset 0x51 contains 4 entries: # GNU-64-NEXT: Offset Info Type Symbol's Value Symbol's Name # GNU-64-NEXT:0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 rel_0 # GNU-64-NEXT:0000000000000001 0000000200000002 R_X86_64_PC32 0000000000000001 rel_neg # GNU-64-NEXT:0000000000000005 0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos # GNU-64-NEXT:0000000000000009 0000000400000001 R_X86_64_64 ffffffffffffffff rel_64 # GNU-64-EMPTY: # GNU-64-NEXT:Relocation section '.rela.text' at offset 0x91 contains 5 entries: # GNU-64-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # GNU-64-NEXT:0000000000000000 0000000500000000 R_X86_64_NONE 0000000000000000 rela_0 + 0 # GNU-64-NEXT:0000000000000001 0000000600000002 R_X86_64_PC32 0000000000000001 rela_neg - 1 # GNU-64-NEXT:0000000000000005 0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2 # 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). # 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 \ # RUN: | FileCheck %s --check-prefix=GNU-64 --match-full-lines --strict-whitespace # 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:] --- !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 ## Check we report a warning when we are unable to dump relocations for a section. ## Check we continue dumping other relocation sections if any. ## Case A: check the case when relocations can't be read from an SHT_REL section. ## because of broken sh_entsize field. # 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-readelf --relocations %t.broken.rel 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-GNU # BROKEN-REL-LLVM: Relocations [ # BROKEN-REL-LLVM-NEXT: Section (2) .rel.text { # BROKEN-REL-LLVM-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-LLVM-NEXT: } # BROKEN-REL-LLVM-NEXT: Section (3) .rela.text { # BROKEN-REL-LLVM-NEXT: 0x0 R_X86_64_NONE rela_0 0x0 # BROKEN-REL-LLVM-NEXT: 0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF # BROKEN-REL-LLVM-NEXT: 0x5 R_X86_64_PLT32 rela_pos 0x2 # BROKEN-REL-LLVM-NEXT: 0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000 # BROKEN-REL-LLVM-NEXT: 0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF # BROKEN-REL-LLVM-NEXT: } # BROKEN-REL-LLVM-NEXT: ] # BROKEN-REL-GNU: Relocation section '.rel.text' at offset 0x51 contains 64 entries: # BROKEN-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name # BROKEN-REL-GNU-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-GNU: Relocation section '.rela.text' at offset 0x91 contains 5 entries: # BROKEN-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name # BROKEN-REL-GNU-NEXT: 0000000000000000 0000000500000000 R_X86_64_NONE 0000000000000000 rela_0 + 0 # BROKEN-REL-GNU-NEXT: 0000000000000001 0000000600000002 R_X86_64_PC32 0000000000000001 rela_neg - 1 # BROKEN-REL-GNU-NEXT: 0000000000000005 0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2 # 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 ## 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-readelf --relocations %t.broken.rela 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-GNU # BROKEN-RELA-LLVM: Relocations [ # BROKEN-RELA-LLVM-NEXT: Section (2) .rel.text { # BROKEN-RELA-LLVM-NEXT: 0x0 R_X86_64_NONE rel_0{{$}} # BROKEN-RELA-LLVM-NEXT: 0x1 R_X86_64_PC32 rel_neg{{$}} # BROKEN-RELA-LLVM-NEXT: 0x5 R_X86_64_PLT32 rel_pos{{$}} # BROKEN-RELA-LLVM-NEXT: 0x9 R_X86_64_64 rel_64{{$}} # BROKEN-RELA-LLVM-NEXT: } # BROKEN-RELA-LLVM-NEXT: Section (3) .rela.text { # BROKEN-RELA-LLVM-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-LLVM-NEXT: } # BROKEN-RELA-LLVM-NEXT: ] # BROKEN-RELA-GNU: Relocation section '.rel.text' at offset 0x51 contains 4 entries: # BROKEN-RELA-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name # BROKEN-RELA-GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 rel_0 # BROKEN-RELA-GNU-NEXT: 0000000000000001 0000000200000002 R_X86_64_PC32 0000000000000001 rel_neg # BROKEN-RELA-GNU-NEXT: 0000000000000005 0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos # BROKEN-RELA-GNU-NEXT: 0000000000000009 0000000400000001 R_X86_64_64 ffffffffffffffff rel_64 # BROKEN-RELA-GNU-EMPTY: # BROKEN-RELA-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 120 entries: # 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 ## 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-readelf --relocations %t.broken.link 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-GNU # BROKEN-LINK-LLVM: Relocations [ # BROKEN-LINK-LLVM-NEXT: Section (2) .rel.text { # BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535 # BROKEN-LINK-LLVM-NEXT: } # BROKEN-LINK-LLVM-NEXT: Section (3) .rela.text { # BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535 # BROKEN-LINK-LLVM-NEXT: } # BROKEN-LINK-LLVM-NEXT: ] # BROKEN-LINK-GNU: Relocation section '.rel.text' at offset 0x51 contains 4 entries: # BROKEN-LINK-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name # BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535 # BROKEN-LINK-GNU-EMPTY: # BROKEN-LINK-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 5 entries: # 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 ## Show that ELF32 is dumped correctly. # RUN: yaml2obj %s --docnum=2 -o %t32 # RUN: llvm-readobj -r %t32 \ # RUN: | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines # RUN: llvm-readobj --relocs %t32 \ # RUN: | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines # RUN: llvm-readobj --relocations %t32 \ # RUN: | FileCheck %s --check-prefix=LLVM-32 --strict-whitespace --match-full-lines # LLVM-32:Relocations [ # LLVM-32-NEXT: Section (2) .rel.text { # LLVM-32-NEXT: 0x0 R_386_NONE rel_0 # LLVM-32-NEXT: 0x1 R_386_PC32 rel_neg # LLVM-32-NEXT: 0x5 R_386_PLT32 rel_pos # LLVM-32-NEXT: } # LLVM-32-NEXT: Section (3) .rela.text { # LLVM-32-NEXT: 0x0 R_386_NONE rela_0 0x0 # LLVM-32-NEXT: 0x1 R_386_PC32 rela_neg 0xFFFFFFFF # LLVM-32-NEXT: 0x5 R_386_PLT32 rela_pos 0x2 # LLVM-32-NEXT: 0xFFFFFFFF R_386_32 rela_minneg 0x80000000 # LLVM-32-NEXT: 0x9 R_386_GOT32 rela_maxpos 0x7FFFFFFF # LLVM-32-NEXT: } # LLVM-32-NEXT:] # RUN: llvm-readelf -r %t32 \ # RUN: | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines # RUN: llvm-readelf --relocs %t32 \ # RUN: | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines # RUN: llvm-readelf --relocations %t32 \ # RUN: | FileCheck %s --check-prefix=GNU-32 --strict-whitespace --match-full-lines # GNU-32:Relocation section '.rel.text' at offset 0x3d contains 3 entries: # GNU-32-NEXT: Offset Info Type Sym. Value Symbol's Name # GNU-32-NEXT:00000000 00000100 R_386_NONE 00000000 rel_0 # GNU-32-NEXT:00000001 00000202 R_386_PC32 00000001 rel_neg # GNU-32-NEXT:00000005 00000304 R_386_PLT32 ffffffff rel_pos # GNU-32-EMPTY: # GNU-32-NEXT:Relocation section '.rela.text' at offset 0x55 contains 5 entries: # GNU-32-NEXT: Offset Info Type Sym. Value Symbol's Name + Addend # GNU-32-NEXT:00000000 00000400 R_386_NONE 00000000 rela_0 + 0 # GNU-32-NEXT:00000001 00000502 R_386_PC32 00000001 rela_neg - 1 # GNU-32-NEXT:00000005 00000604 R_386_PLT32 00000002 rela_pos + 2 # 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). # 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 # LLVM-EXPAND-32:Relocations [ # LLVM-EXPAND-32-NEXT: Section (2) .rel.text { # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x0 # LLVM-EXPAND-32-NEXT: Type: R_386_NONE (0) # LLVM-EXPAND-32-NEXT: Symbol: rel_0 (1) # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x1 # LLVM-EXPAND-32-NEXT: Type: R_386_PC32 (2) # LLVM-EXPAND-32-NEXT: Symbol: rel_neg (2) # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x5 # LLVM-EXPAND-32-NEXT: Type: R_386_PLT32 (4) # LLVM-EXPAND-32-NEXT: Symbol: rel_pos (3) # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Section (3) .rela.text { # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x0 # LLVM-EXPAND-32-NEXT: Type: R_386_NONE (0) # LLVM-EXPAND-32-NEXT: Symbol: rela_0 (4) # LLVM-EXPAND-32-NEXT: Addend: 0x0 # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x1 # LLVM-EXPAND-32-NEXT: Type: R_386_PC32 (2) # LLVM-EXPAND-32-NEXT: Symbol: rela_neg (5) # LLVM-EXPAND-32-NEXT: Addend: 0xFFFFFFFF # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x5 # LLVM-EXPAND-32-NEXT: Type: R_386_PLT32 (4) # LLVM-EXPAND-32-NEXT: Symbol: rela_pos (6) # LLVM-EXPAND-32-NEXT: Addend: 0x2 # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0xFFFFFFFF # LLVM-EXPAND-32-NEXT: Type: R_386_32 (1) # LLVM-EXPAND-32-NEXT: Symbol: rela_minneg (7) # LLVM-EXPAND-32-NEXT: Addend: 0x80000000 # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: Relocation { # LLVM-EXPAND-32-NEXT: Offset: 0x9 # LLVM-EXPAND-32-NEXT: Type: R_386_GOT32 (3) # LLVM-EXPAND-32-NEXT: Symbol: rela_maxpos (8) # LLVM-EXPAND-32-NEXT: Addend: 0x7FFFFFFF # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT: } # LLVM-EXPAND-32-NEXT:] --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_REL Machine: EM_386 Sections: - Name: .text Type: SHT_PROGBITS Content: '00FFFFFFFF02000000' - Name: .rel.text Type: SHT_REL Info: .text Relocations: - Symbol: rel_0 Type: R_386_NONE - Offset: 0x1 Symbol: rel_neg Type: R_386_PC32 - Offset: 0x5 Symbol: rel_pos Type: R_386_PLT32 - Name: .rela.text Type: SHT_RELA Info: .text Relocations: - Symbol: rela_0 Type: R_386_NONE Addend: 0 - Offset: 0x1 Symbol: rela_neg Type: R_386_PC32 Addend: -1 - Offset: 0x5 Symbol: rela_pos Type: R_386_PLT32 Addend: 2 - Offset: 0xFFFFFFFF Symbol: rela_minneg Type: R_386_32 Addend: -2147483648 ## Min 32-bit signed. - Offset: 0x9 Symbol: rela_maxpos Type: R_386_GOT32 Addend: 2147483647 ## Max 32-bit signed. Symbols: - Name: rel_0 Section: .text Value: 0 - Name: rel_neg Section: .text Value: 1 - Name: rel_pos Section: .text Value: 0xFFFFFFFF - 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: 0xFFFFFFFF ## 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-readelf --relocs %tshname 2>&1 | FileCheck %s -DFILE=%tshname --check-prefix=GNU-SHNAME # LLVM-SHNAME: Relocations [ # LLVM-SHNAME-NEXT: 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 # LLVM-SHNAME-NEXT: Section (2) { # LLVM-SHNAME-NEXT: 0x0 R_X86_64_NONE rel_0{{$}} # LLVM-SHNAME-NEXT: 0x1 R_X86_64_PC32 rel_neg{{$}} # LLVM-SHNAME-NEXT: 0x5 R_X86_64_PLT32 rel_pos{{$}} # LLVM-SHNAME-NEXT: 0x9 R_X86_64_64 rel_64{{$}} # LLVM-SHNAME-NEXT: } # LLVM-SHNAME-NEXT: 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 # LLVM-SHNAME-NEXT: Section (3) { # LLVM-SHNAME-NEXT: 0x0 R_X86_64_NONE rela_0 0x0 # LLVM-SHNAME-NEXT: 0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF # LLVM-SHNAME-NEXT: 0x5 R_X86_64_PLT32 rela_pos 0x2 # LLVM-SHNAME-NEXT: 0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000 # LLVM-SHNAME-NEXT: 0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF # LLVM-SHNAME-NEXT: } # LLVM-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 # GNU-SHNAME-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 rel_0 # GNU-SHNAME-NEXT: 0000000000000001 0000000200000002 R_X86_64_PC32 0000000000000001 rel_neg # GNU-SHNAME-NEXT: 0000000000000005 0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos # GNU-SHNAME-NEXT: 0000000000000009 0000000400000001 R_X86_64_64 ffffffffffffffff rel_64 # GNU-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 # GNU-SHNAME: Relocation section '' at offset 0x91 contains 5 entries: # GNU-SHNAME-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend # GNU-SHNAME-NEXT: 0000000000000000 0000000500000000 R_X86_64_NONE 0000000000000000 rela_0 + 0 # GNU-SHNAME-NEXT: 0000000000000001 0000000600000002 R_X86_64_PC32 0000000000000001 rela_neg - 1 # GNU-SHNAME-NEXT: 0000000000000005 0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2 # GNU-SHNAME-NEXT: ffffffffffffffff 0000000800000001 R_X86_64_64 0000000000000003 rela_minneg - 8000000000000000 # GNU-SHNAME-NEXT: 0000000000000009 000000090000000b R_X86_64_32S ffffffffffffffff rela_maxpos + 7fffffffffffffff ## Check that we report a warning when a relocation has a ## symbol index past the end of the symbol table # 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-readelf --relocs %t3 2>&1 | \ # RUN: FileCheck %s --implicit-check-not=warning: -DFILE=%t3 --check-prefix=GNU-SYMNDX # LLVM-SYMNDX: Relocations [ # LLVM-SYMNDX-NEXT: Section (1) .rela.text { # LLVM-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) # LLVM-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) # LLVM-SYMNDX-NEXT: } # LLVM-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) # GNU-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) --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .rela.text Type: SHT_RELA Relocations: - Type: R_X86_64_NONE Symbol: 0x2 - Type: R_X86_64_NONE Symbol: 0x3 Symbols: - Name: foo