llvm/llvm/test/tools/llvm-objdump/X86/plt-got.test

## If a symbol needing a PLT entry also needs a GLOB_DAT relocation, GNU ld's
## x86 port places the PLT entry in .plt.got, relocated by a GLOB_DAT. The
## JUMP_SLOT relocation is unused in this case.
## Test that we synthesize @plt symbols for such PLT entries.
# RUN: yaml2obj --docnum=1 %s -o %t.x86-64
# RUN: llvm-objdump -d %t.x86-64 | FileCheck %s --check-prefix=64
# RUN: yaml2obj --docnum=2 %s -o %t.x86-32
# RUN: llvm-objdump -d %t.x86-32 | FileCheck %s --check-prefix=32

# 64:      Disassembly of section .plt:
# 64-EMPTY:
# 64-NEXT: <.plt>:
# 64:      <foo1@plt>:
# 64:      <foo0@plt>:

# 64:      Disassembly of section .plt.got:
# 64-EMPTY:
# 64-NEXT: <combined0@plt>:
# 64:      <combined1@plt>:

# 64:      <_start>:
# 64-NEXT:   movq    {{.*}}(%rip), %rax
# 64-NEXT:   movq    {{.*}}(%rip), %rax
# 64-NEXT:   callq   {{.*}} <combined0@plt>
# 64-NEXT:   callq   {{.*}} <combined1@plt>
# 64-NEXT:   callq   {{.*}} <foo0@plt>
# 64-NEXT:   callq   {{.*}} <foo1@plt>

# 32:      Disassembly of section .plt:
# 32-EMPTY:
# 32-NEXT: <.plt>:
# 32:      <foo1@plt>:
# 32:      <foo0@plt>:

# 32:      Disassembly of section .plt.got:
# 32-EMPTY:
# 32-NEXT: <combined0@plt>:
# 32:      <combined1@plt>:

# 32:      <_start>:
# 32-NEXT:   movl    -0x8(%eax), %eax
# 32-NEXT:   movl    -0x4(%eax), %eax
# 32-NEXT:   calll   {{.*}} <combined0@plt>
# 32-NEXT:   calll   {{.*}} <combined1@plt>
# 32-NEXT:   calll   {{.*}} <foo0@plt>
# 32-NEXT:   calll   {{.*}} <foo1@plt>

## %t.x86-64 is linked with ld.bfd -pie -z now a.o b.so and
## doesn't have .got.plt.
## %t.x86-32 is linked with ld.bfd -pie -z lazy a.o b.so and
## has .got.plt.

## a.s
## .globl _start; _start:
## mov combined0@gotpcrel(%rip), %rax  # movl combined0@GOT(%eax), %eax  for x86-32
## mov combined1@gotpcrel(%rip), %rax  # movl combined1@GOT(%eax), %eax  for x86-32
## call combined0@plt
## call combined1@plt
## call foo0@plt
## call foo1@plt

## b.s
## .globl foo0, foo1, combined0, combined1
## foo0: foo1: combined0: combined1:

--- !ELF
FileHeader:
  Class:           ELFCLASS64
  Data:            ELFDATA2LSB
  Type:            ET_DYN
  Machine:         EM_X86_64
  Entry:           0x1040
Sections:
  - Name:            .rela.dyn
    Type:            SHT_RELA
    Flags:           [ SHF_ALLOC ]
    Address:         0x340
    Link:            .dynsym
    AddressAlign:    0x8
    Relocations:
      - Offset:          0x2FF0
        Symbol:          combined0
        Type:            R_X86_64_GLOB_DAT
      - Offset:          0x2FF8
        Symbol:          combined1
        Type:            R_X86_64_GLOB_DAT
  - Name:            .rela.plt
    Type:            SHT_RELA
    Flags:           [ SHF_ALLOC, SHF_INFO_LINK ]
    Address:         0x370
    Link:            .dynsym
    AddressAlign:    0x8
    Info:            .got
    Relocations:
      - Offset:          0x2FE0
        Symbol:          foo1
        Type:            R_X86_64_JUMP_SLOT
      - Offset:          0x2FE8
        Symbol:          foo0
        Type:            R_X86_64_JUMP_SLOT
  - Name:            .plt
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1000
    AddressAlign:    0x10
    EntSize:         0x10
    Offset:          0x1000
    Content:         FF35CA1F0000FF25CC1F00000F1F4000FF25CA1F00006800000000E9E0FFFFFFFF25C21F00006801000000E9D0FFFFFF
  - Name:            .plt.got
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1030
    AddressAlign:    0x8
    EntSize:         0x8
    Content:         FF25BA1F00006690FF25BA1F00006690
  - Name:            .text
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1040
    AddressAlign:    0x1
    Content:         488B05A91F0000488B05AA1F0000E8DDFFFFFFE8E0FFFFFFE8C3FFFFFFE8AEFFFFFF
  - Name:            .got
    Type:            SHT_PROGBITS
    Flags:           [ SHF_WRITE, SHF_ALLOC ]
    Address:         0x2FC8
    AddressAlign:    0x8
    EntSize:         0x8
    Content:         '682E000000000000000000000000000000000000000000001610000000000000261000000000000000000000000000000000000000000000'
Symbols:
  - Name:            _start
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x1040
DynamicSymbols:
  - Name:            foo1
    Binding:         STB_GLOBAL
  - Name:            foo0
    Binding:         STB_GLOBAL
  - Name:            combined0
    Binding:         STB_GLOBAL
  - Name:            combined1
    Binding:         STB_GLOBAL
...

--- !ELF
FileHeader:
  Class:           ELFCLASS32
  Data:            ELFDATA2LSB
  Type:            ET_DYN
  Machine:         EM_386
  Entry:           0x1040
Sections:
  - Name:            .rel.dyn
    Type:            SHT_REL
    Flags:           [ SHF_ALLOC ]
    Address:         0x218
    Link:            .dynsym
    AddressAlign:    0x4
    Relocations:
      - Offset:          0x2FEC
        Symbol:          combined0
        Type:            R_386_GLOB_DAT
      - Offset:          0x2FF0
        Symbol:          combined1
        Type:            R_386_GLOB_DAT
  - Name:            .rel.plt
    Type:            SHT_REL
    Flags:           [ SHF_ALLOC, SHF_INFO_LINK ]
    Address:         0x228
    Link:            .dynsym
    AddressAlign:    0x4
    Info:            .got.plt
    Relocations:
      - Offset:          0x3000
        Symbol:          foo1
        Type:            R_386_JUMP_SLOT
      - Offset:          0x3004
        Symbol:          foo0
        Type:            R_386_JUMP_SLOT
  - Name:            .plt
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1000
    AddressAlign:    0x10
    EntSize:         0x4
    Offset:          0x1000
    Content:         FFB304000000FFA30800000000000000FFA30C0000006800000000E9E0FFFFFFFFA3100000006808000000E9D0FFFFFF
  - Name:            .plt.got
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1030
    AddressAlign:    0x8
    EntSize:         0x8
    Content:         FFA3F8FFFFFF6690FFA3FCFFFFFF6690
  - Name:            .text
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    Address:         0x1040
    AddressAlign:    0x1
    Content:         8B80F8FFFFFF8B80FCFFFFFFE8DFFFFFFFE8E2FFFFFFE8C5FFFFFFE8B0FFFFFF
  - Name:            .got
    Type:            SHT_PROGBITS
    Flags:           [ SHF_WRITE, SHF_ALLOC ]
    Address:         0x2FEC
    AddressAlign:    0x4
    EntSize:         0x4
    Content:         '0000000000000000'
  - Name:            .got.plt
    Type:            SHT_PROGBITS
    Flags:           [ SHF_WRITE, SHF_ALLOC ]
    Address:         0x2FF4
    AddressAlign:    0x4
    EntSize:         0x4
    Content:         442F000000000000000000001610000026100000
Symbols:
  - Name:            _GLOBAL_OFFSET_TABLE_
    Type:            STT_OBJECT
    Section:         .got.plt
    Value:           0x2FF4
  - Name:            _start
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x1040
DynamicSymbols:
  - Name:            combined0
    Binding:         STB_GLOBAL
  - Name:            foo1
    Binding:         STB_GLOBAL
  - Name:            foo0
    Binding:         STB_GLOBAL
  - Name:            combined1
    Binding:         STB_GLOBAL
...