| ## 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 |
| ... |