## 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: : # 64: : # 64: Disassembly of section .plt.got: # 64-EMPTY: # 64-NEXT: : # 64: : # 64: <_start>: # 64-NEXT: movq {{.*}}(%rip), %rax # 64-NEXT: movq {{.*}}(%rip), %rax # 64-NEXT: callq {{.*}} # 64-NEXT: callq {{.*}} # 64-NEXT: callq {{.*}} # 64-NEXT: callq {{.*}} # 32: Disassembly of section .plt: # 32-EMPTY: # 32-NEXT: <.plt>: # 32: : # 32: : # 32: Disassembly of section .plt.got: # 32-EMPTY: # 32-NEXT: : # 32: : # 32: <_start>: # 32-NEXT: movl -0x8(%eax), %eax # 32-NEXT: movl -0x4(%eax), %eax # 32-NEXT: calll {{.*}} # 32-NEXT: calll {{.*}} # 32-NEXT: calll {{.*}} # 32-NEXT: calll {{.*}} ## %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 ...