llvm/llvm/test/tools/llvm-readobj/ELF/relocations.test

## 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 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:]

## 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": [
# JSON-EXPAND-64-NEXT:   {
# JSON-EXPAND-64-NEXT:   "SectionIndex": 2
# JSON-EXPAND-64-NEXT:   "Relocs": [
# JSON-EXPAND-64-NEXT:     {
# JSON-EXPAND-64-NEXT:       "Relocation": {
# JSON-EXPAND-64-NEXT:         "Offset": 0,
# JSON-EXPAND-64-NEXT:         "Type": {
# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_NONE",
# JSON-EXPAND-64-NEXT:           "Value": 0
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rel_0",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_PC32",
# JSON-EXPAND-64-NEXT:           "Value": 2
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rel_neg",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_PLT32",
# JSON-EXPAND-64-NEXT:           "Value": 4
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rel_pos",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_64",
# JSON-EXPAND-64-NEXT:           "Value": 1
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rel_64",
# JSON-EXPAND-64-NEXT:           "Value": 4
# JSON-EXPAND-64-NEXT:         }
# JSON-EXPAND-64-NEXT:       }
# JSON-EXPAND-64-NEXT:     }
# JSON-EXPAND-64-NEXT:    ]
# JSON-EXPAND-64-NEXT:   },
# JSON-EXPAND-64-NEXT:   {
# JSON-EXPAND-64-NEXT:   "SectionIndex": 3,
# JSON-EXPAND-64-NEXT:   "Relocs": [
# JSON-EXPAND-64-NEXT:     {
# JSON-EXPAND-64-NEXT:       "Relocation": {
# JSON-EXPAND-64-NEXT:         "Offset": 0,
# JSON-EXPAND-64-NEXT:         "Type": {
# JSON-EXPAND-64-NEXT:           "Name": "R_X86_64_NONE",
# JSON-EXPAND-64-NEXT:           "Value": 0
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rela_0",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_PC32",
# JSON-EXPAND-64-NEXT:           "Value": 2
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rela_neg",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_PLT32",
# JSON-EXPAND-64-NEXT:           "Value": 4
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rela_pos",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_64",
# JSON-EXPAND-64-NEXT:           "Value": 1
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rela_minneg",
# JSON-EXPAND-64-NEXT:           "Value": 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:           "Name": "R_X86_64_32S",
# JSON-EXPAND-64-NEXT:           "Value": 11
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Symbol": {
# JSON-EXPAND-64-NEXT:           "Name": "rela_maxpos",
# JSON-EXPAND-64-NEXT:           "Value": 9
# JSON-EXPAND-64-NEXT:         },
# JSON-EXPAND-64-NEXT:         "Addend": 9223372036854775807
# JSON-EXPAND-64-NEXT:       }
# JSON-EXPAND-64-NEXT:     }
# 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=<none>]]
    EntSize: [[ENTSIZEREL=<none>]]
    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=<none>]]
    EntSize: [[ENTSIZERELA=<none>]]
    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 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