diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:57:38 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:57:38 +0000 |
| commit | 5a5c549fe9a3fef595297bd21d36bed8409dc37d (patch) | |
| tree | a964c8f5ac85b7b641cac022c5f9bf4eed3d2b9b /test/old-elf | |
| parent | fb911942f1434f3d1750f83f25f5e42c80e60638 (diff) | |
Notes
Diffstat (limited to 'test/old-elf')
640 files changed, 37769 insertions, 0 deletions
diff --git a/test/old-elf/AArch64/Inputs/fn.c b/test/old-elf/AArch64/Inputs/fn.c new file mode 100644 index 000000000000..54939a2426b2 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/fn.c @@ -0,0 +1,4 @@ +int fn() +{ + return 0; +} diff --git a/test/old-elf/AArch64/Inputs/fn.o b/test/old-elf/AArch64/Inputs/fn.o Binary files differnew file mode 100644 index 000000000000..53e47ad37742 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/fn.o diff --git a/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml b/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml new file mode 100644 index 000000000000..e355a3d85cdf --- /dev/null +++ b/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml @@ -0,0 +1,64 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FF4300D1E00F00B900040011E103002A48D03BD50801009108010091000100B9E10B00B9FF430091C0035FD6 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000014 + Symbol: var + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000018 + Symbol: var + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Size: 4 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: +# - Name: test_tls.c +# Type: STT_FILE + - Name: '$d.1' + Section: .tbss + - Name: '$x.0' + Section: .text + - Name: .tbss + Type: STT_TLS + Section: .tbss + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Size: 0x000000000000002C + - Name: var + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 +... diff --git a/test/old-elf/AArch64/Inputs/initfini-option.c b/test/old-elf/AArch64/Inputs/initfini-option.c new file mode 100644 index 000000000000..6021fb57ffa9 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/initfini-option.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +void init() { + printf("%s\n", __FUNCTION__); +} + +void fini() { + printf("%s\n", __FUNCTION__); +} + +int main() { +} diff --git a/test/old-elf/AArch64/Inputs/initfini-option.o b/test/old-elf/AArch64/Inputs/initfini-option.o Binary files differnew file mode 100644 index 000000000000..c75079b013fa --- /dev/null +++ b/test/old-elf/AArch64/Inputs/initfini-option.o diff --git a/test/old-elf/AArch64/Inputs/initfini.c b/test/old-elf/AArch64/Inputs/initfini.c new file mode 100644 index 000000000000..8369d68a8dab --- /dev/null +++ b/test/old-elf/AArch64/Inputs/initfini.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +void __attribute__ ((constructor)) constructor() { + printf("%s\n", __FUNCTION__); +} + +void __attribute__ ((destructor)) destructor() { + printf("%s\n", __FUNCTION__); +} + +int main() { + return 0; +} diff --git a/test/old-elf/AArch64/Inputs/initfini.o b/test/old-elf/AArch64/Inputs/initfini.o Binary files differnew file mode 100644 index 000000000000..030fe59878be --- /dev/null +++ b/test/old-elf/AArch64/Inputs/initfini.o diff --git a/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml b/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml new file mode 100644 index 000000000000..2a6104a150ea --- /dev/null +++ b/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml @@ -0,0 +1,77 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Size: 16 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742065653461393664373236383264353237636635353336313135366235656531383662303964363138292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623065376165623639343236646331346637376466626535343533333536366664363866396466632900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: '$d.0' + Type: STT_TLS + Section: .tbss + - Name: '$d.1' + Section: .comment + - Name: .tbss + Type: STT_TLS + Section: .tbss + - Type: STT_SECTION + Section: .text + - Type: STT_SECTION + Section: .data + - Type: STT_SECTION + Section: .bss + - Type: STT_SECTION + Section: .comment + - Type: STT_SECTION + Section: .note.GNU-stack + Global: + - Name: e0 + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 + - Name: e1 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: e2 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000008 + Size: 0x0000000000000004 + - Name: e3 + Type: STT_TLS + Section: .tbss + Value: 0x000000000000000C + Size: 0x0000000000000004 +... diff --git a/test/old-elf/AArch64/Inputs/main.c b/test/old-elf/AArch64/Inputs/main.c new file mode 100644 index 000000000000..0280c9127076 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/main.c @@ -0,0 +1,4 @@ +int main() { + fn(); + return 0; +} diff --git a/test/old-elf/AArch64/Inputs/main.o b/test/old-elf/AArch64/Inputs/main.o Binary files differnew file mode 100644 index 000000000000..8c0f049da6a8 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/main.o diff --git a/test/old-elf/AArch64/Inputs/no-interp-section.c b/test/old-elf/AArch64/Inputs/no-interp-section.c new file mode 100644 index 000000000000..3981c038ed33 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/no-interp-section.c @@ -0,0 +1 @@ +int c = 10; diff --git a/test/old-elf/AArch64/Inputs/no-interp-section.o b/test/old-elf/AArch64/Inputs/no-interp-section.o Binary files differnew file mode 100644 index 000000000000..36b41fdbf782 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/no-interp-section.o diff --git a/test/old-elf/AArch64/Inputs/zerosizedsection.o b/test/old-elf/AArch64/Inputs/zerosizedsection.o Binary files differnew file mode 100644 index 000000000000..10123fcef90d --- /dev/null +++ b/test/old-elf/AArch64/Inputs/zerosizedsection.o diff --git a/test/old-elf/AArch64/Inputs/zerosizedsection.s b/test/old-elf/AArch64/Inputs/zerosizedsection.s new file mode 100644 index 000000000000..651ee3aab503 --- /dev/null +++ b/test/old-elf/AArch64/Inputs/zerosizedsection.s @@ -0,0 +1,3 @@ +.text +.data +.word .text diff --git a/test/old-elf/AArch64/defsym.test b/test/old-elf/AArch64/defsym.test new file mode 100644 index 000000000000..f9864092ddc3 --- /dev/null +++ b/test/old-elf/AArch64/defsym.test @@ -0,0 +1,22 @@ +RUN: lld -flavor old-gnu -target aarch64--linux-gnu --defsym=main=fn \ +RUN: --noinhibit-exec %p/Inputs/fn.o -o %t +RUN: llvm-readobj -symbols %t | FileCheck %s + +CHECK: Symbol { +CHECK: Name: main (1) +CHECK: Value: 0x4001A4 +CHECK: Size: 0 +CHECK: Binding: Global (0x1) +CHECK: Type: Function (0x2) +CHECK: Other: 0 +CHECK: Section: .text (0x5) +CHECK: } +CHECK: Symbol { +CHECK: Name: fn (11) +CHECK: Value: 0x4001A4 +CHECK: Size: 8 +CHECK: Binding: Global (0x1) +CHECK: Type: Function (0x2) +CHECK: Other: 0 +CHECK: Section: .text (0x5) +CHECK: } diff --git a/test/old-elf/AArch64/dontignorezerosize-sections.test b/test/old-elf/AArch64/dontignorezerosize-sections.test new file mode 100644 index 000000000000..8f3b27702208 --- /dev/null +++ b/test/old-elf/AArch64/dontignorezerosize-sections.test @@ -0,0 +1,9 @@ +# This tests that lld is not ignoring zero sized sections +RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/zerosizedsection.o \ +RUN: --noinhibit-exec --output-filetype=yaml -o %t +RUN: FileCheck %s < %t + +CHECK: references: +CHECK: - kind: layout-after +CHECK: offset: 0 +CHECK: target: L000 diff --git a/test/old-elf/AArch64/dynamicvars.test b/test/old-elf/AArch64/dynamicvars.test new file mode 100644 index 000000000000..80228f0cd4b2 --- /dev/null +++ b/test/old-elf/AArch64/dynamicvars.test @@ -0,0 +1,113 @@ +# Tests that the dynamic variables created by the linker are set to the right +# values. + +# RUN: yaml2obj --format elf -docnum 1 %s -o %t.o +# RUN: lld -flavor old-gnu -target aarch64 -e main %t.o -o %t1 --noinhibit-exec +# RUN: llvm-readobj -sections -symbols %t1 | FileCheck %s + + +# CHECK: Name: .dynamic +# CHECK: Type: SHT_DYNAMIC +# CHECK: Address: [[TARGETA:[0xa-fA-f0-9]+]] +# CHECK: Name: .got.plt +# CHECK: Type: SHT_PROGBITS +# CHECK: Address: [[TARGETB:[0xa-fA-f0-9]+]] +# CHECK: Name: _DYNAMIC +# CHECK: Value: [[TARGETA]] +# CHECK: Section: .dynamic +# CHECK: Name: _GLOBAL_OFFSET_TABLE_ +# CHECK: Value: [[TARGETB]] +# CHECK: Section: .got.plt + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + - Name: .text.startup + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FD7BBFA900000090FD030091000000910000009400008052FD7BC1A8C0035FD6 + - Name: .rela.text.startup + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text.startup + Relocations: + - Offset: 0x0000000000000004 + Symbol: .rodata.str1.8 + Type: R_AARCH64_ADR_PREL_PG_HI21 + - Offset: 0x000000000000000C + Symbol: .rodata.str1.8 + Type: R_AARCH64_ADD_ABS_LO12_NC + - Offset: 0x0000000000000010 + Symbol: puts + Type: R_AARCH64_CALL26 + - Name: .rodata.str1.8 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000008 + Content: '7465737400000000' + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004743433A2028474E552920342E392E33203230313530333234202870726572656C656173652900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: test.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .text.startup + Type: STT_SECTION + Section: .text.startup + - Name: '$x' + Section: .text.startup + - Name: .rodata.str1.8 + Type: STT_SECTION + Section: .rodata.str1.8 + - Name: '$d' + Section: .rodata.str1.8 + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .comment + Type: STT_SECTION + Section: .comment + Global: + - Name: main + Type: STT_FUNC + Section: .text.startup + Size: 0x0000000000000020 + - Name: puts +... diff --git a/test/old-elf/AArch64/dynlib-nointerp-section.test b/test/old-elf/AArch64/dynlib-nointerp-section.test new file mode 100644 index 000000000000..c4f4edab61b1 --- /dev/null +++ b/test/old-elf/AArch64/dynlib-nointerp-section.test @@ -0,0 +1,5 @@ +RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/no-interp-section.o \ +RUN: -o %t -shared +RUN: llvm-objdump -section-headers %t | FileCheck %s + +CHECK-NOT: .interp diff --git a/test/old-elf/AArch64/general-dyn-tls-0.test b/test/old-elf/AArch64/general-dyn-tls-0.test new file mode 100644 index 000000000000..ae2af94d057d --- /dev/null +++ b/test/old-elf/AArch64/general-dyn-tls-0.test @@ -0,0 +1,103 @@ +# Check for correct offsets when handling relocations for general dynamic TLS +# access in executable binaries. +# +# The test case was generated from following code snippet: +# +# == test_tls.c == +# +# __thread int var; +# void foo (int x) { +# var = x + 1; +# } +# +# == test_main.c == +# #include <stdio.h> +# +# extern __thread int var; +# extern void foo (int); +# +# int main () { +# foo (10); +# return var; +# } +# +# The objects are compiled with -fpic. + +#RUN: yaml2obj -format=elf %p/Inputs/general-dyn-tls-0.yaml -o=%t-t1.o +#RUN: yaml2obj -format=elf %s -o %t-t0.o +#RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o +#RUN: llvm-readobj -relocations %t.exe | FileCheck %s -check-prefix=CHECKRELOCATION +#RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +#CHECKRELOCATION: Relocations [ +#CHECKRELOCATION: .rela.dyn { +#CHECKRELOCATION: 0x401090 R_AARCH64_TLSDESC var 0x0 +#CHECKRELOCATION: } + +#CHECK: Contents of section .text: +#CHECK: 400250 a8c31fb8 40018052 0b000094 000000b0 ....@..R........ +# \_ adrp x0, 401000 <_DYNAMIC> (R_AARCH64_TLSDESC_ADR_PAGE21) +#CHECK-NEXT: 400260 014840f9 00400291 20003fd6 49d03bd5 .H@..@.. .?.I.;. +# \_ | | ldr x1, [x0,#144] (R_AARCH64_TLSDESC_LD64_LO12_NC) +# \_ | add x0, x0, #0x90 (R_AARCH64_TLSDESC_ADD_LO12_NC) +# \_ blr x1 (R_AARCH64_TLSDESC_CALL) + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FD7BBFA9FD030091FF4300D1E8031F2AA8C31FB8400180520000009400000090010040F90000009120003FD649D03BD5286960B8E003082ABF030091FD7BC1A8C0035FD6 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000018 + Symbol: foo + Type: R_AARCH64_CALL26 + - Offset: 0x000000000000001C + Symbol: var + Type: R_AARCH64_TLSDESC_ADR_PAGE21 + - Offset: 0x0000000000000020 + Symbol: var + Type: R_AARCH64_TLSDESC_LD64_LO12_NC + - Offset: 0x0000000000000024 + Symbol: var + Type: R_AARCH64_TLSDESC_ADD_LO12_NC + - Offset: 0x0000000000000028 + Symbol: var + Type: R_AARCH64_TLSDESC_CALL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: '$x.0' + Section: .text + Global: + - Name: foo + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000044 + - Name: var + Type: STT_TLS diff --git a/test/old-elf/AArch64/initfini.test b/test/old-elf/AArch64/initfini.test new file mode 100644 index 000000000000..c5f385082edc --- /dev/null +++ b/test/old-elf/AArch64/initfini.test @@ -0,0 +1,23 @@ +# This tests the functionality that lld is able to read +# init_array/fini_array sections in the input ELF. This +# corresponds to the the .init_array/.fini_array sections +# in the output ELF. + +RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/initfini.o \ +RUN: --noinhibit-exec --output-filetype=yaml -o %t +RUN: FileCheck %s < %t + +CHECK: type: data +CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +CHECK: section-name: .init_array +CHECK: references: +CHECK: - kind: R_AARCH64_ABS64 +CHECK: offset: 0 +CHECK: target: constructor +CHECK: type: data +CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +CHECK: section-name: .fini_array +CHECK: references: +CHECK: - kind: R_AARCH64_ABS64 +CHECK: offset: 0 +CHECK: target: destructor diff --git a/test/old-elf/AArch64/initial-exec-tls-0.test b/test/old-elf/AArch64/initial-exec-tls-0.test new file mode 100644 index 000000000000..4cb5f9c7052a --- /dev/null +++ b/test/old-elf/AArch64/initial-exec-tls-0.test @@ -0,0 +1,146 @@ +# Check for initial executable TLS access across different modules. For +# this case compiler will emit R_AARCH64_TLSLD_ADR_PAGE21 and +# R_AARCH64_TLSLD_ADD_LO12_NC static relocations and linker should create +# a R_AARCH64_TLS_TPREL64 dynamic relocation for variable access. + +# The test case was generated from following code snippet: +# +# t1.c (initial-exec-tls-1.yaml) +# +# __thread int e0; +# __thread int e1; +# __thread int e2; +# __thread int e3; +# +# t0.c (initial-exec-tls-0.test) +# +# extern __thread int e0; +# extern __thread int e1; +# extern __thread int e2; +# extern __thread int e3; +# +# int main () +# { +# e0 = 1; +# e1 = 2; +# e1 = 3; +# e1 = 4; +# } + +#RUN: yaml2obj -format=elf %p/Inputs/initial-exec-tls-1.yaml -o=%t-t1.o +#RUN: yaml2obj -format=elf %s -o %t-t0.o +#RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o +#RUN: llvm-readobj -relocations %t.exe | FileCheck %s -check-prefix=CHECKRELOCATION +#RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e0 0x0 +#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e1 0x0 +#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e2 0x0 +#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e3 0x0 + +#CHECK: Contents of section .text: +#CHECK-NEXT: 4002c0 ff4300d1 e8031f2a e9031e32 0a0000b0 .C.....*...2.... +# \_ adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) +#CHECK-NEXT: 4002d0 4a4940f9 4bd03bd5 ec030032 6c692ab8 JI@.K.;....2li*. +# \_ ldr x10, [x10,#144] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) +#CHECK-NEXT: 4002e0 0a0000b0 4a4d40f9 ec031f32 6c692ab8 ....JM@....2li*. +# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) +# \_ ldr x10, [x10,#152] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) +#CHECK-NEXT: 4002f0 0a0000b0 4a5140f9 ec070032 6c692ab8 ....JQ@....2li*. +# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) +# \_ ldr x10, [x10,#160] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) +#CHECK-NEXT: 400300 0a0000b0 4a5540f9 ec031e32 6c692ab8 ....JU@....2li*. +# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) +# \_ ldr x10, [x10,#168] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FF4300D1E8031F2AE9031E320A0000904A0140F94BD03BD5EC0300326C692AB80A0000904A0140F9EC031F326C692AB80A0000904A0140F9EC0700326C692AB80A0000904A0140F9EC031E326C692AB8E003082AE90F00B9FF430091C0035FD6 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x000000000000000C + Symbol: e0 + Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + - Offset: 0x0000000000000010 + Symbol: e0 + Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + - Offset: 0x0000000000000020 + Symbol: e1 + Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + - Offset: 0x0000000000000024 + Symbol: e1 + Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + - Offset: 0x0000000000000030 + Symbol: e2 + Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + - Offset: 0x0000000000000034 + Symbol: e2 + Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + - Offset: 0x0000000000000040 + Symbol: e3 + Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + - Offset: 0x0000000000000044 + Symbol: e3 + Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742065653461393664373236383264353237636635353336313135366235656531383662303964363138292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623065376165623639343236646331346637376466626535343533333536366664363866396466632900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: '$d.1' + Section: .comment + - Name: '$x.0' + Section: .text + - Type: STT_SECTION + Section: .text + - Type: STT_SECTION + Section: .data + - Type: STT_SECTION + Section: .bss + - Type: STT_SECTION + Section: .comment + - Type: STT_SECTION + Section: .note.GNU-stack + Global: + - Name: e0 + Type: STT_TLS + - Name: e1 + Type: STT_TLS + - Name: e2 + Type: STT_TLS + - Name: e3 + Type: STT_TLS + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000060 +... diff --git a/test/old-elf/AArch64/local-tls.test b/test/old-elf/AArch64/local-tls.test new file mode 100644 index 000000000000..f339ae20e154 --- /dev/null +++ b/test/old-elf/AArch64/local-tls.test @@ -0,0 +1,184 @@ +# Check for correct offsets when handling relocations for local TLS +# access (R_AARCH64_TLSLE_ADD_TPREL_HI12, R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 4001dc 48d03bd5 08010091 08610091 090140b9 H.;......a....@. +# \_ | | <foo1>: +# \_ | add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12) +# \_ add x8, x8, #0x18 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) +# CHECK-NEXT: 4001ec e003092a c0035fd6 48d03bd5 08010091 ...*.._.H.;..... +# \_ | <foo2>: +# \_ add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12) +# CHECK-NEXT: 4001fc 08710091 090140b9 e003092a c0035fd6 .q....@....*.._. +# \_ add x8, x8, #0x1c (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) +# CHECK-NEXT: 40020c 48d03bd5 08010091 08410091 090140b9 H.;......A....@. +# \_ | | <foo3>: +# \_ | add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12) +# \_ add x8, x8, #0x10 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) +# CHECK-NEXT: 40021c e003092a c0035fd6 48d03bd5 08010091 ...*.._.H.;..... +# \_ | <foo3>: +# \_ add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12) +# CHECK-NEXT: 40022c 08510091 090140b9 e003092a c0035fd6 .Q....@....*.._. +# \_ add x8, x8, #0x14 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC) + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 48D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD6FD7BBFA9FD030091FF8300D1BFC31FB8E4FFFF97A0831FB8E8FFFF97A0431FB8ECFFFF97E01300B9F0FFFF970800009008010091E00F00B9E00308AAA1835FB8A2435FB8E31340B9E40F40B900000094E1031F2AE00B00B9E003012ABF030091FD7BC1A8C0035FD6 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: v1 + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000008 + Symbol: v1 + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Offset: 0x000000000000001C + Symbol: v2 + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000020 + Symbol: v2 + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Offset: 0x0000000000000034 + Symbol: v3 + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000038 + Symbol: v3 + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Offset: 0x000000000000004C + Symbol: v4 + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000050 + Symbol: v4 + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Offset: 0x000000000000008C + Symbol: .rodata.str1.1 + Type: R_AARCH64_ADR_PREL_PG_HI21 + - Offset: 0x0000000000000090 + Symbol: .rodata.str1.1 + Type: R_AARCH64_ADD_ABS_LO12_NC + - Offset: 0x00000000000000AC + Symbol: printf + Type: R_AARCH64_CALL26 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: '0300000004000000' + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Size: 8 + - Name: .rodata.str1.1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 25692025692025692025690A00 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: '$d.1' + Type: STT_TLS + Section: .tdata + - Name: '$d.2' + Type: STT_TLS + Section: .tbss + - Name: '$d.3' + Section: .rodata.str1.1 + - Name: '$x.0' + Section: .text + - Name: v2 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: v4 + Type: STT_TLS + Section: .tdata + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .tdata + Type: STT_SECTION + Section: .tdata + - Name: .tbss + Type: STT_SECTION + Section: .tbss + - Name: .rodata.str1.1 + Type: STT_SECTION + Section: .rodata.str1.1 + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + Global: + - Name: foo1 + Type: STT_FUNC + Section: .text + Size: 0x0000000000000018 + - Name: foo2 + Type: STT_FUNC + Section: .text + Value: 0x0000000000000018 + Size: 0x0000000000000018 + - Name: foo3 + Type: STT_FUNC + Section: .text + Value: 0x0000000000000030 + Size: 0x0000000000000018 + - Name: foo4 + Type: STT_FUNC + Section: .text + Value: 0x0000000000000048 + Size: 0x0000000000000018 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000060 + Size: 0x0000000000000068 + - Name: v1 + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 + - Name: v3 + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: printf +... diff --git a/test/old-elf/AArch64/rel-abs16-overflow.test b/test/old-elf/AArch64/rel-abs16-overflow.test new file mode 100644 index 000000000000..06221c902bd7 --- /dev/null +++ b/test/old-elf/AArch64/rel-abs16-overflow.test @@ -0,0 +1,44 @@ +# Check handling of R_AARCH64_ABS16 relocation overflow. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data1+0 of type 259 (R_AARCH64_ABS16) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0 + Symbol: data1 + Type: R_AARCH64_ABS16 + Addend: 0 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 diff --git a/test/old-elf/AArch64/rel-abs16.test b/test/old-elf/AArch64/rel-abs16.test new file mode 100644 index 000000000000..e6b817570eb4 --- /dev/null +++ b/test/old-elf/AArch64/rel-abs16.test @@ -0,0 +1,53 @@ +# Check handling of R_AARCH64_ABS16 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 60100000 00000000 `....... +# ^^ data1 - 0x400000 = 0x1060 +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000004 data1 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data1 + Type: R_AARCH64_ABS16 + Addend: -4194304 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 + - Name: data2 + Section: .data + Value: 0x4 + Size: 4 diff --git a/test/old-elf/AArch64/rel-abs32-overflow.test b/test/old-elf/AArch64/rel-abs32-overflow.test new file mode 100644 index 000000000000..17154c6ddc82 --- /dev/null +++ b/test/old-elf/AArch64/rel-abs32-overflow.test @@ -0,0 +1,53 @@ +# Check handling of R_AARCH64_ABS32 relocation overflow. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK-DAG: Relocation out of range in file {{.*}}: reference from data1+0 to data2+34359738369 of type 258 (R_AARCH64_ABS32) +# CHECK-DAG: Relocation out of range in file {{.*}}: reference from data2+0 to data1+34359738369 of type 258 (R_AARCH64_ABS32) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_ABS32 + Addend: 0x800000001 + - Offset: 0x4 + Symbol: data1 + Type: R_AARCH64_ABS32 + Addend: 0x800000001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 + - Name: data2 + Section: .data + Value: 0x4 + Size: 4 diff --git a/test/old-elf/AArch64/rel-abs32.test b/test/old-elf/AArch64/rel-abs32.test new file mode 100644 index 000000000000..7faa662d3462 --- /dev/null +++ b/test/old-elf/AArch64/rel-abs32.test @@ -0,0 +1,59 @@ +# Check handling of R_AARCH64_ABS32 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 65104080 61104080 e.@.a.@. +# ^^ data2 + 0x80000001 = 0x80401069 +# ^^ data1 + 0x80000001 = 0x80401061 +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000004 data1 +# CHECK: 00401064 g .data 00000004 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_ABS32 + Addend: 0x80000001 + - Offset: 0x4 + Symbol: data1 + Type: R_AARCH64_ABS32 + Addend: 0x80000001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 + - Name: data2 + Section: .data + Value: 0x4 + Size: 4 diff --git a/test/old-elf/AArch64/rel-abs64.test b/test/old-elf/AArch64/rel-abs64.test new file mode 100644 index 000000000000..0304584d121d --- /dev/null +++ b/test/old-elf/AArch64/rel-abs64.test @@ -0,0 +1,59 @@ +# Check handling of R_AARCH64_ABS64 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 69104000 00000080 61104000 00000080 i.@.....a.@..... +# ^^ data2 + 0x8000000000000001 = 0x8000000000401069 +# ^^ data1 + 0x8000000000000001 = 0x8000000000401061 +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000008 data1 +# CHECK: 00401068 g .data 00000008 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "00000000000000000000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_ABS64 + Addend: -9223372036854775807 + - Offset: 0x8 + Symbol: data1 + Type: R_AARCH64_ABS64 + Addend: -9223372036854775807 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 + - Name: data2 + Section: .data + Value: 0x8 + Size: 8 diff --git a/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test b/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test new file mode 100644 index 000000000000..4f8e6b607bc7 --- /dev/null +++ b/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test @@ -0,0 +1,45 @@ +# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj + +# CHECK: Relocation out of range in file {{.*}}: reference from _start+0 to data1+1048577 of type 274 (R_AARCH64_ADR_PREL_LO21) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000090" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .data + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.text + Type: SHT_RELA + Info: .text + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data1 + Type: R_AARCH64_ADR_PREL_LO21 + Addend: 0x100001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 diff --git a/test/old-elf/AArch64/rel-adr_prel_lo21.test b/test/old-elf/AArch64/rel-adr_prel_lo21.test new file mode 100644 index 000000000000..36a9489c1aa4 --- /dev/null +++ b/test/old-elf/AArch64/rel-adr_prel_lo21.test @@ -0,0 +1,51 @@ +# REQUIRES: arm64 + +# Check handling of R_AARCH64_ADR_PREL_LO21 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -d -t %t-exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: _start: +# CHECK-NEXT: 4001b0: 80 75 00 90 adrp x0, #15400960 +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000004 data1 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000090" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.text + Type: SHT_RELA + Info: .text + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data1 + Type: R_AARCH64_ADR_PREL_LO21 + Addend: 0 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 diff --git a/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test b/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test new file mode 100644 index 000000000000..f095f60e82a6 --- /dev/null +++ b/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test @@ -0,0 +1,45 @@ +# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation overflow. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj + +# CHECK-DAG: Relocation out of range in file {{.*}}: reference from _start+0 to data1+2147483649 of type 275 (R_AARCH64_ADR_PREL_PG_HI21) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000090" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .data + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 4096 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.text + Type: SHT_RELA + Info: .text + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data1 + Type: R_AARCH64_ADR_PREL_PG_HI21 + Addend: 0x80000001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 diff --git a/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test b/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test new file mode 100644 index 000000000000..36a20c2f6473 --- /dev/null +++ b/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test @@ -0,0 +1,52 @@ +# REQUIRES: arm64 + +# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -d -t %t-exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: _start: +# CHECK-NEXT: 4001b0: 00 00 00 d0 adrp x0, #8192 +# CHECK: SYMBOL TABLE: +# CHECK: 00402000 g .data 00000004 data1 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000090" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .data + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 4096 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.text + Type: SHT_RELA + Info: .text + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data1 + Type: R_AARCH64_ADR_PREL_PG_HI21 + Addend: 0 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 diff --git a/test/old-elf/AArch64/rel-bad.test b/test/old-elf/AArch64/rel-bad.test new file mode 100644 index 000000000000..7d2ed192de56 --- /dev/null +++ b/test/old-elf/AArch64/rel-bad.test @@ -0,0 +1,44 @@ +# Check handling of a bad relocation (in this case dynamic in a static object). +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK: Unhandled reference type in file {{.*}}: reference from data1+4 to data1+0 of type 1024 (R_AARCH64_COPY) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x4 + Symbol: data1 + Type: R_AARCH64_COPY + Addend: 0 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 diff --git a/test/old-elf/AArch64/rel-prel16-overflow.test b/test/old-elf/AArch64/rel-prel16-overflow.test new file mode 100644 index 000000000000..ea08f9700ee4 --- /dev/null +++ b/test/old-elf/AArch64/rel-prel16-overflow.test @@ -0,0 +1,53 @@ +# Check handling of R_AARCH64_PREL16 relocation overflow. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data2+524289 of type 262 (R_AARCH64_PREL16) +# CHECK: Relocation out of range in file {{.*}}: reference from data2+0 to data1+524289 of type 262 (R_AARCH64_PREL16) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_PREL16 + Addend: 0x80001 + - Offset: 0x2 + Symbol: data1 + Type: R_AARCH64_PREL16 + Addend: 0x80001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 2 + - Name: data2 + Section: .data + Value: 0x2 + Size: 2 diff --git a/test/old-elf/AArch64/rel-prel16.test b/test/old-elf/AArch64/rel-prel16.test new file mode 100644 index 000000000000..11e6028e253b --- /dev/null +++ b/test/old-elf/AArch64/rel-prel16.test @@ -0,0 +1,59 @@ +# Check handling of R_AARCH64_PREL16 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 0380ff7f 00000000 ........ +# ^^ data2 - data1 + 0x8001 = 0x8003 +# ^^ data1 - data2 + 0x8001 = 0x7fff +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000002 data1 +# CHECK: 00401062 g .data 00000006 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_PREL16 + Addend: 0x8001 + - Offset: 0x2 + Symbol: data1 + Type: R_AARCH64_PREL16 + Addend: 0x8001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 2 + - Name: data2 + Section: .data + Value: 0x2 + Size: 2 diff --git a/test/old-elf/AArch64/rel-prel32-overflow.test b/test/old-elf/AArch64/rel-prel32-overflow.test new file mode 100644 index 000000000000..513adad08efe --- /dev/null +++ b/test/old-elf/AArch64/rel-prel32-overflow.test @@ -0,0 +1,53 @@ +# Check handling of R_AARCH64_PREL32 relocation overflow. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data2+34359738369 of type 261 (R_AARCH64_PREL32) +# CHECK: Relocation out of range in file {{.*}}: reference from data2+0 to data1+34359738369 of type 261 (R_AARCH64_PREL32) + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_PREL32 + Addend: 0x800000001 + - Offset: 0x4 + Symbol: data1 + Type: R_AARCH64_PREL32 + Addend: 0x800000001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 + - Name: data2 + Section: .data + Value: 0x4 + Size: 4 diff --git a/test/old-elf/AArch64/rel-prel32.test b/test/old-elf/AArch64/rel-prel32.test new file mode 100644 index 000000000000..0e178ba97f41 --- /dev/null +++ b/test/old-elf/AArch64/rel-prel32.test @@ -0,0 +1,59 @@ +# Check handling of R_AARCH64_PREL32 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 05000080 fdffff7f ........ +# ^^ data2 - data1 + 0x80000001 = 0x80000005 +# ^^ data1 - data2 + 0x80000001 = 0x7ffffffd +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000004 data1 +# CHECK: 00401064 g .data 00000004 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_PREL32 + Addend: 0x80000001 + - Offset: 0x4 + Symbol: data1 + Type: R_AARCH64_PREL32 + Addend: 0x80000001 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 4 + - Name: data2 + Section: .data + Value: 0x4 + Size: 4 diff --git a/test/old-elf/AArch64/rel-prel64.test b/test/old-elf/AArch64/rel-prel64.test new file mode 100644 index 000000000000..3a3eb8b90fc3 --- /dev/null +++ b/test/old-elf/AArch64/rel-prel64.test @@ -0,0 +1,59 @@ +# Check handling of R_AARCH64_PREL64 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401060 09000000 00000080 f9ffffff ffffff7f ................ +# ^^ data2 - data1 + 0x8000000000000001 = 0x8000000000000009 +# ^^ data1 - data2 + 0x8000000000000001 = 0x7ffffffffffffff9 +# CHECK: SYMBOL TABLE: +# CHECK: 00401060 g .data 00000008 data1 +# CHECK: 00401068 g .data 00000008 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .data + Type: SHT_PROGBITS + Content: "00000000000000000000000000000000" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 8 + Relocations: + - Offset: 0x0 + Symbol: data2 + Type: R_AARCH64_PREL64 + Addend: -9223372036854775807 + - Offset: 0x8 + Symbol: data1 + Type: R_AARCH64_PREL64 + Addend: -9223372036854775807 + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Size: 8 + - Name: data2 + Section: .data + Value: 0x8 + Size: 8 diff --git a/test/old-elf/AMDGPU/hsa.test b/test/old-elf/AMDGPU/hsa.test new file mode 100644 index 000000000000..4a17ae2223e0 --- /dev/null +++ b/test/old-elf/AMDGPU/hsa.test @@ -0,0 +1,53 @@ +# RUN: yaml2obj -format=elf %s > %t.obj +# RUN: lld -flavor old-gnu -target amdgcn--hsa %t.obj -o %t.exe --noinhibit-exec +# RUN: llvm-readobj -h -program-headers -s -symbols %t.exe | FileCheck %s + +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Class: 64-bit (0x2) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: Machine: EM_AMDGPU (0xE0) + + +# CHECK: Section { +# CHECK: Name: .hsatext +# CHECK: Type: SHT_PROGBITS (0x1) +# CHECK: Flags [ (0xC00007 +# CHECK: SHF_ALLOC (0x2) +# CHECK: SHF_AMDGPU_HSA_AGENT (0x800000) +# CHECK: SHF_AMDGPU_HSA_CODE (0x400000) +# CHECK: SHF_EXECINSTR (0x4) +# CHECK: SHF_WRITE (0x1) +# +# CHECK: Symbol { +# CHECK: Name: kernel +# CHECK: Value: 0x0 +# CHECK: Binding: Local (0x0) +# CHECK: Type: AMDGPU_HSA_KERNEL (0xA) + +# CHECK: ProgramHeader { +# CHECK: Type: PT_AMDGPU_HSA_LOAD_CODE_AGENT (0x60000003) + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_AMDGPU +Sections: + - Name: .hsatext + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .note + Type: SHT_NOTE + AddressAlign: 0x0000000000000001 + Content: '00' +Symbols: + Local: + - Name: kernel + Type: STT_GNU_IFUNC + Section: .hsatext +... diff --git a/test/old-elf/ARM/Inputs/fn.c b/test/old-elf/ARM/Inputs/fn.c new file mode 100644 index 000000000000..37c897ebb7f2 --- /dev/null +++ b/test/old-elf/ARM/Inputs/fn.c @@ -0,0 +1 @@ +int fn() { return 1; } diff --git a/test/old-elf/ARM/Inputs/libfn.so b/test/old-elf/ARM/Inputs/libfn.so Binary files differnew file mode 100755 index 000000000000..51934714841b --- /dev/null +++ b/test/old-elf/ARM/Inputs/libfn.so diff --git a/test/old-elf/ARM/Inputs/libobj.so b/test/old-elf/ARM/Inputs/libobj.so Binary files differnew file mode 100755 index 000000000000..85b3ae4ca3d1 --- /dev/null +++ b/test/old-elf/ARM/Inputs/libobj.so diff --git a/test/old-elf/ARM/Inputs/obj.c b/test/old-elf/ARM/Inputs/obj.c new file mode 100644 index 000000000000..fb6a9f13f698 --- /dev/null +++ b/test/old-elf/ARM/Inputs/obj.c @@ -0,0 +1,4 @@ +static struct S { +} s; + +struct S *const object = &s; diff --git a/test/old-elf/ARM/arm-symbols.test b/test/old-elf/ARM/arm-symbols.test new file mode 100644 index 000000000000..ddf3c80862a5 --- /dev/null +++ b/test/old-elf/ARM/arm-symbols.test @@ -0,0 +1,51 @@ +# Check that symbols formed from ARM instructions are valid: +# 1. Symbol address. +# 2. Symbol content size. +# 3. Symbol content. + +# RUN: yaml2obj -format=elf %s > %t-a.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-a.o -o %t-a +# RUN: llvm-readobj -symbols %t-a | FileCheck -check-prefix=SYM-ADDR %s +# RUN: llvm-readobj -symbols %t-a | FileCheck -check-prefix=SYM-SIZE %s +# RUN: llvm-objdump -s -t %t-a | FileCheck -check-prefix=SYM-CONTENT %s + +# SYM-ADDR: Name: main (1) +# SYM-ADDR-NEXT: Value: 0x400074 + +# SYM-SIZE: Name: main (1) +# SYM-SIZE-NEXT: Value: 0x{{[0-9a-f]+}} +# SYM-SIZE-NEXT: Size: 28 + +# SYM-CONTENT: Contents of section .text: +# SYM-CONTENT-NEXT: 400074 04b02de5 00b08de2 0030a0e3 0300a0e1 ..-......0...... +# SYM-CONTENT-NEXT: 400084 00d04be2 04b09de4 1eff2fe1 ..K......./. + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/defsym.test b/test/old-elf/ARM/defsym.test new file mode 100644 index 000000000000..7d4fa7fcd4dc --- /dev/null +++ b/test/old-elf/ARM/defsym.test @@ -0,0 +1,50 @@ +# Check that defined symbols are present in the generated executable + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=fn \ +# RUN: -Bstatic --noinhibit-exec %t-o.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck %s + +# CHECK: Name: main (1) +# CHECK-NEXT: Value: 0x400074 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x1) +# CHECK: Name: fn (6) +# CHECK-NEXT: Value: 0x400074 +# CHECK-NEXT: Size: {{[0-9]+}} +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x1) + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: fn + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/dynamic-symbols.test b/test/old-elf/ARM/dynamic-symbols.test new file mode 100644 index 000000000000..13963be8e701 --- /dev/null +++ b/test/old-elf/ARM/dynamic-symbols.test @@ -0,0 +1,83 @@ +# Check that proper dynamic symbols are present in the generated executable + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-o.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=STATIC %s + +# STATIC-NOT: Name: _GLOBAL_OFFSET_TABLE_ +# STATIC-NOT: Name: _DYNAMIC + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Name: _GLOBAL_OFFSET_TABLE_ +# EXEC-DYN-NEXT: Value: 0x401000 +# EXEC-DYN-NEXT: Size: 0 +# EXEC-DYN-NEXT: Binding: Global (0x1) +# EXEC-DYN-NEXT: Type: Object (0x1) +# EXEC-DYN-NEXT: Other: 0 +# EXEC-DYN-NEXT: Section: Absolute (0xFFF1) +# EXEC-DYN: Name: _DYNAMIC +# EXEC-DYN-NEXT: Value: 0x400130 +# EXEC-DYN-NEXT: Size: 0 +# EXEC-DYN-NEXT: Binding: Global (0x1) +# EXEC-DYN-NEXT: Type: Object (0x1) +# EXEC-DYN-NEXT: Other: 0 +# EXEC-DYN-NEXT: Section: Absolute (0xFFF1) + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -shared --noinhibit-exec %t-o.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SHARED %s + +# SHARED: Name: _GLOBAL_OFFSET_TABLE_ +# SHARED-NEXT: Value: 0x401000 +# SHARED-NEXT: Size: 0 +# SHARED-NEXT: Binding: Global (0x1) +# SHARED-NEXT: Type: Object (0x1) +# SHARED-NEXT: Other: 0 +# SHARED-NEXT: Section: Absolute (0xFFF1) +# SHARED: Name: _DYNAMIC +# SHARED-NEXT: Value: 0x4000EC +# SHARED-NEXT: Size: 0 +# SHARED-NEXT: Binding: Global (0x1) +# SHARED-NEXT: Type: Object (0x1) +# SHARED-NEXT: Other: 0 +# SHARED-NEXT: Section: Absolute (0xFFF1) + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + - Name: .got + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: 0000 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/entry-point.test b/test/old-elf/ARM/entry-point.test new file mode 100644 index 000000000000..4cfee4aa6c7b --- /dev/null +++ b/test/old-elf/ARM/entry-point.test @@ -0,0 +1,113 @@ +# 1. Check entry point address for ARM code - should be even. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm.o -o %t-arm +# RUN: llvm-readobj -file-headers %t-arm | FileCheck -check-prefix=ARM-ENTRY %s +# +# ARM-ENTRY: Entry: 0x400074 + +# 2. Check entry point address for Thumb code - should be odd. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-thm.o -o %t-thm +# RUN: llvm-readobj -file-headers %t-thm | FileCheck -check-prefix=THM-ENTRY %s +# +# THM-ENTRY: Entry: 0x400075 + +# 3. Check wrong entry point address align for ARM code. +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-arm-wrong.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm-wrong.o -o %t-arm-wrong 2> %t-error +# FileCheck -check-prefix=ARM-WRONG %s < %t-error +# +# ARM-WRONG: Two least bits must be zero for ARM entry point + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B7047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + +# arm-wrong.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000006 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0000000000000002 +... diff --git a/test/old-elf/ARM/exidx.test b/test/old-elf/ARM/exidx.test new file mode 100644 index 000000000000..a277cfcd09ae --- /dev/null +++ b/test/old-elf/ARM/exidx.test @@ -0,0 +1,254 @@ +# .ARM.exidx contents checking +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target arm-none-linux-eabi -static -o %t %t.o +# RUN: llvm-objdump -s -t -section-headers %t | FileCheck %s +# +# CHECK: Sections: +# CHECK: Idx Name Size Address Type +# CHECK: 2 .ARM.extab 0000000c 00000000004000b4 DATA +# CHECK: 3 .ARM.exidx 00000018 00000000004000c0 +# CHECK: Contents of section .text: +# CHECK: 4000a4 1846aff3 00801846 0837bd46 80bd00bf +# ^ +# 4000b0: bd80 pop {r7, pc} +# CHECK: Contents of section .ARM.extab: +# CHECK: 4000b4 01970181 b0b00884 00000000 +# CHECK: Contents of section .ARM.exidx: +# CHECK: 4000c0 b4ffff7f 08809780 bcffff7f 08809780 +# ^ offset to 400074 (__aeabi_unwind_cpp_pr0) +# CHECK: 4000d0 c4ffff7f e0ffff7f +# ^ ^ +# offset to 400094 (_start) handler at 4000B0 +# +# CHECK: SYMBOL TABLE: +# CHECK: 004000b4 .ARM.extab 00000000 $d.2 +# CHECK: 004000c0 .ARM.exidx 00000000 $d.1 +# CHECK: 00400074 g F .text 00000010 __aeabi_unwind_cpp_pr0 +# CHECK: 00400094 g F .text 00000020 _start + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B704780B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFF3B1D1846FFF7FEFF18460837BD4680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000002A + Symbol: _ZN1AILi1EEC1Ev + Type: R_ARM_THM_CALL + - Offset: 0x0000000000000032 + Symbol: _ZN1AILi1EED1Ev + Type: R_ARM_THM_CALL + - Name: .ARM.extab + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: 01970181B0B0088400000000 + - Name: .ARM.exidx + Type: SHT_ARM_EXIDX + Flags: [ SHF_ALLOC, SHF_LINK_ORDER ] + Link: .text + AddressAlign: 0x0000000000000004 + Content: '000000000880978010000000088097802000000000000000' + - Name: .rel.ARM.exidx + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .ARM.exidx + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text + Type: R_ARM_PREL31 + - Offset: 0x0000000000000000 + Symbol: __aeabi_unwind_cpp_pr0 + Type: R_ARM_NONE + - Offset: 0x0000000000000008 + Symbol: .text + Type: R_ARM_PREL31 + - Offset: 0x0000000000000010 + Symbol: .text + Type: R_ARM_PREL31 + - Offset: 0x0000000000000010 + Symbol: __aeabi_unwind_cpp_pr1 + Type: R_ARM_NONE + - Offset: 0x0000000000000014 + Symbol: .ARM.extab + Type: R_ARM_PREL31 + - Name: .text._ZN1AILi1EEC2Ev + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000004 + Content: 80B582B000AF78600120FFF7FEFF7B6818460837BD4680BD + - Name: .rel.text._ZN1AILi1EEC2Ev + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text._ZN1AILi1EEC2Ev + Relocations: + - Offset: 0x000000000000000A + Symbol: f + Type: R_ARM_THM_CALL + - Name: .ARM.extab.text._ZN1AILi1EEC2Ev + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_GROUP ] + AddressAlign: 0x0000000000000004 + Content: 01970181B0B0088400000000 + - Name: .ARM.exidx.text._ZN1AILi1EEC2Ev + Type: SHT_ARM_EXIDX + Flags: [ SHF_ALLOC, SHF_LINK_ORDER, SHF_GROUP ] + Link: .text._ZN1AILi1EEC2Ev + AddressAlign: 0x0000000000000004 + Content: '0000000000000000' + - Name: .rel.ARM.exidx.text._ZN1AILi1EEC2Ev + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .ARM.exidx.text._ZN1AILi1EEC2Ev + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text._ZN1AILi1EEC2Ev + Type: R_ARM_PREL31 + - Offset: 0x0000000000000000 + Symbol: __aeabi_unwind_cpp_pr1 + Type: R_ARM_NONE + - Offset: 0x0000000000000004 + Symbol: .ARM.extab.text._ZN1AILi1EEC2Ev + Type: R_ARM_PREL31 + - Name: .text._ZN1AILi1EED2Ev + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000004 + Content: 80B582B000AF78604FF0FF30FFF7FEFF7B6818460837BD4680BD00BF + - Name: .rel.text._ZN1AILi1EED2Ev + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text._ZN1AILi1EED2Ev + Relocations: + - Offset: 0x000000000000000C + Symbol: f + Type: R_ARM_THM_CALL + - Name: .ARM.extab.text._ZN1AILi1EED2Ev + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_GROUP ] + AddressAlign: 0x0000000000000004 + Content: 01970181B0B0088400000000 + - Name: .ARM.exidx.text._ZN1AILi1EED2Ev + Type: SHT_ARM_EXIDX + Flags: [ SHF_ALLOC, SHF_LINK_ORDER, SHF_GROUP ] + Link: .text._ZN1AILi1EED2Ev + AddressAlign: 0x0000000000000004 + Content: '0000000000000000' + - Name: .rel.ARM.exidx.text._ZN1AILi1EED2Ev + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .ARM.exidx.text._ZN1AILi1EED2Ev + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text._ZN1AILi1EED2Ev + Type: R_ARM_PREL31 + - Offset: 0x0000000000000000 + Symbol: __aeabi_unwind_cpp_pr1 + Type: R_ARM_NONE + - Offset: 0x0000000000000004 + Symbol: .ARM.extab.text._ZN1AILi1EED2Ev + Type: R_ARM_PREL31 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: '$t.1' + Section: .text + - Name: .ARM.extab + Type: STT_SECTION + Section: .ARM.extab + - Name: .ARM.exidx + Type: STT_SECTION + Section: .ARM.exidx + - Name: '$d.1' + Section: .ARM.exidx + - Name: '$d.2' + Section: .ARM.extab + - Name: .text._ZN1AILi1EEC2Ev + Type: STT_SECTION + Section: .text._ZN1AILi1EEC2Ev + - Name: '$t.2' + Section: .text._ZN1AILi1EEC2Ev + - Name: .ARM.extab.text._ZN1AILi1EEC2Ev + Type: STT_SECTION + Section: .ARM.extab.text._ZN1AILi1EEC2Ev + - Name: '$d.3' + Section: .ARM.extab.text._ZN1AILi1EEC2Ev + - Name: .ARM.exidx.text._ZN1AILi1EEC2Ev + Type: STT_SECTION + Section: .ARM.exidx.text._ZN1AILi1EEC2Ev + - Name: '$d.4' + Section: .ARM.exidx.text._ZN1AILi1EEC2Ev + - Name: .text._ZN1AILi1EED2Ev + Type: STT_SECTION + Section: .text._ZN1AILi1EED2Ev + - Name: '$t.3' + Section: .text._ZN1AILi1EED2Ev + - Name: .ARM.extab.text._ZN1AILi1EED2Ev + Type: STT_SECTION + Section: .ARM.extab.text._ZN1AILi1EED2Ev + - Name: '$d.5' + Section: .ARM.extab.text._ZN1AILi1EED2Ev + - Name: .ARM.exidx.text._ZN1AILi1EED2Ev + Type: STT_SECTION + Section: .ARM.exidx.text._ZN1AILi1EED2Ev + - Name: '$d.6' + Section: .ARM.exidx.text._ZN1AILi1EED2Ev + Global: + - Name: __aeabi_unwind_cpp_pr0 + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x0000000000000010 + - Name: __aeabi_unwind_cpp_pr1 + Type: STT_FUNC + Section: .text + Value: 0x0000000000000011 + Size: 0x0000000000000010 + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0000000000000021 + Size: 0x000000000000001E + Weak: + - Name: _ZN1AILi1EEC1Ev + Type: STT_FUNC + Section: .text._ZN1AILi1EEC2Ev + Value: 0x0000000000000001 + Size: 0x0000000000000018 + - Name: _ZN1AILi1EED1Ev + Type: STT_FUNC + Section: .text._ZN1AILi1EED2Ev + Value: 0x0000000000000001 + Size: 0x000000000000001A + - Name: _ZN1AILi1EEC2Ev + Type: STT_FUNC + Section: .text._ZN1AILi1EEC2Ev + Value: 0x0000000000000001 + Size: 0x0000000000000018 + - Name: f + - Name: _ZN1AILi1EED2Ev + Type: STT_FUNC + Section: .text._ZN1AILi1EED2Ev + Value: 0x0000000000000001 + Size: 0x000000000000001A +... diff --git a/test/old-elf/ARM/header-flags.test b/test/old-elf/ARM/header-flags.test new file mode 100644 index 000000000000..735d65225216 --- /dev/null +++ b/test/old-elf/ARM/header-flags.test @@ -0,0 +1,57 @@ +# Various checks for header flags. + +# 1. Check header flags for statically linked executable with default options. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t.o -o %t +# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=STATIC-DEF %s +# +# STATIC-DEF: Flags {{.}} (0x5000400) +# ABI version 5 + hard float ^^ + +# 2. Check header flags for dynamically linked executable with default options. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t.o -o %t +# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=EXEC-DYN-DEF %s +# +# EXEC-DYN-DEF: Flags {{.}} (0x5000400) +# ABI version 5 + hard float ^^ + +# 3. Check header flags for shared object with default options. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \ +# RUN: --noinhibit-exec %t.o -o %t +# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=SHARED-DEF %s +# +# SHARED-DEF: Flags {{.}} (0x5000400) +# ABI version 5 + hard float ^^ + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/mapping-code-model.test b/test/old-elf/ARM/mapping-code-model.test new file mode 100644 index 000000000000..affa10b464f8 --- /dev/null +++ b/test/old-elf/ARM/mapping-code-model.test @@ -0,0 +1,160 @@ +# Check that mapping symbols are treated as ARM or Thumb code properly. +# +# 1. ARM <=> Thumb generates both veneers. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-a-arm.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=f_a \ +# RUN: -Bstatic --noinhibit-exec %t-a-arm.o %t-t-thm.o -o %t +# RUN: llvm-objdump -t %t | FileCheck -check-prefix=INTER %s + +# INTER: SYMBOL TABLE: +# INTER: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_t_from_arm +# INTER: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_a_from_thumb + +# 2. Thumb <=> Thumb doesn't generate veneers. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-a-thm.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=f_t \ +# RUN: -Bstatic --noinhibit-exec %t-t-thm.o %t-a-thm.o -o %t +# RUN: llvm-objdump -t %t | FileCheck -check-prefix=THUMB %s + +# THUMB: SYMBOL TABLE: +# THUMB-NOT: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_t_from_thumb +# THUMB-NOT: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_a_from_thumb + +# f-a-arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEBFEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: f_t + Type: R_ARM_CALL + - Offset: 0x000000000000000C + Symbol: f_t + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$a' + Section: .text + Size: 0x0000000000000002 + - Name: '$a.f_a' + Section: .text + Value: 0x0000000000000002 + Global: + - Name: f_a + Type: STT_FUNC + Section: .text + - Name: f_t + +# f-a-thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B7047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$t' + Section: .text + Size: 0x0000000000000002 + - Name: '$t.f_a' + Section: .text + Value: 0x0000000000000002 + Global: + - Name: f_a + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + +# f-t-thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B500AFFFF7FEFFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: f_a + Type: R_ARM_THM_CALL + - Offset: 0x0000000000000008 + Symbol: f_a + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$t' + Section: .text + Size: 0x0000000000000002 + - Name: '$t.f_t' + Section: .text + Value: 0x0000000000000002 + Global: + - Name: f_t + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: f_a +... diff --git a/test/old-elf/ARM/mapping-symbols.test b/test/old-elf/ARM/mapping-symbols.test new file mode 100644 index 000000000000..c6a4b7afc50b --- /dev/null +++ b/test/old-elf/ARM/mapping-symbols.test @@ -0,0 +1,122 @@ +# Check that mapping symbols have zero size, local binding and none type. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-a.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-t.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-a.o %t-t.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck %s + +# CHECK: Name: $a (1) +# CHECK-NEXT: Value: 0x{{[0-9a-f]+}} +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# +# CHECK: Name: $t (9) +# CHECK-NEXT: Value: 0x{{[0-9a-f]+}} +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# +# CHECK: Name: $d (24) +# CHECK-NEXT: Value: 0x{{[0-9a-f]+}} +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: _Z1fv + Type: R_ARM_CALL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$a' + Section: .text + Global: + - Name: main + Type: STT_FUNC + Section: .text + - Name: _Z1fv + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200031B681846BD465DF8047B7047 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: _ZL1i + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x0000000000000008 + Symbol: _ZL1i + Type: R_ARM_THM_MOVT_ABS + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 +Symbols: + Local: + - Name: _ZL1i + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: '$d' + Section: .bss + - Name: '$t' + Section: .text + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 +... diff --git a/test/old-elf/ARM/missing-symbol.test b/test/old-elf/ARM/missing-symbol.test new file mode 100644 index 000000000000..a0d3dd51e57b --- /dev/null +++ b/test/old-elf/ARM/missing-symbol.test @@ -0,0 +1,38 @@ +# Check that _MISSING_SYMBOL_ symbol is not resolved + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2>&1 | FileCheck %s + +# CHECK: Undefined symbol: {{.*}}: _MISSING_SYMBOL_ + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: _MISSING_SYMBOL_ +... diff --git a/test/old-elf/ARM/plt-dynamic.test b/test/old-elf/ARM/plt-dynamic.test new file mode 100644 index 000000000000..905f628edb49 --- /dev/null +++ b/test/old-elf/ARM/plt-dynamic.test @@ -0,0 +1,200 @@ +# Check that PLT entries are properly generated when link dynamically. +# +# 1. ARM code generates PLT entries. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-arm.o -lfn -L%p/Inputs -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM %s + +# ARM: Contents of section .rel.plt: +# ARM-NEXT: 400134 0c104000 16010000 +# GOT addr = 0x40100c ^^ +# ARM-NEXT: Contents of section .plt: +# ARM-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5 +# ^ -- PLT0 -- +# ARM-NEXT: 40014c bc0e0000 00c68fe2 00ca8ce2 b4febce5 +# -- ^ ^ -- PLT_fn -- ^ +# ARM-NEXT: Contents of section .text: +# ARM-NEXT: 40015c {{[0-9a-f]+}} {{[0-9a-f]+}} f9ffffea +# b PLT_fn ^^ +# ARM: Contents of section .got.plt: +# ARM-NEXT: 401000 00000000 00000000 00000000 3c014000 +# PLT0 addr = 0x40013c ^^ + +# 2. Thumb code generates PLT entries with veneers. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM %s + +# THM: Contents of section .rel.plt: +# THM-NEXT: 400134 0c104000 16010000 +# GOT addr = 0x40100c ^^ +# THM-NEXT: Contents of section .plt: +# THM-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5 +# ^ -- PLT0 -- +# THM-NEXT: 40014c bc0e0000 78470000 00c68fe2 00ca8ce2 +# -- ^ veneer ^ ^ -- PLT_fn -- +# THM-NEXT: 40015c b0febce5 +# -- ^ +# THM: Contents of section .text: +# THM-NEXT: 400160 {{[0-9a-f]+}} fff7f4bf +# b PLT_fn ^^ + +# 3. Thumb code generates PLT entries without veneers when bl->blx is done. +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-BLX %s + +# THM-BLX: Contents of section .rel.plt: +# THM-BLX-NEXT: 400134 0c104000 16010000 +# GOT addr = 0x40100c ^^ +# THM-BLX-NEXT: Contents of section .plt: +# THM-BLX-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5 +# ^ -- PLT0 -- +# THM-BLX-NEXT: 40014c bc0e0000 00c68fe2 00ca8ce2 b4febce5 +# -- ^ ^ -- PLT_fn -- ^ +# THM-BLX: Contents of section .text: +# THM-BLX-NEXT: 40015c {{[0-9a-f]+}} fff7f6ef +# blx PLT_fn ^^ + +# Generation of mapping symbols. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-arm.o -lfn -L%p/Inputs -o %t-arm +# RUN: llvm-readobj -symbols %t-arm | FileCheck -check-prefix=ARM-MAPPING %s + +# ARM-MAPPING: Name: {{[$]?[a]?[.]?}}__PLT0 +# ARM-MAPPING: Name: {{[$]?[d]?[.]?}}__PLT0_d +# ARM-MAPPING: Name: {{[$]?[a]?[.]?}}__plt_fn + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t-thm +# RUN: llvm-readobj -symbols %t-thm | FileCheck -check-prefix=THM-MAPPING %s + +# THM-MAPPING: Name: {{[$]?[a]?[.]?}}__PLT0 +# THM-MAPPING: Name: {{[$]?[d]?[.]?}}__PLT0_d +# THM-MAPPING: Name: {{[$]?[t]?[.]?}}__plt_from_thumb_fn +# THM-MAPPING: Name: {{[$]?[a]?[.]?}}__plt_fn + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: fn + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + - Name: fn + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: fn + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: fn + +# thm-c.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B500AFFFF7FEFF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: fn + Type: R_ARM_THM_CALL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: fn +... diff --git a/test/old-elf/ARM/plt-ifunc-interwork.test b/test/old-elf/ARM/plt-ifunc-interwork.test new file mode 100644 index 000000000000..29d8282edf26 --- /dev/null +++ b/test/old-elf/ARM/plt-ifunc-interwork.test @@ -0,0 +1,396 @@ +# Check that PLT entries are properly generated for cases when +# referenced from both ARM and Thumb code. +# +# 1. ARM code generates PLT without transition veneer. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-ONE %s + +# ARM-ONE: Contents of section .plt: +# ARM-ONE-NEXT: 40007c 00c68fe2 00ca8ce2 7cffbce5 +# ^ regular veneer ^ +# Next line shows that .plt section ends. +# ARM-ONE-NEXT: Contents of section .text: + +# 2. Thumb code generates PLT with transition veneer. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s + +# THM-ONE: Contents of section .plt: +# THM-ONE-NEXT: 40007c 78470000 00c68fe2 00ca8ce2 78ffbce5 +# bx pc ^^ ^ regular veneer ^ +# Next line shows that .plt section ends. +# THM-ONE-NEXT: Contents of section .text: + +# 3. ARM + Thumb code generate same single PLT with transition veneer. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-f1-thm-for-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f1-thm-for-arm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s + +# 4. Thumb + ARM code generate same single PLT with transition veneer. +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-f1-thm-for-arm.o +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-thm-for-arm.o %t-f1-arm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s + +# 5. ARM + ARM code generate two PLTs without transition veneers. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-f2-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f2-arm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-TWO %s + +# ARM-TWO: Contents of section .plt: +# ARM-TWO-NEXT: 400084 00c68fe2 00ca8ce2 74ffbce5 00c68fe2 +# ^ regular veneer 1 ^ ^ -- +# ARM-TWO-NEXT: 400094 00ca8ce2 6cffbce5 +# --- regular veneer 2 ^ +# Next line shows that .plt section ends. +# ARM-TWO-NEXT: Contents of section .text: + +# 6. ARM + Thumb code generate two PLTs without and with transition veneer. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o +# RUN: yaml2obj -format=elf -docnum 5 %s > %t-f2-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f2-thm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-THM-TWO %s + +# ARM-THM-TWO: Contents of section .plt: +# ARM-THM-TWO-NEXT: 400084 00c68fe2 00ca8ce2 74ffbce5 78470000 +# ^ regular veneer 1 ^ ^^ bx pc 2 +# ARM-THM-TWO-NEXT: 400094 00c68fe2 00ca8ce2 68ffbce5 +# ^ regular veneer 2 ^ +# Next line shows that .plt section ends. +# ARM-THM-TWO-NEXT: Contents of section .text: + +# 7. Thumb + ARM code generate two PLTs with and without transition veneer. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-f2-arm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o %t-f2-arm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ARM-TWO %s + +# THM-ARM-TWO: Contents of section .plt: +# THM-ARM-TWO-NEXT: 400084 78470000 00c68fe2 00ca8ce2 70ffbce +# bx pc 1 ^^ ^ regular veneer 1 ^ +# THM-ARM-TWO-NEXT: 400094 00c68fe2 00ca8ce2 68ffbce5 +# ^ regular veneer 2 ^ +# Next line shows that .plt section ends. +# THM-ARM-TWO-NEXT: Contents of section .text: + +# 8. Thumb + Thumb code generate two PLTs with transition veneers. +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o +# RUN: yaml2obj -format=elf -docnum 5 %s > %t-f2-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o %t-f2-thm.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-TWO %s + +# THM-TWO: Contents of section .plt: +# THM-TWO-NEXT: 400084 78470000 00c68fe2 00ca8ce2 70ffbce5 +# bx pc 1 ^^ ^ regular veneer 1 ^ +# THM-TWO-NEXT: 400094 78470000 00c68fe2 00ca8ce2 64ffbce5 +# bx pc 2 ^^ ^ regular veneer 2 ^ +# Next line shows that .plt section ends. +# THM-TWO-NEXT: Contents of section .text: + +# 9. Thumb code generates PLT without transition veneer when bl->blx is done. +# RUN: yaml2obj -format=elf -docnum 6 %s > %t-f1-thm-c.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-f1-thm-c.o -o %t +# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-BL %s + +# THM-BL: Contents of section .plt: +# THM-BL-NEXT: 40007c 00c68fe2 00ca8ce2 7cffbce5 +# ^ regular veneer ^ +# Next line shows that .plt section ends. +# THM-BL-NEXT: Contents of section .text: + +# f1-arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: main + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x000000000000000C + Symbol: main + Type: R_ARM_MOVT_ABS + - Offset: 0x0000000000000028 + Symbol: f1 + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f1 + Type: STT_GNU_IFUNC + Section: .text + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + +# f1-thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: main + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x0000000000000008 + Symbol: main + Type: R_ARM_THM_MOVT_ABS + - Offset: 0x000000000000001C + Symbol: f1 + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f1 + Type: STT_GNU_IFUNC + Section: .text + Value: 0x0000000000000001 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000019 + +# f1-thm-for-arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: f1 + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: f1 + +# f2-arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: f + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x000000000000000C + Symbol: f + Type: R_ARM_MOVT_ABS + - Offset: 0x0000000000000028 + Symbol: f2 + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f2 + Type: STT_GNU_IFUNC + Section: .text + - Name: f + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + +# f2-thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: f + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x0000000000000008 + Symbol: f + Type: R_ARM_THM_MOVT_ABS + - Offset: 0x000000000000001C + Symbol: f2 + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f2 + Type: STT_GNU_IFUNC + Section: .text + Value: 0x0000000000000001 + - Name: f + Type: STT_FUNC + Section: .text + Value: 0x0000000000000019 + +# f1-thm-c.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEFF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: main + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x0000000000000008 + Symbol: main + Type: R_ARM_THM_MOVT_ABS + - Offset: 0x000000000000001C + Symbol: f1 + Type: R_ARM_THM_CALL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f1 + Type: STT_GNU_IFUNC + Section: .text + Value: 0x0000000000000001 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000019 +... diff --git a/test/old-elf/ARM/plt-ifunc-mapping.test b/test/old-elf/ARM/plt-ifunc-mapping.test new file mode 100644 index 000000000000..8c6d23aec084 --- /dev/null +++ b/test/old-elf/ARM/plt-ifunc-mapping.test @@ -0,0 +1,109 @@ +# Check that mapping symbols are properly generated for IFUNC PLT entries. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck %s + +# CHECK: Name: {{[$]?[a]?[.]?}}__plt_ifunc_f1 +# CHECK: Name: {{[$]?[t]?[.]?}}__plt_from_thumb_ifunc_f2 +# CHECK: Name: {{[$]?[a]?[.]?}}__plt_ifunc_f2 + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: main + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x000000000000000C + Symbol: main + Type: R_ARM_MOVT_ABS + - Offset: 0x0000000000000028 + Symbol: f1 + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f1 + Type: STT_GNU_IFUNC + Section: .text + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: f + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x0000000000000008 + Symbol: f + Type: R_ARM_THM_MOVT_ABS + - Offset: 0x000000000000001C + Symbol: f2 + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f2 + Type: STT_GNU_IFUNC + Section: .text + Value: 0x0000000000000001 + - Name: f + Type: STT_FUNC + Section: .text + Value: 0x0000000000000019 +... diff --git a/test/old-elf/ARM/rel-abs32.test b/test/old-elf/ARM/rel-abs32.test new file mode 100644 index 000000000000..7dcf632f53d3 --- /dev/null +++ b/test/old-elf/ARM/rel-abs32.test @@ -0,0 +1,58 @@ +# Check handling of R_ARM_ABS32 relocation. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401000 84004000 +# data = 0x400084 ^^ +# data main addr content +# 0x400084 = 0x400074 + 0x10 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} main +# CHECK: 00401000 g .data 00000004 data + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '10000000' + - Name: .rel.data + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: main + Type: R_ARM_ABS32 + Addend: 0 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000001C + - Name: data + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000004 +... diff --git a/test/old-elf/ARM/rel-arm-call.test b/test/old-elf/ARM/rel-arm-call.test new file mode 100644 index 000000000000..64b789204286 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-call.test @@ -0,0 +1,112 @@ +# Check handling of R_ARM_CALL relocation. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400084 1eff2fe1 00482de9 04b08de2 f7ffffeb +# offset = -0x24 ^^ +# call site offset PC(arm) _Z1fv addr +# 0x400090 + (-0x24) + 0x8 = 0x400074 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# CHECK: 00400088 g F .text {{[0-9a-f]+}} main + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_CALL) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE200D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEB0030A0E30300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000001C + Symbol: _Z1fv + Type: R_ARM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Size: 0x0000000000000014 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000014 + Size: 0x0000000000000018 + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE200D04BE204B09DE41EFF2FE100482DE904B08DE2000080EB0030A0E30300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000001C + Symbol: _Z1fv + Type: R_ARM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Size: 0x0000000000000014 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000014 + Size: 0x0000000000000018 +... diff --git a/test/old-elf/ARM/rel-arm-jump24-veneer-b.test b/test/old-elf/ARM/rel-arm-jump24-veneer-b.test new file mode 100644 index 000000000000..76e9523dbbe7 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-jump24-veneer-b.test @@ -0,0 +1,122 @@ +# Check veneer generation for R_ARM_JUMP24 relocation (B instruction call). + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s + +# STATIC: Contents of section .text: +# STATIC: 400074 010000ea +# Call from main: +# offset = 0x4 ^^ +# call site offset PC(arm) ___Z1fv_from_arm addr +# 0x400074 + 0x4 + 0x8 = 0x400080 +# +# Code of the veneer: +# STATIC: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5 +# STATIC: 400084 79004000 +# ^^ call addr = 0x400079 +# call addr _Z1fv addr Thumb mode +# 0x400079 = 0x400078 | 0x1 +# +# STATIC: SYMBOL TABLE: +# STATIC: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm +# STATIC: 00400074 g F .text {{[0-9a-f]+}} main +# STATIC: 00400078 g F .text {{[0-9a-f]+}} _Z1fv + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Contents of section .text: +# EXEC-DYN: 400114 010000ea +# Call from main: +# offset = 0x4 ^^ +# call site offset PC(arm) ___Z1fv_from_arm addr +# 0x400114 + 0x4 + 0x8 = 0x400120 +# +# Code of the veneer: +# EXEC-DYN: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5 +# EXEC-DYN: 400124 19014000 +# call addr = 0x400119 ^^ +# call addr _Z1fv addr Thumb mode +# 0x400119 = 0x400118 | 0x1 +# +# EXEC-DYN: SYMBOL TABLE: +# EXEC-DYN: 00400120 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm +# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} main +# EXEC-DYN: 00400118 g F .text {{[0-9a-f]+}} _Z1fv + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FEFFFFEA + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Symbol: _Z1fv + Type: R_ARM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + - Name: _Z1fv + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 4FF0000318467047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 +... diff --git a/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test b/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test new file mode 100644 index 000000000000..300355fbb11c --- /dev/null +++ b/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test @@ -0,0 +1,120 @@ +# Check veneer generation for R_ARM_JUMP24 relocation (BL<c> instruction call). + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s + +# STATIC: Contents of section .text: +# STATIC: 400084 0400000b +# Call from main: +# offset = 0x10 ^^ +# call site offset PC(arm) ___Z1fv_from_arm addr +# 0x400084 + 0x10 + 0x8 = 0x40009c +# +# Code of the veneer: +# STATIC: 400094 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 95004000 +# call addr = 0x400095 ^^ +# call addr _Z1fv addr Thumb mode +# 0x400095 = 0x400094 | 0x1 +# +# STATIC: SYMBOL TABLE: +# STATIC: 0040009c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm +# STATIC: 00400074 g F .text {{[0-9a-f]+}} main +# STATIC: 00400094 g F .text {{[0-9a-f]+}} _Z1fv + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Contents of section .text: +# EXEC-DYN: 400124 0400000b +# Call from main: +# offset = 0x10 ^^ +# call site offset PC(arm) ___Z1fv_from_arm addr +# 0x400124 + 0x10 + 0x8 = 0x40013c +# +# Code of the veneer: +# EXEC-DYN: 400134 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 35014000 +# call addr = 0x400135 ^^ +# call addr _Z1fv addr Thumb mode +# 0x400135 = 0x400134 | 0x1 +# +# EXEC-DYN: SYMBOL TABLE: +# EXEC-DYN: 0040013c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm +# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} main +# EXEC-DYN: 00400134 g F .text {{[0-9a-f]+}} _Z1fv + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE20030A0E3000053E3FEFFFF0B0030A0E30300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000010 + Symbol: _Z1fv + Type: R_ARM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + - Name: _Z1fv + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 4FF0000318467047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 +... diff --git a/test/old-elf/ARM/rel-arm-jump24.test b/test/old-elf/ARM/rel-arm-jump24.test new file mode 100644 index 000000000000..c0d8ccc8d386 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-jump24.test @@ -0,0 +1,108 @@ +# Check handling of R_ARM_JUMP24 relocation. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400094 04b08de2 f5ffffea 0030a0e1 0300a0e1 +# offset = -0x2C ^^ +# call site offset PC(arm) _Z1fv addr +# 0x400098 + (-0x2C) + 0x8 = 0x400074 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# CHECK: 00400090 g F .text {{[0-9a-f]+}} main + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_JUMP24) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000024 + Symbol: _Z1fv + Type: R_ARM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000001C + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2000080EA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000024 + Symbol: _Z1fv + Type: R_ARM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000001C +... diff --git a/test/old-elf/ARM/rel-arm-mov.test b/test/old-elf/ARM/rel-arm-mov.test new file mode 100644 index 000000000000..b492cc259060 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-mov.test @@ -0,0 +1,64 @@ +# Check handling of R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS relocation pair. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400074 04b02de5 00b08de2 003001e3 403040e3 +# addrL = 0x1000 ^^ +# addrH = 0x40 ^^ +# addrH addrL _ZL5data1 addr +# (0x40 << 16) + 0x1000 = 0x401000 +# CHECK: SYMBOL TABLE: +# CHECK: 00401000 l .bss 00000004 _ZL5data1 +# CHECK: 00400074 g F .text {{[0-9a-f]+}} main + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE2003000E3003040E30A20A0E3002083E50030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: _ZL5data1 + Type: R_ARM_MOVW_ABS_NC + Addend: 0 + - Offset: 0x000000000000000C + Symbol: _ZL5data1 + Type: R_ARM_MOVT_ABS + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 +Symbols: + Local: + - Name: _ZL5data1 + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + Global: + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/rel-arm-prel31.test b/test/old-elf/ARM/rel-arm-prel31.test new file mode 100644 index 000000000000..b07d5dd9fd75 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-prel31.test @@ -0,0 +1,90 @@ +# Check handling of R_ARM_PREL31 relocation. +# RUN: yaml2obj -format=elf -docnum=1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec --defsym=main=__gxx_personality_v0 %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .ARM.extab: +# CHECK: 4000a4 b1fffe7f +# CHECK: SYMBOL TABLE: +# CHECK: 00400054 g F .text {{[0-9a-f]+}} __gxx_personality_v0 + +# RUN: yaml2obj -format=elf -docnum=2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec --defsym=main=__gxx_personality_v0 %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_PREL31) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .ARM.extab + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x4 + Content: 0000FF7F84019701B0B0B008FFFF01080E2432003A040000 + - Name: .rel.ARM.extab + Type: SHT_REL + Link: .symtab + AddressAlign: 0x4 + Info: .ARM.extab + Relocations: + - Offset: 0 + Symbol: __gxx_personality_v0 + Type: R_ARM_PREL31 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Content: 80B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFFFFF7FEFFFFF7FEFF0420FFF7FEFF0346184601230360002240F20001C0F20001FFF7FEFF3B1D1846FFF7FEFFFFF7FEFF00BF +Symbols: + Local: + Global: + - Name: __gxx_personality_v0 + Type: STT_FUNC + Section: .text + Value: 0x1 + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .ARM.extab + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x4 + Content: 0000004084019701B0B0B008FFFF01080E2432003A040000 + - Name: .rel.ARM.extab + Type: SHT_REL + Link: .symtab + AddressAlign: 0x4 + Info: .ARM.extab + Relocations: + - Offset: 0 + Symbol: __gxx_personality_v0 + Type: R_ARM_PREL31 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Content: 80B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFFFFF7FEFFFFF7FEFF0420FFF7FEFF0346184601230360002240F20001C0F20001FFF7FEFF3B1D1846FFF7FEFFFFF7FEFF00BF +Symbols: + Local: + Global: + - Name: __gxx_personality_v0 + Type: STT_FUNC + Section: .text + Value: 0x1 +... diff --git a/test/old-elf/ARM/rel-arm-target1.test b/test/old-elf/ARM/rel-arm-target1.test new file mode 100644 index 000000000000..064c68661875 --- /dev/null +++ b/test/old-elf/ARM/rel-arm-target1.test @@ -0,0 +1,114 @@ +# Check handling of R_ARM_TARGET1 relocation. +# +# 1. R_ARM_TARGET1 is equal to R_ARM_ABS32 +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-abs32.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec --target1-abs %t-abs32.o -o %t-abs32 +# RUN: llvm-objdump -s -t %t-abs32 | FileCheck -check-prefix=CHECK-ABS32 %s +# +# CHECK-ABS32: Contents of section .data: +# CHECK-ABS32-NEXT: 401000 84004000 +# CHECK-ABS32: SYMBOL TABLE: +# CHECK-ABS32: 00400074 g F .text {{[0-9a-f]+}} main +# CHECK-ABS32: 00401000 g .data 00000004 data +# +# 2. R_ARM_TARGET1 is equal to R_ARM_REL32 +# Check handling of R_ARM_REL32 relocation. +# RUN: yaml2obj -format=elf %s -docnum 2 > %t-rel32.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec --target1-rel %t-rel32.o -o %t-rel32 +# RUN: llvm-objdump -s -t %t-rel32 | FileCheck -check-prefix=CHECK-REL32 %s +# +# CHECK-REL32: Contents of section .text: +# CHECK-REL32-NEXT: 400074 {{[0-9a-f]+}} 880fff00 +# CHECK-REL32: SYMBOL TABLE: +# CHECK-REL32: 00400074 g F .text {{[0-9a-f]+}} main +# CHECK-REL32: 00401000 g .bss {{[0-9a-f]+}} _myref + +# abs32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '10000000' + - Name: .rel.data + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: main + Type: R_ARM_TARGET1 + Addend: 0 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000001C + - Name: data + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000004 +# rel32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF0000FF0000231846BD465DF8047B7047 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: _myref + Type: R_ARM_TARGET1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Global: + - Name: _myref + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x0000000000000014 +... diff --git a/test/old-elf/ARM/rel-arm-thm-interwork.test b/test/old-elf/ARM/rel-arm-thm-interwork.test new file mode 100644 index 000000000000..3e0e30a614ee --- /dev/null +++ b/test/old-elf/ARM/rel-arm-thm-interwork.test @@ -0,0 +1,121 @@ +# Check ARM <=> Thumb interwork. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t + +# Check R_ARM_CALL veneer to call Thumb code +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=ARM-CALL %s + +# ARM-CALL: Contents of section .text: +# ARM-CALL: 400074 00482de9 04b08de2 000000fa 0088bde8 +# offset = 0x0 ^^ +# call site offset PC(arm) _Z2f2v addr +# 0x40007C + 0x0 + 0x8 = 0x400084 +# ARM-CALL: SYMBOL TABLE: +# ARM-CALL: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# ARM-CALL: 00400084 g F .text {{[0-9a-f]+}} _Z2f2v +# ARM-CALL: 00400090 g F .text {{[0-9a-f]+}} main + +# Check R_ARM_THM_CALL veneer to call ARM code +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=THM-CALL %s + +# THM-CALL: Contents of section .text: +# THM-CALL: 400094 00bffff7 eeef0023 184680bd +# offset = -0x24 ^^ +# call site aligned = Align(0x400096, 4) = 0x400094 +# call site aligned offset PC(thm) _Z1fv addr +# 0x400094 + (-0x24) + 0x4 = 0x400074 +# THM-CALL: SYMBOL TABLE: +# THM-CALL: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# THM-CALL: 00400084 g F .text {{[0-9a-f]+}} _Z2f2v +# THM-CALL: 00400090 g F .text {{[0-9a-f]+}} main + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEB0088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: _Z2f2v + Type: R_ARM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Size: 0x0000000000000010 + - Name: _Z2f2v + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AFBD465DF8047B704780B500AF00BFFFF7FEFF0023184680BD + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000012 + Symbol: _Z1fv + Type: R_ARM_THM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z2f2v + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x000000000000000C + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000000D + Size: 0x0000000000000010 + - Name: _Z1fv +... diff --git a/test/old-elf/ARM/rel-base-prel.test b/test/old-elf/ARM/rel-base-prel.test new file mode 100644 index 000000000000..054ce58ff7b8 --- /dev/null +++ b/test/old-elf/ARM/rel-base-prel.test @@ -0,0 +1,61 @@ +# Check handling of R_ARM_BASE_PREL relocation. +# It only works for _GLOBAL_OFFSET_TABLE_ symbol, and returns error +# for other cases. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 401004 fcffffff +# offset = -0x4 ^^ +# addr site offset _GOT_ +# 0x401004 + (-0x4) = 0x401000 +# CHECK: SYMBOL TABLE: +# CHECK: 00401000 g *ABS* {{[0-9a-f]+}} _GLOBAL_OFFSET_TABLE_ + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B7047 + - Name: .got + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '00000000' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '00000000' + - Name: .rel.data + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: _GLOBAL_OFFSET_TABLE_ + Type: R_ARM_BASE_PREL + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: _GLOBAL_OFFSET_TABLE_ +... diff --git a/test/old-elf/ARM/rel-copy.test b/test/old-elf/ARM/rel-copy.test new file mode 100644 index 000000000000..f181f72a2192 --- /dev/null +++ b/test/old-elf/ARM/rel-copy.test @@ -0,0 +1,60 @@ +# Check handling of R_ARM_COPY relocation. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-o.o -lobj -L%p/Inputs -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s +# RUN: llvm-readobj -relocations %t | FileCheck -check-prefix=READOBJ %s + +# CHECK: Contents of section .rel.dyn: +# CHECK-NEXT: 400138 00104000 14010000 +# addr = 0x401000 ^^ ^^ rel_type = 0x14 => R_ARM_COPY +# CHECK: SYMBOL TABLE: +# CHECK: 00401000 g .bss 00000004 object +# +# READOBJ: 0x401000 R_ARM_COPY object + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B483B000AF40F20003C0F200031B687B60002318460C37BD465DF8047B7047 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000006 + Symbol: object + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x000000000000000A + Symbol: object + Type: R_ARM_THM_MOVT_ABS + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$t' + Section: .text + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: object +... diff --git a/test/old-elf/ARM/rel-glob-dat.test b/test/old-elf/ARM/rel-glob-dat.test new file mode 100644 index 000000000000..34f50c5b0e3d --- /dev/null +++ b/test/old-elf/ARM/rel-glob-dat.test @@ -0,0 +1,57 @@ +# Check handling of R_ARM_GLOB_DAT relocation. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \ +# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t +# RUN: llvm-readobj -relocations %t | FileCheck %s + +# CHECK: 0x401000 R_ARM_GLOB_DAT fn + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE208D04DE224209FE502208FE020309FE5033092E708300BE508301BE533FF2FE10030A0E10300A0E104D04BE20088BDE82000000000000000 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000038 + Symbol: _GLOBAL_OFFSET_TABLE_ + Type: R_ARM_BASE_PREL + - Offset: 0x000000000000003C + Symbol: fn + Type: R_ARM_GOT_BREL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$a' + Section: .text + - Name: '$d' + Section: .text + Value: 0x0000000000000038 + Global: + - Name: f + Type: STT_FUNC + Section: .text + - Name: _GLOBAL_OFFSET_TABLE_ + - Name: fn +... diff --git a/test/old-elf/ARM/rel-got-brel.test b/test/old-elf/ARM/rel-got-brel.test new file mode 100644 index 000000000000..c8786d81127f --- /dev/null +++ b/test/old-elf/ARM/rel-got-brel.test @@ -0,0 +1,63 @@ +# Check handling of R_ARM_GOT_BREL relocation. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .got: +# CHECK-NEXT: 401000 75004000 81004000 +# f_thumb = 0x400075 ^^ ^^ main_thumb = 0x400081 +# CHECK: Contents of section .data: +# CHECK-NEXT: 401008 00000000 04000000 +# GOT[0] offset = 0x0 ^^ ^^ GOT[1] offset = 0x4 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} f +# CHECK: 00400080 g F .text {{[0-9a-f]+}} main + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AFBD465DF8047B704780B400AF00231846BD465DF8047B7047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '0000000000000000' + - Name: .rel.data + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: f + Type: R_ARM_GOT_BREL + - Offset: 0x0000000000000004 + Symbol: main + Type: R_ARM_GOT_BREL + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: f + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000000D + - Name: _GLOBAL_OFFSET_TABLE_ +... diff --git a/test/old-elf/ARM/rel-group-relocs.test b/test/old-elf/ARM/rel-group-relocs.test new file mode 100644 index 000000000000..16e82b3e4271 --- /dev/null +++ b/test/old-elf/ARM/rel-group-relocs.test @@ -0,0 +1,71 @@ +# Check handling of group relocations (R_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G1_NC, +# R_ARM_LDR_PC_G2). +# +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: -e plt_func %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400074 00c68fe2 00ca8ce2 84ffbce5 +# Disassembly of section .text: +# plt_func: +# 400074: 00 c6 8f e2 add r12, pc, #0, #12 +# ^ after execution: r12=0x40007c +# 400078: 00 ca 8c e2 add r12, r12, #0, #20 +# ^ after execution: r12=0x40007C +# 40007c: 84 ff bc e5 ldr pc, [r12, #3972]! +# ^ referenced address is 0x401000, after execution pc=0x400074 +# CHECK: Contents of section .data: +# CHECK: 401000 74004000 +# ^ this value is written to pc after execution of comand 0x40007c +# ^ this address is referenced by command at 0x40007c +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text 0000000c plt_func +# CHECK: 00401000 g .data 00000004 got_func + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Content: 00C08FE200C08CE200F0BCE5 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x4 + Relocations: + - Offset: 0 + Symbol: got_func + Type: R_ARM_ALU_PC_G0_NC + Addend: -8 + - Offset: 0x4 + Symbol: got_func + Type: R_ARM_ALU_PC_G1_NC + Addend: -4 + - Offset: 0x8 + Symbol: got_func + Type: R_ARM_LDR_PC_G2 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x4 + Content: 74004000 +Symbols: + Local: + Global: + - Name: plt_func + Type: STT_FUNC + Section: .text + Size: 0xC + - Name: got_func + Section: .data + Size: 0x4 +... diff --git a/test/old-elf/ARM/rel-ifunc.test b/test/old-elf/ARM/rel-ifunc.test new file mode 100644 index 000000000000..7044534af1e3 --- /dev/null +++ b/test/old-elf/ARM/rel-ifunc.test @@ -0,0 +1,101 @@ +# Check handling of IFUNC (gnu_indirect_function). +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .rel.plt: +# CHECK: 400074 00104000 +# CHECK: Contents of section .plt: +# CHECK: 40007c 00c68fe2 00ca8ce2 7cffbce5 +# CHECK: Contents of section .text: +# CHECK: 4001a8 00482de9 04b08de2 d4ffffeb b0ffffeb +# ^ bl #-320 (to address 0x400080=__plt_ifunc_myfunc) +# CHECK: Contents of section .got.plt: +# CHECK: 401000 c0004000 +# CHECK: SYMBOL TABLE: +# CHECK: 004000c0 g .text 00000020 myfunc +# CHECK: 00400074 g *ABS* 00000000 __rel_iplt_start +# CHECK: 0040007c g *ABS* 00000000 __rel_iplt_end + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20130A0E30300A0E100D04BE204B09DE41EFF2FE104B02DE500B08DE20230A0E30300A0E100D04BE204B09DE41EFF2FE104B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE208D04DE208000BE508301BE533FF2FE10030A0E10300A0E104D04BE20088BDE800482DE904B08DE210D04DE2003000E3003040E308300BE5190000EA08301BE50C300BE50C301BE5003093E510300BE50C301BE5043093E57330EFE614300BE514301BE5A00053E30130A0030030A0137330EFE6000053E30600000A10301BE5003093E50300A0E1DAFFFFEB0020A0E110301BE5002083E508301BE5083083E208300BE508201BE5003000E3003040E3030052E1E0FFFF3A04D04BE20088BDE800482DE904B08DE2D4FFFFEBFEFFFFEB0030A0E30300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000040 + Symbol: myfunc1 + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x0000000000000044 + Symbol: myfunc1 + Type: R_ARM_MOVT_ABS + - Offset: 0x000000000000008C + Symbol: __rel_iplt_start + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x0000000000000090 + Symbol: __rel_iplt_start + Type: R_ARM_MOVT_ABS + - Offset: 0x0000000000000108 + Symbol: __rel_iplt_end + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x000000000000010C + Symbol: __rel_iplt_end + Type: R_ARM_MOVT_ABS + - Offset: 0x000000000000012C + Symbol: myfunc + Type: R_ARM_CALL +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: '$a' + Section: .text + - Name: elf_ifunc_invoke + Type: STT_FUNC + Section: .text + Value: 0x0000000000000058 + Size: 0x0000000000000028 + - Name: apply_irel + Type: STT_FUNC + Section: .text + Value: 0x0000000000000080 + Size: 0x00000000000000A0 + Global: + - Name: myfunc1 + Type: STT_FUNC + Section: .text + Size: 0x000000000000001C + - Name: myfunc2 + Type: STT_FUNC + Section: .text + Value: 0x000000000000001C + Size: 0x000000000000001C + - Name: myfunc + Type: STT_GNU_IFUNC + Section: .text + Value: 0x0000000000000038 + Size: 0x0000000000000020 + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0000000000000120 + Size: 0x000000000000001C + Weak: + - Name: __rel_iplt_start + - Name: __rel_iplt_end +... diff --git a/test/old-elf/ARM/rel-jump-slot.test b/test/old-elf/ARM/rel-jump-slot.test new file mode 100644 index 000000000000..2a4f4eba8d84 --- /dev/null +++ b/test/old-elf/ARM/rel-jump-slot.test @@ -0,0 +1,50 @@ +# Check handling of R_ARM_JUMP_SLOT relocation. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \ +# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t +# RUN: llvm-readobj -relocations %t | FileCheck %s + +# CHECK: 0x40100C R_ARM_JUMP_SLOT fn 0x0 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: fn + Type: R_ARM_CALL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$a' + Section: .text + Global: + - Name: f + Type: STT_FUNC + Section: .text + - Name: fn +... diff --git a/test/old-elf/ARM/rel-rel32.test b/test/old-elf/ARM/rel-rel32.test new file mode 100644 index 000000000000..9e5aab000523 --- /dev/null +++ b/test/old-elf/ARM/rel-rel32.test @@ -0,0 +1,56 @@ +# Check handling of R_ARM_REL32 relocation. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 400074 {{[0-9a-f]+}} 880fff00 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} main +# CHECK: 00401000 g .bss {{[0-9a-f]+}} _myref + +--- +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF0000FF0000231846BD465DF8047B7047 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: _myref + Type: R_ARM_REL32 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Global: + - Name: _myref + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x0000000000000014 +... diff --git a/test/old-elf/ARM/rel-thm-call.test b/test/old-elf/ARM/rel-thm-call.test new file mode 100644 index 000000000000..7e7289a99768 --- /dev/null +++ b/test/old-elf/ARM/rel-thm-call.test @@ -0,0 +1,114 @@ +# Check handling of R_ARM_THM_CALL relocation. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400084 fff7f6ff 00231846 80bd00bf +# ^^ offset = -0x14 +# call site offset PC(thm) _Z1fv addr +# 0x400084 + (-0x14) + 0x4 = 0x400074 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# CHECK: 00400080 g F .text {{[0-9a-f]+}} main + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_CALL) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AFBD465DF8047B704780B500AFFFF7FEFF0023184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000010 + Symbol: _Z1fv + Type: R_ARM_THM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x000000000000000C + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000000D + Size: 0x000000000000000E + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AFBD465DF8047B704780B500AF00F400D00023184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000010 + Symbol: _Z1fv + Type: R_ARM_THM_CALL + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x000000000000000C + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000000D + Size: 0x000000000000000E +... diff --git a/test/old-elf/ARM/rel-thm-jump11.test b/test/old-elf/ARM/rel-thm-jump11.test new file mode 100644 index 000000000000..e074b9ae1abf --- /dev/null +++ b/test/old-elf/ARM/rel-thm-jump11.test @@ -0,0 +1,209 @@ +# Check handling of R_ARM_THM_JUMP11 relocation. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 4001a4 0021c7e7 +# CHECK: SYMBOL TABLE: +# CHECK: 00400138 g F .text 00000060 __gnu_h2f_internal +# CHECK: 004001a4 g F .text 00000004 __gnu_h2f_alternative + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_JUMP11) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E70021FEE7 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000012A + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Offset: 0x0000000000000132 + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Name: .text.startup + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 0020FFF7FEBF00BF + - Name: .rel.text.startup + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text.startup + Relocations: + - Offset: 0x0000000000000002 + Symbol: __gnu_h2f_alternative + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$t' + Section: .text + - Name: __gnu_f2h_internal + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x00000000000000C2 + Global: + - Name: __gnu_f2h_alternative + Type: STT_FUNC + Section: .text + Value: 0x000000000000012D + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_alternative + Type: STT_FUNC + Section: .text + Value: 0x0000000000000131 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000129 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: main + Type: STT_FUNC + Section: .text.startup + Value: 0x0000000000000001 + Size: 0x0000000000000006 + - Name: __gnu_f2h_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000125 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_internal + Type: STT_FUNC + Section: .text + Value: 0x00000000000000C5 + Size: 0x000000000000005E + Visibility: STV_HIDDEN + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E7002100E4 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000012A + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Offset: 0x0000000000000132 + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Name: .text.startup + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 0020FFF7FEBF00BF + - Name: .rel.text.startup + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text.startup + Relocations: + - Offset: 0x0000000000000002 + Symbol: __gnu_h2f_alternative + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$t' + Section: .text + - Name: __gnu_f2h_internal + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x00000000000000C2 + Global: + - Name: __gnu_f2h_alternative + Type: STT_FUNC + Section: .text + Value: 0x000000000000012D + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_alternative + Type: STT_FUNC + Section: .text + Value: 0x0000000000000131 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000129 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: main + Type: STT_FUNC + Section: .text.startup + Value: 0x0000000000000001 + Size: 0x0000000000000006 + - Name: __gnu_f2h_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000125 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_internal + Type: STT_FUNC + Section: .text + Value: 0x00000000000000C5 + Size: 0x000000000000005E + Visibility: STV_HIDDEN +... diff --git a/test/old-elf/ARM/rel-thm-jump24-veneer.test b/test/old-elf/ARM/rel-thm-jump24-veneer.test new file mode 100644 index 000000000000..5893b53da84a --- /dev/null +++ b/test/old-elf/ARM/rel-thm-jump24-veneer.test @@ -0,0 +1,120 @@ +# Check veneer generation for R_ARM_THM_JUMP24 relocation (B instruction call). + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s + +# STATIC: Contents of section .text: +# STATIC: 400074 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8 +# Call from main: +# offset = 0x0 ^^ +# call site offset PC(thm) ___Z1fv_from_thumb addr +# 0x400080 + 0x0 + 0x4 = 0x400084 +# +# Code of the veneer: +# STATIC: 400084 78470000 f9ffffea +# offset = -0x1C ^^ +# call site offset PC(arm) _Z1fv +# 0x400088 + (-0x1C) + 0x8 = 0x400074 +# +# STATIC: SYMBOL TABLE: +# STATIC: 00400084 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb +# STATIC: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# STATIC: 00400080 g F .text {{[0-9a-f]+}} main + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Contents of section .text: +# EXEC-DYN: 400114 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8 +# Call from main: +# offset = 0x0 ^^ +# call site offset PC(thm) ___Z1fv_from_thumb addr +# 0x400120 + 0x0 + 0x4 = 0x400124 +# +# Code of the veneer: +# EXEC-DYN: 400124 78470000 f9ffffea +# offset = -0x1C ^^ +# call site offset PC(arm) _Z1fv +# 0x400128 + (-0x1C) + 0x8 = 0x400114 +# +# EXEC-DYN: SYMBOL TABLE: +# EXEC-DYN: 00400124 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb +# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} _Z1fv +# EXEC-DYN: 00400120 g F .text {{[0-9a-f]+}} main + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 0030A0E30300A0E11EFF2FE1 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: FFF7FEBF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Symbol: _Z1fv + Type: R_ARM_THM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: _Z1fv +... diff --git a/test/old-elf/ARM/rel-thm-jump24.test b/test/old-elf/ARM/rel-thm-jump24.test new file mode 100644 index 000000000000..b58bc053aca0 --- /dev/null +++ b/test/old-elf/ARM/rel-thm-jump24.test @@ -0,0 +1,110 @@ +# Check handling of R_ARM_THM_JUMP24 relocation. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: 400084 80b500af fff7f4bf 03461846 80bd00bf +# ^^ offset = -0x18 +# call site offset PC(thm) _Z1fv addr +# 0x400088 + (-0x18) + 0x4 = 0x400074 +# CHECK: SYMBOL TABLE: +# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv +# CHECK: 00400084 g F .text {{[0-9a-f]+}} main + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error +# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error + +# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_JUMP24) + +# good.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B704780B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000014 + Symbol: _Z1fv + Type: R_ARM_THM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000011 + +# overflow.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B704780B500AF00F400900346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000014 + Symbol: _Z1fv + Type: R_ARM_THM_JUMP24 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: _Z1fv + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000011 +... diff --git a/test/old-elf/ARM/rel-thm-mov.test b/test/old-elf/ARM/rel-thm-mov.test new file mode 100644 index 000000000000..5e2e134ce781 --- /dev/null +++ b/test/old-elf/ARM/rel-thm-mov.test @@ -0,0 +1,70 @@ +# 1. Check handling of R_ARM_THM_MOVW_ABS_NC and R_THM_ARM_MOVT_ABS relocation pair. +# 2. Check that instructions are not cropped for symbols that address Thumb code. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck %s +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=INSN-CROP %s + +# CHECK: Contents of section .text: +# CHECK: 400074 {{[0-9a-f]+}} 41f20003 c0f24003 0a221a60 +# addrL = 0x1000 ^^ +# addrH = 0x40 ^^ +# addrH addrL _ZL5data1 addr +# (0x40 << 16) + 0x1000 = 0x401000 +# CHECK: SYMBOL TABLE: +# CHECK: 00401000 l .bss 00000004 _ZL5data1 +# CHECK: 00400074 g F .text {{[0-9a-f]+}} main +# +# INSN-CROP: Contents of section .text: +# INSN-CROP: 400074 80b400af + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF40F20003C0F200030A221A6000231846BD465DF8047B7047 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: _ZL5data1 + Type: R_ARM_THM_MOVW_ABS_NC + Addend: 0 + - Offset: 0x0000000000000008 + Symbol: _ZL5data1 + Type: R_ARM_THM_MOVT_ABS + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 +Symbols: + Local: + - Name: _ZL5data1 + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 +... diff --git a/test/old-elf/ARM/rel-tls-ie32.test b/test/old-elf/ARM/rel-tls-ie32.test new file mode 100644 index 000000000000..e05b262cd1bc --- /dev/null +++ b/test/old-elf/ARM/rel-tls-ie32.test @@ -0,0 +1,125 @@ +# Check handling of R_ARM_TLS_IE32 relocation. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-tls.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-tlsv.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-tls.o %t-tlsv.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s + +# STATIC: Contents of section .got: +# STATIC-NEXT: 401008 08000000 0c000000 +# tp_off(i) = 0x08 ^^ ^^ tp_off(j) = 0x0c +# tp_off(i) + sizeof(i) = tp_off(j) +# 0x08 + 0x04 = 0x0c +# STATIC: SYMBOL TABLE: +# STATIC: 00400094 g F .text {{[0-9a-f]+}} main +# STATIC: 00000000 g .tdata 00000004 i +# sizeof(i) = 0x04 ^^ +# STATIC: 00000004 g .tdata 00000004 j + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-tls.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-tlsv.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-tls.o %t-tlsv.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Contents of section .rel.dyn: +# EXEC-DYN-NEXT: 400134 08104000 13000000 0c104000 13000000 +# addr(i) = 0x401008 ^^ ^^ addr(j) = 0x40100c +# EXEC-DYN: Contents of section .got: +# EXEC-DYN-NEXT: 401008 00000000 04000000 +# tls_off(i) = 0x00 ^^ ^^ tls_off(j) = 0x04 +# EXEC-DYN: SYMBOL TABLE: +# EXEC-DYN: 00400144 g F .text {{[0-9a-f]+}} main +# EXEC-DYN: 00000000 g .tdata 00000004 i +# EXEC-DYN: 00000004 g .tdata 00000004 j + +# tls.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF0C4B7B441B681DEE702FD2580A4B7B441B681DEE701FCB581A44084B7B441B681DEE701FCB585B0013441846BD465DF8047B70472E000000260000001C000000 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000038 + Symbol: i + Type: R_ARM_TLS_IE32 + - Offset: 0x000000000000003C + Symbol: i + Type: R_ARM_TLS_IE32 + - Offset: 0x0000000000000040 + Symbol: j + Type: R_ARM_TLS_IE32 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: i + Type: STT_TLS + - Name: j + Type: STT_TLS + +# tlsv.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: 05000000FBFFFFFF +Symbols: + Global: + - Name: i + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: j + Type: STT_TLS + Section: .tdata + Value: 0x0000000000000004 + Size: 0x0000000000000004 +... diff --git a/test/old-elf/ARM/rel-tls-le32.test b/test/old-elf/ARM/rel-tls-le32.test new file mode 100644 index 000000000000..eba4f950515b --- /dev/null +++ b/test/old-elf/ARM/rel-tls-le32.test @@ -0,0 +1,73 @@ +# Check handling of R_ARM_TLS_LE32 relocation. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s + +# STATIC: Contents of section .text: +# STATIC: 4000b4 {{[0-9a-f]+}} 08000000 +# tp_off = 0x000008 ^^ +# STATIC: SYMBOL TABLE: +# STATIC: 00400094 g F .text {{[0-9a-f]+}} main +# STATIC: 00000000 g .tdata 00000004 i + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s + +# EXEC-DYN: Contents of section .text: +# EXEC-DYN: 400154 {{[0-9a-f]+}} 08000000 +# tp_off = 0x000008 ^^ +# EXEC-DYN: SYMBOL TABLE: +# EXEC-DYN: 00400134 g F .text {{[0-9a-f]+}} main +# EXEC-DYN: 00000000 g .tdata 00000004 i + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE2703F1DEE10209FE5023093E70300A0E100D04BE204B09DE41EFF2FE100000000 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000024 + Symbol: i + Type: R_ARM_TLS_LE32 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: '05000000' +Symbols: + Global: + - Name: i + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/rel-v4bx.test b/test/old-elf/ARM/rel-v4bx.test new file mode 100644 index 000000000000..d2d3a7772b47 --- /dev/null +++ b/test/old-elf/ARM/rel-v4bx.test @@ -0,0 +1,72 @@ +# REQUIRES: arm + +# Check handling of R_ARM_V4BX relocation. +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \ +# RUN: --noinhibit-exec %t-o.o -o %t +# RUN: llvm-objdump -d -triple=armv4t %t | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK: main: +# The following instruction creates a RM_ARM_V4BX relocation that +# allows the linker to replace the bx instruction to a ARMv4 +# compatible one. Currently lld does not change it. +# CHECK: 400114: 1e ff 2f 01 bxeq lr + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 1EFF2F01 + - Name: .rel.text + Type: SHT_REL + Flags: [ SHF_INFO_LINK ] + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Symbol: '' + Type: R_ARM_V4BX + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + - Name: .ARM.attributes + Type: SHT_ARM_ATTRIBUTES + AddressAlign: 0x0000000000000001 + Content: 4115000000616561626900010B000000060208010901 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: '$a' + Section: .text + - Name: .ARM.attributes + Type: STT_SECTION + Section: .ARM.attributes + Global: + - Name: main + Type: STT_FUNC + Section: .text +... diff --git a/test/old-elf/ARM/thm-symbols.test b/test/old-elf/ARM/thm-symbols.test new file mode 100644 index 000000000000..6377d1e3ef89 --- /dev/null +++ b/test/old-elf/ARM/thm-symbols.test @@ -0,0 +1,51 @@ +# Check that symbols formed from Thumb instructions are valid: +# 1. Symbol address. +# 2. Symbol content size. +# 3. Symbol content. + +# RUN: yaml2obj -format=elf %s > %t-t.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu \ +# RUN: -Bstatic --noinhibit-exec %t-t.o -o %t-t +# RUN: llvm-readobj -symbols %t-t | FileCheck -check-prefix=SYM-ADDR %s +# RUN: llvm-readobj -symbols %t-t | FileCheck -check-prefix=SYM-SIZE %s +# RUN: llvm-objdump -s -t %t-t | FileCheck -check-prefix=SYM-CONTENT %s + +# SYM-ADDR: Name: main (1) +# SYM-ADDR-NEXT: Value: 0x400075 + +# SYM-SIZE: Name: main (1) +# SYM-SIZE-NEXT: Value: 0x{{[0-9a-f]+}} +# SYM-SIZE-NEXT: Size: 16 + +# SYM-CONTENT: Contents of section .text: +# SYM-CONTENT-NEXT: 400074 80b400af 00231846 bd465df8 047b7047 .....#.F.F]..{pG + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF00231846BD465DF8047B7047 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 +... diff --git a/test/old-elf/ARM/two-got-for-symbol.test b/test/old-elf/ARM/two-got-for-symbol.test new file mode 100644 index 000000000000..e0420eff1918 --- /dev/null +++ b/test/old-elf/ARM/two-got-for-symbol.test @@ -0,0 +1,62 @@ +# Check that two GOT entries containing R_ARM_JUMP_SLOT and +# R_ARM_GLOB_DAT may be present for the same symbol in the linked binary. + +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \ +# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t +# RUN: llvm-readobj -relocations %t | FileCheck %s + +# CHECK: 0x401000 R_ARM_GLOB_DAT fn 0x0 +# CHECK: 0x401010 R_ARM_JUMP_SLOT fn 0x0 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 10482DE908B08DE20CD04DE230209FE502208FE02C309FE5033092E710300BE5FEFFFFEB0040A0E110301BE533FF2FE10030A0E1033084E00300A0E108D04BE21088BDE82C00000000000000 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000020 + Symbol: fn + Type: R_ARM_CALL + - Offset: 0x0000000000000044 + Symbol: _GLOBAL_OFFSET_TABLE_ + Type: R_ARM_BASE_PREL + - Offset: 0x0000000000000048 + Symbol: fn + Type: R_ARM_GOT_BREL + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: '$a' + Section: .text + - Name: '$d' + Section: .text + Value: 0x0000000000000044 + Global: + - Name: f + Type: STT_FUNC + Section: .text + - Name: fn + - Name: _GLOBAL_OFFSET_TABLE_ +... diff --git a/test/old-elf/ARM/undef-lazy-symbol.test b/test/old-elf/ARM/undef-lazy-symbol.test new file mode 100644 index 000000000000..361c6482dabe --- /dev/null +++ b/test/old-elf/ARM/undef-lazy-symbol.test @@ -0,0 +1,133 @@ +# Check that _GLOBAL_OFFSET_TABLE_ symbol is resolved + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-got.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-got.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=GOT %s + +# GOT: Name: _GLOBAL_OFFSET_TABLE_ (183) +# GOT-NEXT: Value: {{[0-9]+}} +# GOT-NEXT: Size: 0 +# GOT-NEXT: Binding: Global (0x1) +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Other: 0 +# GOT-NEXT: Section: Absolute (0xFFF1) + +# Check that __exidx_start/_end symbols are resolved + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-exidx.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --defsym=main=fn --noinhibit-exec %t-exidx.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=EXIDX %s + +# EXIDX: Name: __exidx_start (186) +# EXIDX-NEXT: Value: {{[0-9]+}} +# EXIDX-NEXT: Size: 0 +# EXIDX-NEXT: Binding: Global (0x1) +# EXIDX-NEXT: Type: Object (0x1) +# EXIDX-NEXT: Other: 0 +# EXIDX-NEXT: Section: Absolute (0xFFF1) +# +# EXIDX: Name: __exidx_end (200) +# EXIDX-NEXT: Value: {{[0-9]+}} +# EXIDX-NEXT: Size: 0 +# EXIDX-NEXT: Binding: Global (0x1) +# EXIDX-NEXT: Type: Object (0x1) +# EXIDX-NEXT: Other: 0 +# EXIDX-NEXT: Section: Absolute (0xFFF1) + +# Check that all symbols are resolved + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-got.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-exidx.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-got.o %t-exidx.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SYMS %s + +# SYMS: Name: _GLOBAL_OFFSET_TABLE_ (186) +# SYMS-NEXT: Value: {{[0-9]+}} +# SYMS-NEXT: Size: 0 +# SYMS-NEXT: Binding: Global (0x1) +# SYMS-NEXT: Type: Object (0x1) +# SYMS-NEXT: Other: 0 +# SYMS-NEXT: Section: Absolute (0xFFF1) +# +# SYMS: Name: __exidx_start (208) +# SYMS-NEXT: Value: {{[0-9]+}} +# SYMS-NEXT: Size: 0 +# SYMS-NEXT: Binding: Global (0x1) +# SYMS-NEXT: Type: Object (0x1) +# SYMS-NEXT: Other: 0 +# SYMS-NEXT: Section: Absolute (0xFFF1) +# +# SYMS: Name: __exidx_end (222) +# SYMS-NEXT: Value: {{[0-9]+}} +# SYMS-NEXT: Size: 0 +# SYMS-NEXT: Binding: Global (0x1) +# SYMS-NEXT: Type: Object (0x1) +# SYMS-NEXT: Other: 0 +# SYMS-NEXT: Section: Absolute (0xFFF1) + +# got.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: _GLOBAL_OFFSET_TABLE_ + +# exidx.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: fn + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: __exidx_start + - Name: __exidx_end +... diff --git a/test/old-elf/ARM/veneer-mapping.test b/test/old-elf/ARM/veneer-mapping.test new file mode 100644 index 000000000000..ccd93eea4fbd --- /dev/null +++ b/test/old-elf/ARM/veneer-mapping.test @@ -0,0 +1,92 @@ +# Check that mapping symbols are properly generated for veneers. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o +# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=fa \ +# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t +# RUN: llvm-readobj -symbols %t | FileCheck %s + +# CHECK: Name: $a.__ft_from_arm +# CHECK: Name: $d.__ft_from_arm +# CHECK: Name: $t.__fa_from_thumb +# CHECK: Name: $a.__fa_from_thumb + +# arm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: ft + Type: R_ARM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: fa + Type: STT_FUNC + Section: .text + - Name: ft + +# thm.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B500AFFFF7FEBF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: fa + Type: R_ARM_THM_JUMP24 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Global: + - Name: ft + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + - Name: fa +... diff --git a/test/old-elf/ARM/weak-branch.test b/test/old-elf/ARM/weak-branch.test new file mode 100644 index 000000000000..76c7a4d15b65 --- /dev/null +++ b/test/old-elf/ARM/weak-branch.test @@ -0,0 +1,221 @@ +# Check weak references fixup. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-jmp11.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-jmp11.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=JMP11-CHECK %s + +# JMP11-CHECK: Contents of section .text: +# JMP11-CHECK: 400194 704700bf 01216be7 012100bf 002167e7 +# ^ NOP (thumb16) +# 40019c: 2101 movs r1, #1 +# 40019e: bf00 nop +# JMP11-CHECK: 4001a4 002100bf +# ^ NOP (thumb16) +# 4001a4: 2100 movs r1, #0 +# 4001a6: bf00 nop +# JMP11-CHECK: SYMBOL TABLE: +# JMP11-CHECK: 00000000 w *UND* 00000000 __gnu_h2f_internal + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm-call.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-thm-call.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=THM-CALL-CHECK %s + +# THM-CALL-CHECK: Contents of section .text: +# THM-CALL-CHECK: 400064 80b500af fff7f4ff aff30080 03461846 +# ^ NOP.W +# 400068: f7ff fff4 bl 400054 <my_fn> +# 40006c: f3af 8000 nop.w +# 400070: 4603 mov r3, r0 ; return value has not been changed after weak fn call +# +# THM-CALL-CHECK: SYMBOL TABLE: +# THM-CALL-CHECK: 00000000 w *UND* 00000000 weak_fn + +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-arm-call.o +# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \ +# RUN: --noinhibit-exec %t-arm-call.o -o %t +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=ARM-CALL-CHECK %s + +# ARM-CALL-CHECK: Contents of section .text: +# ARM-CALL-CHECK: 400074 04b08de2 f5ffffeb 00f020e3 0030a0e1 +# ^ NOP +# 400078: ebfffff5 bl 400054 <my_fn> +# 40007c: e320f000 nop {0} +# 400080: e1a03000 mov r3, r0 ; return value has not been changed after weak fn call +# +# ARM-CALL-CHECK: SYMBOL TABLE: +# ARM-CALL-CHECK: 00000000 w *UND* 00000000 weak_fn + +# jump11.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E70021FEE7 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x000000000000012A + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Offset: 0x0000000000000132 + Symbol: __gnu_h2f_internal + Type: R_ARM_THM_JUMP11 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: '$t' + Section: .text + - Name: __gnu_f2h_internal + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x00000000000000C2 + Global: + - Name: __gnu_f2h_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000125 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_ieee + Type: STT_FUNC + Section: .text + Value: 0x0000000000000129 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_f2h_alternative + Type: STT_FUNC + Section: .text + Value: 0x000000000000012D + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + - Name: __gnu_h2f_alternative + Type: STT_FUNC + Section: .text + Value: 0x0000000000000131 + Size: 0x0000000000000004 + Visibility: STV_HIDDEN + Weak: + - Name: __gnu_h2f_internal +# thm-call.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 80B400AF01231846BD465DF8047B704780B500AFFFF7FEFFFFF7FEFF0346184680BD00BF + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000014 + Symbol: my_fn + Type: R_ARM_THM_CALL + - Offset: 0x0000000000000018 + Symbol: weak_fn + Type: R_ARM_THM_CALL +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: '$t' + Section: .text + Global: + - Name: my_fn + Type: STT_FUNC + Section: .text + Value: 0x0000000000000001 + Size: 0x0000000000000010 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000011 + Size: 0x0000000000000012 + Weak: + - Name: weak_fn +# arm-call.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 04B02DE500B08DE20130A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEBFEFFFFEB0030A0E10300A0E10088BDE8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .text + Relocations: + - Offset: 0x0000000000000024 + Symbol: my_fn + Type: R_ARM_CALL + - Offset: 0x0000000000000028 + Symbol: weak_fn + Type: R_ARM_CALL +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: '$a' + Section: .text + Global: + - Name: my_fn + Type: STT_FUNC + Section: .text + Size: 0x000000000000001C + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000001C + Size: 0x000000000000001C + Weak: + - Name: weak_fn +... diff --git a/test/old-elf/Hexagon/Inputs/dynobj-data.c b/test/old-elf/Hexagon/Inputs/dynobj-data.c new file mode 100644 index 000000000000..0f4ea9b80526 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/dynobj-data.c @@ -0,0 +1,3 @@ +int d = 10; + +int fn() { return d; } diff --git a/test/old-elf/Hexagon/Inputs/dynobj-data.o b/test/old-elf/Hexagon/Inputs/dynobj-data.o Binary files differnew file mode 100644 index 000000000000..13d283cd0eff --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/dynobj-data.o diff --git a/test/old-elf/Hexagon/Inputs/dynobj.c b/test/old-elf/Hexagon/Inputs/dynobj.c new file mode 100644 index 000000000000..f17fdadd6945 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/dynobj.c @@ -0,0 +1,26 @@ +extern int shankar; +static int a; +static int b; +int c; +int fn2() { + return 0; +} + +int fn1() { + return 0; +} + +int fn() { + a = 10; + b = 20; + c = 10; + shankar = 20; + return 0; +} + +int fn3() { + fn(); + fn1(); + fn2(); + return 0; +} diff --git a/test/old-elf/Hexagon/Inputs/dynobj.o b/test/old-elf/Hexagon/Inputs/dynobj.o Binary files differnew file mode 100644 index 000000000000..6c184f2edd60 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/dynobj.o diff --git a/test/old-elf/Hexagon/Inputs/got-plt-order.c b/test/old-elf/Hexagon/Inputs/got-plt-order.c new file mode 100644 index 000000000000..621f670ef7c5 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/got-plt-order.c @@ -0,0 +1,6 @@ +int c = 10; +int fn() { c = 20; return 0; } + +int fn1() { + return fn(); +} diff --git a/test/old-elf/Hexagon/Inputs/got-plt-order.o b/test/old-elf/Hexagon/Inputs/got-plt-order.o Binary files differnew file mode 100644 index 000000000000..e97678b739bd --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/got-plt-order.o diff --git a/test/old-elf/Hexagon/Inputs/libMaxAlignment.a b/test/old-elf/Hexagon/Inputs/libMaxAlignment.a Binary files differnew file mode 100644 index 000000000000..cc5461a09ae4 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/libMaxAlignment.a diff --git a/test/old-elf/Hexagon/Inputs/sda-base.o b/test/old-elf/Hexagon/Inputs/sda-base.o Binary files differnew file mode 100644 index 000000000000..410a3d47d320 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/sda-base.o diff --git a/test/old-elf/Hexagon/Inputs/sdata1.c b/test/old-elf/Hexagon/Inputs/sdata1.c new file mode 100644 index 000000000000..77c2a54c36a1 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/sdata1.c @@ -0,0 +1,3 @@ +static int a = 0; + +int b = 10; diff --git a/test/old-elf/Hexagon/Inputs/sdata1.o b/test/old-elf/Hexagon/Inputs/sdata1.o Binary files differnew file mode 100644 index 000000000000..bf908fed27e9 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/sdata1.o diff --git a/test/old-elf/Hexagon/Inputs/sdata2.c b/test/old-elf/Hexagon/Inputs/sdata2.c new file mode 100644 index 000000000000..96b37271d773 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/sdata2.c @@ -0,0 +1,6 @@ +int sdata1 = 10; +int sdata2 = 20; +int sdata3 = 30; + +int sbss1 = 0; + diff --git a/test/old-elf/Hexagon/Inputs/sdata2.o b/test/old-elf/Hexagon/Inputs/sdata2.o Binary files differnew file mode 100644 index 000000000000..e4ec810866e5 --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/sdata2.o diff --git a/test/old-elf/Hexagon/Inputs/use-shared.hexagon b/test/old-elf/Hexagon/Inputs/use-shared.hexagon Binary files differnew file mode 100644 index 000000000000..9e5ffb42d36a --- /dev/null +++ b/test/old-elf/Hexagon/Inputs/use-shared.hexagon diff --git a/test/old-elf/Hexagon/dynlib-data.test b/test/old-elf/Hexagon/dynlib-data.test new file mode 100644 index 000000000000..2da312b54d43 --- /dev/null +++ b/test/old-elf/Hexagon/dynlib-data.test @@ -0,0 +1,9 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj-data.o \ +RUN: -o %t --noinhibit-exec -shared +RUN: llvm-objdump -s %t > %t1 +RUN: FileCheck -check-prefix=CHECKRELOCS %s < %t1 + +CHECKRELOCS: Contents of section .text: +CHECKRELOCS: 00f8 01c09da0 01d89da1 3c400000 18c4496a ........<@....Ij +CHECKRELOCS: 0108 ff7fff0f 00ff9897 00c08091 38c09d91 ............8... +CHECKRELOCS: 0118 1ec01e96 .... diff --git a/test/old-elf/Hexagon/dynlib-gotoff.test b/test/old-elf/Hexagon/dynlib-gotoff.test new file mode 100644 index 000000000000..f31d23bc5ebc --- /dev/null +++ b/test/old-elf/Hexagon/dynlib-gotoff.test @@ -0,0 +1,128 @@ +# This tests GOT's and PLT's for dynamic libraries for Hexagon +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \ +RUN: -o %t --output-filetype=yaml -shared --noinhibit-exec +RUN: FileCheck -check-prefix=CHECKGOTPLT %s < %t + + - name: .PLT0 +CHECKGOTPLT: type: stub +CHECKGOTPLT: content: [ 00, 40, 00, 00, 1C, C0, 49, 6A, 0E, 42, 9C, E2, +CHECKGOTPLT: 4F, 40, 9C, 91, 3C, C0, 9C, 91, 0E, 42, 0E, 8C, +CHECKGOTPLT: 00, C0, 9C, 52 ] +CHECKGOTPLT: alignment: 16 +CHECKGOTPLT: section-name: .plt +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X +CHECKGOTPLT: offset: 0 + target: __got0 +CHECKGOTPLT: - kind: R_HEX_6_PCREL_X +CHECKGOTPLT: offset: 4 + target: __got0 +CHECKGOTPLT: addend: 4 + - name: __plt_fn +CHECKGOTPLT: type: stub +CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91, +CHECKGOTPLT: 00, C0, 9C, 52 ] +CHECKGOTPLT: alignment: 16 +CHECKGOTPLT: section-name: .plt +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X +CHECKGOTPLT: offset: 0 + target: __got_fn +CHECKGOTPLT: - kind: R_HEX_6_PCREL_X +CHECKGOTPLT: offset: 4 + target: __got_fn +CHECKGOTPLT: addend: 4 + - name: __plt_fn1 +CHECKGOTPLT: type: stub +CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91, +CHECKGOTPLT: 00, C0, 9C, 52 ] +CHECKGOTPLT: alignment: 16 +CHECKGOTPLT: section-name: .plt +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X +CHECKGOTPLT: offset: 0 + target: __got_fn1 +CHECKGOTPLT: - kind: R_HEX_6_PCREL_X +CHECKGOTPLT: offset: 4 + target: __got_fn1 +CHECKGOTPLT: addend: 4 + - name: __plt_fn2 +CHECKGOTPLT: type: stub +CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91, +CHECKGOTPLT: 00, C0, 9C, 52 ] +CHECKGOTPLT: alignment: 16 +CHECKGOTPLT: section-name: .plt +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X +CHECKGOTPLT: offset: 0 + target: __got_fn2 +CHECKGOTPLT: - kind: R_HEX_6_PCREL_X +CHECKGOTPLT: offset: 4 + target: __got_fn2 +CHECKGOTPLT: addend: 4 + - name: __got0 +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, +CHECKGOTPLT: 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 8 +CHECKGOTPLT: section-name: .got.plt +CHECKGOTPLT: permissions: rw- + - name: __got_c +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 4 +CHECKGOTPLT: section-name: .got +CHECKGOTPLT: permissions: rw- +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_GLOB_DAT +CHECKGOTPLT: offset: 0 +CHECKGOTPLT: target: c + - name: __got_shankar +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 4 +CHECKGOTPLT: section-name: .got +CHECKGOTPLT: permissions: rw- +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_GLOB_DAT +CHECKGOTPLT: offset: 0 +CHECKGOTPLT: target: shankar + - name: __got_fn +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 4 +CHECKGOTPLT: section-name: .got.plt +CHECKGOTPLT: permissions: rw- +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_JMP_SLOT +CHECKGOTPLT: offset: 0 +CHECKGOTPLT: target: fn +CHECKGOTPLT: - kind: R_HEX_32 +CHECKGOTPLT: offset: 0 + target: .PLT0 + - name: __got_fn1 +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 4 +CHECKGOTPLT: section-name: .got.plt +CHECKGOTPLT: permissions: rw- +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_JMP_SLOT +CHECKGOTPLT: offset: 0 +CHECKGOTPLT: target: fn1 +CHECKGOTPLT: - kind: R_HEX_32 +CHECKGOTPLT: offset: 0 + target: .PLT0 + - name: __got_fn2 +CHECKGOTPLT: type: got +CHECKGOTPLT: content: [ 00, 00, 00, 00 ] +CHECKGOTPLT: alignment: 4 +CHECKGOTPLT: section-name: .got.plt +CHECKGOTPLT: permissions: rw- +CHECKGOTPLT: references: +CHECKGOTPLT: - kind: R_HEX_JMP_SLOT +CHECKGOTPLT: offset: 0 +CHECKGOTPLT: target: fn2 +CHECKGOTPLT: - kind: R_HEX_32 +CHECKGOTPLT: offset: 0 + target: .PLT0 diff --git a/test/old-elf/Hexagon/dynlib-hash.test b/test/old-elf/Hexagon/dynlib-hash.test new file mode 100644 index 000000000000..e26368120970 --- /dev/null +++ b/test/old-elf/Hexagon/dynlib-hash.test @@ -0,0 +1,9 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \ +RUN: -o %t --noinhibit-exec -shared +RUN: llvm-objdump -s %t > %t1 +RUN: FileCheck -check-prefix=CHECKHASH %s < %t1 + +CHECKHASH: Contents of section .hash: +CHECKHASH: 0094 03000000 07000000 06000000 01000000 +CHECKHASH: 00a4 04000000 00000000 00000000 00000000 +CHECKHASH: 00b4 00000000 03000000 02000000 05000000 diff --git a/test/old-elf/Hexagon/dynlib-rela.test b/test/old-elf/Hexagon/dynlib-rela.test new file mode 100644 index 000000000000..86e38ede6280 --- /dev/null +++ b/test/old-elf/Hexagon/dynlib-rela.test @@ -0,0 +1,9 @@ +# Tests that the relocation sections have the right alignment. +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon -shared -o %t1 +RUN: llvm-readobj -sections %t1 > %t2 +RUN: FileCheck -check-prefix=SECTIONS %s < %t2 + +SECTIONS: Section { +SECTIONS: Name: .rela.plt (23) +SECTIONS: AddressAlignment: 4 +SECTIONS: } diff --git a/test/old-elf/Hexagon/dynlib-syms.test b/test/old-elf/Hexagon/dynlib-syms.test new file mode 100644 index 000000000000..08f8930bb205 --- /dev/null +++ b/test/old-elf/Hexagon/dynlib-syms.test @@ -0,0 +1,7 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \ +RUN: -o %t --noinhibit-exec -shared +RUN: llvm-nm -n -M %t > %t1 +RUN: FileCheck -check-prefix=CHECKSYMS %s < %t1 + +CHECKSYMS: 0000025c A _DYNAMIC +CHECKSYMS: 00001008 A _GLOBAL_OFFSET_TABLE_ diff --git a/test/old-elf/Hexagon/dynlib.test b/test/old-elf/Hexagon/dynlib.test new file mode 100644 index 000000000000..9e591ed06075 --- /dev/null +++ b/test/old-elf/Hexagon/dynlib.test @@ -0,0 +1,36 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon -shared -o %t1 +RUN: llvm-readobj -dyn-symbols %t1 > %t2 +RUN: FileCheck -check-prefix=DYNSYMS %s < %t2 +RUN: llvm-readobj -program-headers %t1 | FileCheck %s + +DYNSYMS: DynamicSymbols [ +DYNSYMS: Symbol { +DYNSYMS: Name: fn2 +DYNSYMS-NEXT: Value: +DYNSYMS-NEXT: Size: +DYNSYMS-NEXT: Binding: Global +DYNSYMS-NEXT: Type: Function +DYNSYMS-NEXT: Other: +DYNSYMS-NEXT: Section: .text +DYNSYMS: } +DYNSYMS: Symbol { +DYNSYMS: Name: fn1 +DYNSYMS-NEXT: Value: +DYNSYMS-NEXT: Size: +DYNSYMS-NEXT: Binding: Global +DYNSYMS-NEXT: Type: Function +DYNSYMS-NEXT: Other: +DYNSYMS-NEXT: Section: .text +DYNSYMS: } +DYNSYMS: Symbol { +DYNSYMS: Name: fn3 +DYNSYMS-NEXT: Value: +DYNSYMS-NEXT: Size: +DYNSYMS-NEXT: Binding: Global +DYNSYMS-NEXT: Type: Function +DYNSYMS-NEXT: Other: +DYNSYMS-NEXT: Section: .text +DYNSYMS-NEXT: } +DYNSYMS-NEXT: ] + +CHECK-NOT: PT_PHDR diff --git a/test/old-elf/Hexagon/hexagon-got-plt-order.test b/test/old-elf/Hexagon/hexagon-got-plt-order.test new file mode 100644 index 000000000000..e2d37d1f6440 --- /dev/null +++ b/test/old-elf/Hexagon/hexagon-got-plt-order.test @@ -0,0 +1,5 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/got-plt-order.o -o %t -shared +RUN: llvm-objdump -section-headers %t | FileCheck %s + +CHECK: .got +CHECK-NEXT: .got.plt diff --git a/test/old-elf/Hexagon/hexagon-plt-setup.test b/test/old-elf/Hexagon/hexagon-plt-setup.test new file mode 100644 index 000000000000..51d8bd6a6b71 --- /dev/null +++ b/test/old-elf/Hexagon/hexagon-plt-setup.test @@ -0,0 +1,12 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon \ +RUN: --output-filetype=yaml --noinhibit-exec -o %t2 +RUN: FileCheck %s < %t2 + +CHECK: - name: fn3 +CHECK: references: +CHECK: - kind: R_HEX_B22_PCREL +CHECK: offset: 4 + target: +CHECK: - kind: R_HEX_B22_PCREL +CHECK: offset: 8 + target: diff --git a/test/old-elf/Hexagon/maxalignment.test b/test/old-elf/Hexagon/maxalignment.test new file mode 100644 index 000000000000..15a2bf3d80be --- /dev/null +++ b/test/old-elf/Hexagon/maxalignment.test @@ -0,0 +1,8 @@ +# This tests that we lld is able to get the contentType properly for archives +# when they intermittently get loaded at an address whose alignment is 2 + +RUN: lld -flavor old-gnu -target hexagon --whole-archive %p/Inputs/libMaxAlignment.a \ +RUN: --noinhibit-exec -static -o %t +RUN: llvm-nm %t | FileCheck %s + +CHECK: {{[0-9a-f]+}} D a diff --git a/test/old-elf/Hexagon/rela-order.test b/test/old-elf/Hexagon/rela-order.test new file mode 100644 index 000000000000..777b923fd737 --- /dev/null +++ b/test/old-elf/Hexagon/rela-order.test @@ -0,0 +1,9 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o -shared \ +RUN: --noinhibit-exec -o %t +RUN: llvm-objdump -section-headers %t | FileCheck %s + +CHECK: .dynsym +CHECK-NEXT: .dynstr +CHECK-NEXT: .rela.dyn +CHECK-NEXT: .rela.plt +CHECK-NEXT: .plt diff --git a/test/old-elf/Hexagon/sda-base.test b/test/old-elf/Hexagon/sda-base.test new file mode 100644 index 000000000000..cfcafbce8377 --- /dev/null +++ b/test/old-elf/Hexagon/sda-base.test @@ -0,0 +1,4 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/sda-base.o -o %t1 --noinhibit-exec +RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=sdabase + +sdabase: 00002000 A _SDA_BASE_ diff --git a/test/old-elf/Hexagon/zerofillquick-sdata.test b/test/old-elf/Hexagon/zerofillquick-sdata.test new file mode 100644 index 000000000000..1b932fe6e7b1 --- /dev/null +++ b/test/old-elf/Hexagon/zerofillquick-sdata.test @@ -0,0 +1,18 @@ +# This tests that a typeZeroFillFast atom is associated with a section that has +# the correct memory size. + +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/sdata1.o %p/Inputs/sdata2.o \ +RUN: -o %t --noinhibit-exec -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=CHECKSECTIONSANDSIZE %s + +CHECKSECTIONSANDSIZE: Section { +CHECKSECTIONSANDSIZE: Name: .sdata (13) +CHECKSECTIONSANDSIZE: Address: 0x1000 +CHECKSECTIONSANDSIZE: Offset: 0x1000 +CHECKSECTIONSANDSIZE: Size: 24 +CHECKSECTIONSANDSIZE: } +CHECKSECTIONSANDSIZE: Section { +CHECKSECTIONSANDSIZE: Name: .bss (20) +CHECKSECTIONSANDSIZE: Address: 0x1018 +CHECKSECTIONSANDSIZE: Offset: 0x1018 +CHECKSECTIONSANDSIZE: } diff --git a/test/old-elf/Inputs/abs-test.i386 b/test/old-elf/Inputs/abs-test.i386 Binary files differnew file mode 100644 index 000000000000..8556c24da551 --- /dev/null +++ b/test/old-elf/Inputs/abs-test.i386 diff --git a/test/old-elf/Inputs/allowduplicates.objtxt b/test/old-elf/Inputs/allowduplicates.objtxt new file mode 100644 index 000000000000..9b8ba8902aba --- /dev/null +++ b/test/old-elf/Inputs/allowduplicates.objtxt @@ -0,0 +1,12 @@ +defined-atoms: + - name: .text + alignment: 16 + section-choice: custom-required + section-name: .text + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, + 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text diff --git a/test/old-elf/Inputs/bar.o.x86-64 b/test/old-elf/Inputs/bar.o.x86-64 Binary files differnew file mode 100644 index 000000000000..467485f0bb96 --- /dev/null +++ b/test/old-elf/Inputs/bar.o.x86-64 diff --git a/test/old-elf/Inputs/branch-test.hexagon b/test/old-elf/Inputs/branch-test.hexagon Binary files differnew file mode 100644 index 000000000000..1ffb47228e32 --- /dev/null +++ b/test/old-elf/Inputs/branch-test.hexagon diff --git a/test/old-elf/Inputs/branch-test.ppc b/test/old-elf/Inputs/branch-test.ppc Binary files differnew file mode 100644 index 000000000000..4698941e7503 --- /dev/null +++ b/test/old-elf/Inputs/branch-test.ppc diff --git a/test/old-elf/Inputs/consecutive-weak-defs.o.yaml b/test/old-elf/Inputs/consecutive-weak-defs.o.yaml new file mode 100644 index 000000000000..cbd9c665b6d5 --- /dev/null +++ b/test/old-elf/Inputs/consecutive-weak-defs.o.yaml @@ -0,0 +1,65 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 554889E5E8000000005DC3554889E5B8640000005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000005 + Symbol: my_weak_func + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: my_func + Type: STT_FUNC + Section: .text + Size: 0x000000000000000B + Weak: + - Name: my_weak_func + Type: STT_FUNC + Section: .text + Value: 0x000000000000000B + Size: 0x000000000000000B + - Name: my_weak_func2 + Type: STT_FUNC + Section: .text + Value: 0x000000000000000B + Size: 0x000000000000000B + - Name: my_weak_func3 + Type: STT_FUNC + Section: .text + Value: 0x000000000000000B + Size: 0x000000000000000B +... diff --git a/test/old-elf/Inputs/constants-merge.x86-64 b/test/old-elf/Inputs/constants-merge.x86-64 Binary files differnew file mode 100644 index 000000000000..0087eb8f8cb5 --- /dev/null +++ b/test/old-elf/Inputs/constants-merge.x86-64 diff --git a/test/old-elf/Inputs/constdata.x86-64 b/test/old-elf/Inputs/constdata.x86-64 Binary files differnew file mode 100644 index 000000000000..d877a5535357 --- /dev/null +++ b/test/old-elf/Inputs/constdata.x86-64 diff --git a/test/old-elf/Inputs/foo.o.x86-64 b/test/old-elf/Inputs/foo.o.x86-64 Binary files differnew file mode 100644 index 000000000000..72a89eefa8ed --- /dev/null +++ b/test/old-elf/Inputs/foo.o.x86-64 diff --git a/test/old-elf/Inputs/globalconst.c b/test/old-elf/Inputs/globalconst.c new file mode 100644 index 000000000000..08395a88e7ca --- /dev/null +++ b/test/old-elf/Inputs/globalconst.c @@ -0,0 +1,2 @@ +/* compile the code with -fmerge-all-constants */ +const char mystr[] = "foobar"; diff --git a/test/old-elf/Inputs/globalconst.o.x86-64 b/test/old-elf/Inputs/globalconst.o.x86-64 Binary files differnew file mode 100644 index 000000000000..d8e266e76334 --- /dev/null +++ b/test/old-elf/Inputs/globalconst.o.x86-64 diff --git a/test/old-elf/Inputs/gotpcrel.S b/test/old-elf/Inputs/gotpcrel.S new file mode 100644 index 000000000000..300675f59612 --- /dev/null +++ b/test/old-elf/Inputs/gotpcrel.S @@ -0,0 +1,11 @@ + .text + .globl main + .align 16, 0x90 + .type main,@function +main: # @main + movq blah@GOTPCREL(%rip), %rax + movq main@GOTPCREL(%rip), %rax + ret + + .weak blah + .type blah,@function diff --git a/test/old-elf/Inputs/gotpcrel.x86-64 b/test/old-elf/Inputs/gotpcrel.x86-64 Binary files differnew file mode 100644 index 000000000000..f9c61d0edf15 --- /dev/null +++ b/test/old-elf/Inputs/gotpcrel.x86-64 diff --git a/test/old-elf/Inputs/group-cmd-search-1.ls b/test/old-elf/Inputs/group-cmd-search-1.ls new file mode 100644 index 000000000000..965369309a20 --- /dev/null +++ b/test/old-elf/Inputs/group-cmd-search-1.ls @@ -0,0 +1 @@ +GROUP ( shared.so-x86-64 ) diff --git a/test/old-elf/Inputs/group-cmd-search-2.ls b/test/old-elf/Inputs/group-cmd-search-2.ls new file mode 100644 index 000000000000..f1eee6a35efa --- /dev/null +++ b/test/old-elf/Inputs/group-cmd-search-2.ls @@ -0,0 +1 @@ +GROUP ( /shared.so-x86-64 ) diff --git a/test/old-elf/Inputs/group-cmd-search-3.ls b/test/old-elf/Inputs/group-cmd-search-3.ls new file mode 100644 index 000000000000..83ce0ca62fb1 --- /dev/null +++ b/test/old-elf/Inputs/group-cmd-search-3.ls @@ -0,0 +1 @@ +GROUP ( -l:shared.so-x86-64 -lfnarchive ) diff --git a/test/old-elf/Inputs/ifunc.S b/test/old-elf/Inputs/ifunc.S new file mode 100644 index 000000000000..0ac1f5a5b0bb --- /dev/null +++ b/test/old-elf/Inputs/ifunc.S @@ -0,0 +1,21 @@ + .text + .globl hey; + .type hey, @function; +hey: + .type hey, @gnu_indirect_function; + leaq __hey_1(%rip), %rax + ret + + .text + .type __hey_1, @function; + .globl __hey_1; +__hey_1: + movq $42, %rax + ret + + .text + .type plt, @function; + .globl plt; +plt: + call hey@PLT + ret diff --git a/test/old-elf/Inputs/ifunc.cpp b/test/old-elf/Inputs/ifunc.cpp new file mode 100644 index 000000000000..2e520277d36c --- /dev/null +++ b/test/old-elf/Inputs/ifunc.cpp @@ -0,0 +1,3 @@ +extern "C" int hey(); + +int main() { return hey(); } diff --git a/test/old-elf/Inputs/ifunc.cpp.x86-64 b/test/old-elf/Inputs/ifunc.cpp.x86-64 Binary files differnew file mode 100644 index 000000000000..20c812cabd2c --- /dev/null +++ b/test/old-elf/Inputs/ifunc.cpp.x86-64 diff --git a/test/old-elf/Inputs/ifunc.x86-64 b/test/old-elf/Inputs/ifunc.x86-64 Binary files differnew file mode 100644 index 000000000000..36c8e04ca837 --- /dev/null +++ b/test/old-elf/Inputs/ifunc.x86-64 diff --git a/test/old-elf/Inputs/libfnarchive.a b/test/old-elf/Inputs/libfnarchive.a Binary files differnew file mode 100644 index 000000000000..753acd6e2c65 --- /dev/null +++ b/test/old-elf/Inputs/libfnarchive.a diff --git a/test/old-elf/Inputs/libifunc.x86-64.so b/test/old-elf/Inputs/libifunc.x86-64.so Binary files differnew file mode 100644 index 000000000000..0f05b308ce78 --- /dev/null +++ b/test/old-elf/Inputs/libifunc.x86-64.so diff --git a/test/old-elf/Inputs/libundef.so b/test/old-elf/Inputs/libundef.so Binary files differnew file mode 100644 index 000000000000..41f2a668f360 --- /dev/null +++ b/test/old-elf/Inputs/libundef.so diff --git a/test/old-elf/Inputs/libweaksym.so b/test/old-elf/Inputs/libweaksym.so Binary files differnew file mode 100755 index 000000000000..7ff4ea56ae60 --- /dev/null +++ b/test/old-elf/Inputs/libweaksym.so diff --git a/test/old-elf/Inputs/main-with-global-def.o.yaml b/test/old-elf/Inputs/main-with-global-def.o.yaml new file mode 100644 index 000000000000..d3eeb8fe24b6 --- /dev/null +++ b/test/old-elf/Inputs/main-with-global-def.o.yaml @@ -0,0 +1,55 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 554889E5B8C80000005DC3554889E54883EC10C745FC00000000B000E8000000004883C4105DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x000000000000001D + Symbol: my_func + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x000000000000000B + Size: 0x000000000000001C + - Name: my_weak_func2 + Type: STT_FUNC + Section: .text + Size: 0x000000000000000B + - Name: my_func +... diff --git a/test/old-elf/Inputs/mainobj.x86_64 b/test/old-elf/Inputs/mainobj.x86_64 Binary files differnew file mode 100644 index 000000000000..d0f29418237d --- /dev/null +++ b/test/old-elf/Inputs/mainobj.x86_64 diff --git a/test/old-elf/Inputs/no-unique-section-names.x86-64 b/test/old-elf/Inputs/no-unique-section-names.x86-64 Binary files differnew file mode 100644 index 000000000000..fd92f5f0c6e7 --- /dev/null +++ b/test/old-elf/Inputs/no-unique-section-names.x86-64 diff --git a/test/old-elf/Inputs/object-test.elf-hexagon b/test/old-elf/Inputs/object-test.elf-hexagon Binary files differnew file mode 100644 index 000000000000..bfc85a7d0b76 --- /dev/null +++ b/test/old-elf/Inputs/object-test.elf-hexagon diff --git a/test/old-elf/Inputs/object-test.elf-i386 b/test/old-elf/Inputs/object-test.elf-i386 Binary files differnew file mode 100644 index 000000000000..872684c7fcc1 --- /dev/null +++ b/test/old-elf/Inputs/object-test.elf-i386 diff --git a/test/old-elf/Inputs/phdr.i386 b/test/old-elf/Inputs/phdr.i386 Binary files differnew file mode 100644 index 000000000000..7c83dd314891 --- /dev/null +++ b/test/old-elf/Inputs/phdr.i386 diff --git a/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon b/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon Binary files differnew file mode 100644 index 000000000000..03d028707129 --- /dev/null +++ b/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon diff --git a/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon b/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon Binary files differnew file mode 100644 index 000000000000..410a3d47d320 --- /dev/null +++ b/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon diff --git a/test/old-elf/Inputs/quickdata-test.elf-hexagon b/test/old-elf/Inputs/quickdata-test.elf-hexagon Binary files differnew file mode 100644 index 000000000000..c3ae53a6babe --- /dev/null +++ b/test/old-elf/Inputs/quickdata-test.elf-hexagon diff --git a/test/old-elf/Inputs/reloc-test.elf-i386 b/test/old-elf/Inputs/reloc-test.elf-i386 Binary files differnew file mode 100644 index 000000000000..1a5558131fff --- /dev/null +++ b/test/old-elf/Inputs/reloc-test.elf-i386 diff --git a/test/old-elf/Inputs/reloc-xb.x86 b/test/old-elf/Inputs/reloc-xb.x86 Binary files differnew file mode 100644 index 000000000000..4d9770aa2356 --- /dev/null +++ b/test/old-elf/Inputs/reloc-xb.x86 diff --git a/test/old-elf/Inputs/reloc-xt.x86 b/test/old-elf/Inputs/reloc-xt.x86 Binary files differnew file mode 100644 index 000000000000..dcdfbfb09f71 --- /dev/null +++ b/test/old-elf/Inputs/reloc-xt.x86 diff --git a/test/old-elf/Inputs/relocs-dynamic.x86-64 b/test/old-elf/Inputs/relocs-dynamic.x86-64 Binary files differnew file mode 100644 index 000000000000..0c44924d18e6 --- /dev/null +++ b/test/old-elf/Inputs/relocs-dynamic.x86-64 diff --git a/test/old-elf/Inputs/relocs.x86-64 b/test/old-elf/Inputs/relocs.x86-64 Binary files differnew file mode 100644 index 000000000000..112dfa733db9 --- /dev/null +++ b/test/old-elf/Inputs/relocs.x86-64 diff --git a/test/old-elf/Inputs/responsefile b/test/old-elf/Inputs/responsefile new file mode 100644 index 000000000000..2fe657a0e3b0 --- /dev/null +++ b/test/old-elf/Inputs/responsefile @@ -0,0 +1 @@ +--inresponsefile diff --git a/test/old-elf/Inputs/rodata-test.hexagon b/test/old-elf/Inputs/rodata-test.hexagon Binary files differnew file mode 100644 index 000000000000..f448748e2abe --- /dev/null +++ b/test/old-elf/Inputs/rodata-test.hexagon diff --git a/test/old-elf/Inputs/rodata-test.i386 b/test/old-elf/Inputs/rodata-test.i386 Binary files differnew file mode 100644 index 000000000000..09f71eb59969 --- /dev/null +++ b/test/old-elf/Inputs/rodata-test.i386 diff --git a/test/old-elf/Inputs/rodata.c b/test/old-elf/Inputs/rodata.c new file mode 100644 index 000000000000..b43c9c945898 --- /dev/null +++ b/test/old-elf/Inputs/rodata.c @@ -0,0 +1,4 @@ +const unsigned char *str = "llvm"; +int foo() { + return str[0]; +} diff --git a/test/old-elf/Inputs/rodata.o b/test/old-elf/Inputs/rodata.o Binary files differnew file mode 100644 index 000000000000..f13ddc9bba98 --- /dev/null +++ b/test/old-elf/Inputs/rodata.o diff --git a/test/old-elf/Inputs/section-test.i386 b/test/old-elf/Inputs/section-test.i386 Binary files differnew file mode 100644 index 000000000000..2b447a9f8f5b --- /dev/null +++ b/test/old-elf/Inputs/section-test.i386 diff --git a/test/old-elf/Inputs/shared.c b/test/old-elf/Inputs/shared.c new file mode 100644 index 000000000000..2be91c4b9e45 --- /dev/null +++ b/test/old-elf/Inputs/shared.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +extern int i; +int i = 42; + +// Undefined weak function in a dynamic library. +__attribute__((weak)) void weakfoo(); + +// Regular function in a dynamic library. +void foo() { + // Try to call weakfoo so that the reference to weekfoo will be included in + // the resulting .so file. + if (weakfoo) + weakfoo(); + puts("Fooo!!"); +} diff --git a/test/old-elf/Inputs/shared.so-x86-64 b/test/old-elf/Inputs/shared.so-x86-64 Binary files differnew file mode 100644 index 000000000000..0240f0e67431 --- /dev/null +++ b/test/old-elf/Inputs/shared.so-x86-64 diff --git a/test/old-elf/Inputs/shndx.o-x86_64 b/test/old-elf/Inputs/shndx.o-x86_64 Binary files differnew file mode 100644 index 000000000000..9e3e5d8526d7 --- /dev/null +++ b/test/old-elf/Inputs/shndx.o-x86_64 diff --git a/test/old-elf/Inputs/stripped-empty.x86_64 b/test/old-elf/Inputs/stripped-empty.x86_64 Binary files differnew file mode 100644 index 000000000000..7368ba280d79 --- /dev/null +++ b/test/old-elf/Inputs/stripped-empty.x86_64 diff --git a/test/old-elf/Inputs/target-test.hexagon b/test/old-elf/Inputs/target-test.hexagon Binary files differnew file mode 100644 index 000000000000..7da114561920 --- /dev/null +++ b/test/old-elf/Inputs/target-test.hexagon diff --git a/test/old-elf/Inputs/target-test.ppc b/test/old-elf/Inputs/target-test.ppc Binary files differnew file mode 100644 index 000000000000..001be338c20d --- /dev/null +++ b/test/old-elf/Inputs/target-test.ppc diff --git a/test/old-elf/Inputs/tls-tbss-size.yaml b/test/old-elf/Inputs/tls-tbss-size.yaml new file mode 100644 index 000000000000..0577dd157c6e --- /dev/null +++ b/test/old-elf/Inputs/tls-tbss-size.yaml @@ -0,0 +1,59 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Size: 16 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: t1.c + Type: STT_FILE + - Name: .tbss + Type: STT_TLS + Section: .tbss + Global: + - Name: t0 + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 + - Name: t1 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: t2 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000008 + Size: 0x0000000000000004 + - Name: t3 + Type: STT_TLS + Section: .tbss + Value: 0x000000000000000C + Size: 0x0000000000000004 +... diff --git a/test/old-elf/Inputs/tls.S b/test/old-elf/Inputs/tls.S new file mode 100644 index 000000000000..7d9eab647b53 --- /dev/null +++ b/test/old-elf/Inputs/tls.S @@ -0,0 +1,50 @@ + .text + .globl main + .align 16, 0x90 + .type main,@function +main: # @main + callq GOTTPOFF + addl %fs:tls1@TPOFF, %eax + addl %fs:tls0@TPOFF, %eax + addl %fs:tls2@TPOFF, %eax + ret + + .text + .globl GOTTPOFF + .type GOTTPOFF,@function +GOTTPOFF: + movq tls2@GOTTPOFF(%rip), %rax + movl %fs:0(%rax), %eax + ret + + .text + .globl TLSLD + .type TLSLD,@function +TLSLD: + leaq tls0@tlsld(%rip), %rdi + call __tls_get_addr@plt + leaq tls0@dtpoff(%rax), %rax + ret + + .type tls0,@object # @tls0 + .section .tbss,"awT",@nobits + .globl tls0 + .align 4 +tls0: + .long 0 # 0x0 + .size tls0, 4 + + .type tls1,@object # @tls1 + .globl tls1 + .align 4 +tls1: + .long 0 # 0x0 + .size tls1, 4 + + .type tls2,@object # @tls2 + .section .tdata,"awT",@progbits + .globl tls2 + .align 4 +tls2: + .long 1 # 0x1 + .size tls2, 4 diff --git a/test/old-elf/Inputs/tls.c b/test/old-elf/Inputs/tls.c new file mode 100644 index 000000000000..672350756562 --- /dev/null +++ b/test/old-elf/Inputs/tls.c @@ -0,0 +1,11 @@ +extern __thread int tls0; +extern __thread int tls1; +extern __thread int tls2; + +__thread int tls0 = 0; +__thread int tls1 = 0; +__thread int tls2 = 1; + +int main() { + return tls0 + tls1 + tls2; +} diff --git a/test/old-elf/Inputs/tls.x86-64 b/test/old-elf/Inputs/tls.x86-64 Binary files differnew file mode 100644 index 000000000000..b420ce89b19b --- /dev/null +++ b/test/old-elf/Inputs/tls.x86-64 diff --git a/test/old-elf/Inputs/tlsAddr.x86-64 b/test/old-elf/Inputs/tlsAddr.x86-64 Binary files differnew file mode 100644 index 000000000000..16cc9ab25abf --- /dev/null +++ b/test/old-elf/Inputs/tlsAddr.x86-64 diff --git a/test/old-elf/Inputs/tlsaddr.c b/test/old-elf/Inputs/tlsaddr.c new file mode 100644 index 000000000000..f62d57b3bfb4 --- /dev/null +++ b/test/old-elf/Inputs/tlsaddr.c @@ -0,0 +1,8 @@ +__thread int tls0 = 0; +__thread int tls1 = 0; +__thread int tls2 = 1; +__thread int tls3 = 2; + +int main() { + return tls0 + tls1 + tls2; +} diff --git a/test/old-elf/Inputs/undef-from-main-so.c b/test/old-elf/Inputs/undef-from-main-so.c new file mode 100644 index 000000000000..f1cb63db7ada --- /dev/null +++ b/test/old-elf/Inputs/undef-from-main-so.c @@ -0,0 +1 @@ +int x[2] = {1, 2}; diff --git a/test/old-elf/Inputs/undef-from-main.c b/test/old-elf/Inputs/undef-from-main.c new file mode 100644 index 000000000000..366d934dd84f --- /dev/null +++ b/test/old-elf/Inputs/undef-from-main.c @@ -0,0 +1,5 @@ +extern int x[2]; + +int main() { + x[0] = 2; +} diff --git a/test/old-elf/Inputs/undef-pc32.o b/test/old-elf/Inputs/undef-pc32.o Binary files differnew file mode 100644 index 000000000000..954916d59991 --- /dev/null +++ b/test/old-elf/Inputs/undef-pc32.o diff --git a/test/old-elf/Inputs/undef.o b/test/old-elf/Inputs/undef.o Binary files differnew file mode 100644 index 000000000000..3c9b60c6ca33 --- /dev/null +++ b/test/old-elf/Inputs/undef.o diff --git a/test/old-elf/Inputs/undef2-so.o.yaml b/test/old-elf/Inputs/undef2-so.o.yaml new file mode 100644 index 000000000000..f640cea39a5d --- /dev/null +++ b/test/old-elf/Inputs/undef2-so.o.yaml @@ -0,0 +1,49 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: 554889E5488B05000000008B005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000007 + Symbol: myexportedsymbol + Type: R_X86_64_GOTPCREL + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: func + Type: STT_FUNC + Section: .text + Size: 0x000000000000000F + - Name: _GLOBAL_OFFSET_TABLE_ + - Name: myexportedsymbol diff --git a/test/old-elf/Inputs/use-shared-32s.c b/test/old-elf/Inputs/use-shared-32s.c new file mode 100644 index 000000000000..63054cb036ea --- /dev/null +++ b/test/old-elf/Inputs/use-shared-32s.c @@ -0,0 +1,8 @@ +void foo(); + +void (*func)(); + +int main() { + func = foo; + func(); +} diff --git a/test/old-elf/Inputs/use-shared-32s.x86-64 b/test/old-elf/Inputs/use-shared-32s.x86-64 Binary files differnew file mode 100644 index 000000000000..7e223677b93f --- /dev/null +++ b/test/old-elf/Inputs/use-shared-32s.x86-64 diff --git a/test/old-elf/Inputs/use-shared.c b/test/old-elf/Inputs/use-shared.c new file mode 100644 index 000000000000..b370eaa4fac2 --- /dev/null +++ b/test/old-elf/Inputs/use-shared.c @@ -0,0 +1,7 @@ +extern int i; +void foo(); + +int main() { + foo(); + return i; +} diff --git a/test/old-elf/Inputs/use-shared.x86-64 b/test/old-elf/Inputs/use-shared.x86-64 Binary files differnew file mode 100644 index 000000000000..25e1eb87a2b4 --- /dev/null +++ b/test/old-elf/Inputs/use-shared.x86-64 diff --git a/test/old-elf/Inputs/weaksym.o b/test/old-elf/Inputs/weaksym.o Binary files differnew file mode 100644 index 000000000000..010ce704a313 --- /dev/null +++ b/test/old-elf/Inputs/weaksym.o diff --git a/test/old-elf/Inputs/writersyms.o b/test/old-elf/Inputs/writersyms.o Binary files differnew file mode 100644 index 000000000000..7cd472d99d77 --- /dev/null +++ b/test/old-elf/Inputs/writersyms.o diff --git a/test/old-elf/Inputs/x86-64-relocs.S b/test/old-elf/Inputs/x86-64-relocs.S new file mode 100644 index 000000000000..2547c0f19bb0 --- /dev/null +++ b/test/old-elf/Inputs/x86-64-relocs.S @@ -0,0 +1,12 @@ + .text + .globl main + .align 16, 0x90 + .type main,@function +main: # @main + call foo@PLT + ret + + .globl foo + .type foo,@function +foo: + ret diff --git a/test/old-elf/Mips/abi-flags-01.test b/test/old-elf/Mips/abi-flags-01.test new file mode 100644 index 000000000000..d2eb13f3186a --- /dev/null +++ b/test/old-elf/Mips/abi-flags-01.test @@ -0,0 +1,35 @@ +# Check rejecting .MIPS.abiflags section with a wrong version. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: {{.*}}abi-flags-01.test.tmp.o: .MIPS.abiflags section has unsupported version '1' + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + Version: 1 + ISA: MIPS32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/abi-flags-02.test b/test/old-elf/Mips/abi-flags-02.test new file mode 100644 index 000000000000..f3c1f29abc55 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-02.test @@ -0,0 +1,92 @@ +# Check generation of .MIPS.abiflags section under the following conditions: +# - There is the only input object file +# - The input file has valid .MIPS.abiflags section +# +# The .MIPS.abiflags section in the output file should have the same +# settings as the input section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -s -program-headers -mips-abi-flags %t.so | FileCheck %s + +# CHECK: Section { +# CHECK: Index: 1 +# CHECK-NEXT: Name: .MIPS.abiflags +# CHECK-NEXT: Type: SHT_MIPS_ABIFLAGS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Size: 24 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 8 +# CHECK-NEXT: EntrySize: 24 +# CHECK-NEXT: } + +# CHECK: ProgramHeaders [ +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS (0x70000003) +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 24 +# CHECK-NEXT: MemSize: 24 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 8 +# CHECK-NEXT: } + +# CHECK: MIPS ABI Flags { +# CHECK-NEXT: Version: 0 +# CHECK-NEXT: ISA: MIPS32r2 +# CHECK-NEXT: ISA Extension: None (0x0) +# CHECK-NEXT: ASEs [ (0x800) +# CHECK-NEXT: microMIPS (0x800) +# CHECK-NEXT: ] +# CHECK-NEXT: FP ABI: Hard float (32-bit CPU, Any FPU) (0x5) +# CHECK-NEXT: GPR size: 32 +# CHECK-NEXT: CPR1 size: 32 +# CHECK-NEXT: CPR2 size: 0 +# CHECK-NEXT: Flags 1 [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Flags 2: 0x0 +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/abi-flags-03.test b/test/old-elf/Mips/abi-flags-03.test new file mode 100644 index 000000000000..a28bb2826730 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-03.test @@ -0,0 +1,149 @@ +# Check generation of .MIPS.abiflags section under the following conditions: +# - There are multiple input object files +# - Every input file has valid .MIPS.abiflags section +# - All .MIPS.abiflags sections are compatible with each other +# +# The .MIPS.abiflags section in the output file should reproduce result +# of merging input object file sections. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o %t3.o +# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s + +# CHECK: MIPS ABI Flags { +# CHECK-NEXT: Version: 0 +# CHECK-NEXT: ISA: MIPS32r2 +# CHECK-NEXT: ISA Extension: None (0x0) +# CHECK-NEXT: ASEs [ (0x810) +# CHECK-NEXT: MDMX (0x10) +# CHECK-NEXT: microMIPS (0x800) +# CHECK-NEXT: ] +# CHECK-NEXT: FP ABI: Hard float (double precision) (0x1) +# CHECK-NEXT: GPR size: 32 +# CHECK-NEXT: CPR1 size: 64 +# CHECK-NEXT: CPR2 size: 0 +# CHECK-NEXT: Flags 1 [ (0x1) +# CHECK-NEXT: ODDSPREG +# CHECK-NEXT: ] +# CHECK-NEXT: Flags 2: 0x0 +# CHECK-NEXT: } + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + ISAExtension: EXT_NONE + ASEs: [ MDMX ] + FpABI: FP_DOUBLE + GPRSize: REG_32 + CPR1Size: REG_64 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ODDSPREG] + Flags2: 0x0 + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o3.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/abi-flags-04.test b/test/old-elf/Mips/abi-flags-04.test new file mode 100644 index 000000000000..6cde797dd3a0 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-04.test @@ -0,0 +1,125 @@ +# Check generation of .MIPS.abiflags section under the following conditions: +# - There are multiple input object files +# - Every input file has valid .MIPS.abiflags section +# - .MIPS.abiflags sections have different but compatible FP ABI +# +# The .MIPS.abiflags section in the output file should reproduce result +# of merging FP ABI flags. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-xx.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-double.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-64.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-64a.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1 %t-xx.o %t-double.o +# RUN: llvm-readobj -mips-abi-flags %t1 | FileCheck -check-prefix=XX-DOUBLE %s + +# XX-DOUBLE: FP ABI: Hard float (double precision) (0x1) +# XX-DOUBLE: GPR size: 32 +# XX-DOUBLE: CPR1 size: 32 +# XX-DOUBLE: Flags 1 [ (0x0) + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2 %t-xx.o %t-64.o +# RUN: llvm-readobj -mips-abi-flags %t2 | FileCheck -check-prefix=XX-64 %s + +# XX-64: FP ABI: Hard float (32-bit CPU, 64-bit FPU) (0x6) +# XX-64: GPR size: 32 +# XX-64: CPR1 size: 64 +# XX-64: Flags 1 [ (0x1) +# XX-64: ODDSPREG (0x1) + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3 %t-xx.o %t-64a.o +# RUN: llvm-readobj -mips-abi-flags %t3 | FileCheck -check-prefix=XX-64A %s + +# XX-64A: FP ABI: Hard float compat (32-bit CPU, 64-bit FPU) (0x7) +# XX-64A: GPR size: 32 +# XX-64A: CPR1 size: 64 +# XX-64A: Flags 1 [ (0x0) + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t4 %t-64.o %t-64a.o +# RUN: llvm-readobj -mips-abi-flags %t4 | FileCheck -check-prefix=64-64A %s + +# 64-64A: FP ABI: Hard float (32-bit CPU, 64-bit FPU) (0x6) +# 64-64A: GPR size: 32 +# 64-64A: CPR1 size: 64 +# 64-64A: Flags 1 [ (0x1) +# 64-64A: ODDSPREG (0x1) + +# xx.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + +# double.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_DOUBLE + GPRSize: REG_32 + CPR1Size: REG_32 + +# 64.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + FpABI: FP_64 + GPRSize: REG_32 + CPR1Size: REG_64 + Flags1: [ODDSPREG] + +# 64a.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + FpABI: FP_64A + GPRSize: REG_32 + CPR1Size: REG_64 + Flags1: [] +... diff --git a/test/old-elf/Mips/abi-flags-05.test b/test/old-elf/Mips/abi-flags-05.test new file mode 100644 index 000000000000..6a009db7344a --- /dev/null +++ b/test/old-elf/Mips/abi-flags-05.test @@ -0,0 +1,186 @@ +# Check generation of .MIPS.abiflags section under the following conditions: +# - There are multiple input object files +# - Every input file has valid .MIPS.abiflags section +# - .MIPS.abiflags sections have different and incompatible FP ABI +# +# The .MIPS.abiflags section in the output file should reproduce result +# of merging FP ABI flags but the linker must show a warning. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-xx.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-dbl.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-sgl.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-soft.o +# RUN: yaml2obj -format=elf -docnum 5 %s > %t-64.o +# RUN: yaml2obj -format=elf -docnum 6 %s > %t-64a.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1 %t-xx.o %t-sgl.o 2>&1 \ +# RUN: | FileCheck -check-prefix=XX-SINGLE-WARN %s + +# XX-SINGLE-WARN: FP ABI {{-mfpxx|-msingle-float}} is incompatible with {{-msingle-float|-mfpxx}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2 %t-xx.o %t-soft.o 2>&1 \ +# RUN: | FileCheck -check-prefix=XX-SOFT-WARN %s + +# XX-SOFT-WARN: FP ABI {{-mfpxx|-msoft-float}} is incompatible with {{-msoft-float|-mfpxx}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3 %t-dbl.o %t-sgl.o 2>&1 \ +# RUN: | FileCheck -check-prefix=DOUBLE-SINGLE-WARN %s + +# DOUBLE-SINGLE-WARN: FP ABI {{-mdouble-float|-msingle-float}} is incompatible with {{-msingle-float|-mdouble-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t4 %t-dbl.o %t-soft.o 2>&1 \ +# RUN: | FileCheck -check-prefix=DOUBLE-SOFT-WARN %s + +# DOUBLE-SOFT-WARN: FP ABI {{-mdouble-float|-msoft-float}} is incompatible with {{-msoft-float|-mdouble-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t5 %t-dbl.o %t-64.o 2>&1 \ +# RUN: | FileCheck -check-prefix=DOUBLE-64-WARN %s + +# DOUBLE-64-WARN: FP ABI {{-mdouble-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-mdouble-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t6 %t-dbl.o %t-64a.o 2>&1 \ +# RUN: | FileCheck -check-prefix=DOUBLE-64A-WARN %s + +# DOUBLE-64A-WARN: FP ABI {{-mdouble-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-mdouble-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t7 %t-sgl.o %t-soft.o 2>&1 \ +# RUN: | FileCheck -check-prefix=SINGLE-SOFT-WARN %s + +# SINGLE-SOFT-WARN: FP ABI {{-msingle-float|-msoft-float}} is incompatible with {{-msoft-float|-msingle-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t8 %t-sgl.o %t-64.o 2>&1 \ +# RUN: | FileCheck -check-prefix=SINGLE-64-WARN %s + +# SINGLE-64-WARN: FP ABI {{-msingle-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-msingle-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t9 %t-sgl.o %t-64a.o 2>&1 \ +# RUN: | FileCheck -check-prefix=SINGLE-64A-WARN %s + +# SINGLE-64A-WARN: FP ABI {{-msingle-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-msingle-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t10 %t-soft.o %t-64.o 2>&1 \ +# RUN: | FileCheck -check-prefix=SOFT-64-WARN %s + +# SOFT-64-WARN: FP ABI {{-msoft-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-msoft-float}} + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t11 %t-soft.o %t-64a.o 2>&1 \ +# RUN: | FileCheck -check-prefix=SOFT-64A-WARN %s + +# SOFT-64A-WARN: FP ABI {{-msoft-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-msoft-float}} + +# xx.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + +# double.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_DOUBLE + GPRSize: REG_32 + CPR1Size: REG_32 + +# single.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_SINGLE + GPRSize: REG_32 + CPR1Size: REG_32 + +# soft.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + FpABI: FP_SOFT + GPRSize: REG_32 + CPR1Size: REG_NONE + +# 64.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + FpABI: FP_64 + GPRSize: REG_32 + CPR1Size: REG_64 + Flags1: [ODDSPREG] + +# 64a.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + FpABI: FP_64A + GPRSize: REG_32 + CPR1Size: REG_64 + Flags1: [] +... diff --git a/test/old-elf/Mips/abi-flags-06.test b/test/old-elf/Mips/abi-flags-06.test new file mode 100644 index 000000000000..d7df379039bb --- /dev/null +++ b/test/old-elf/Mips/abi-flags-06.test @@ -0,0 +1,79 @@ +# Check generation of .MIPS.abiflags section under the following conditions: +# - There are multiple input object files +# - Not all input files have a .MIPS.abiflags section +# +# The .MIPS.abiflags section in the output file should reproduce result +# of merging input object file sections and data come from ELF header flags. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-abi.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-elf.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-abi.o %t-elf.o +# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s + +# CHECK: MIPS ABI Flags { +# CHECK-NEXT: Version: 0 +# CHECK-NEXT: ISA: MIPS32r2 +# CHECK-NEXT: ISA Extension: None (0x0) +# CHECK-NEXT: ASEs [ (0x810) +# CHECK-NEXT: MDMX (0x10) +# CHECK-NEXT: microMIPS (0x800) +# CHECK-NEXT: ] +# CHECK-NEXT: FP ABI: Hard float (double precision) (0x1) +# CHECK-NEXT: GPR size: 32 +# CHECK-NEXT: CPR1 size: 64 +# CHECK-NEXT: CPR2 size: 0 +# CHECK-NEXT: Flags 1 [ (0x0) +# CHECK-NEXT: ] +# CHECK-NEXT: Flags 2: 0x0 +# CHECK-NEXT: } + +# abi.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + ISAExtension: EXT_NONE + ASEs: [ MDMX ] + FpABI: FP_DOUBLE + GPRSize: REG_32 + CPR1Size: REG_64 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +# elf.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/abi-flags-07.test b/test/old-elf/Mips/abi-flags-07.test new file mode 100644 index 000000000000..6cae9b2feb4d --- /dev/null +++ b/test/old-elf/Mips/abi-flags-07.test @@ -0,0 +1,60 @@ +# Check that .MIPS.abiflags section is not written if no input object files +# contain that section. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o +# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s + +# CHECK: There is no .MIPS.abiflags section in the file. + +# abi.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# elf.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/abi-flags-08.test b/test/old-elf/Mips/abi-flags-08.test new file mode 100644 index 000000000000..c4b75bcf4516 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-08.test @@ -0,0 +1,71 @@ +# Check that the linker shows errors if ELF header flags +# and .MIPS.abiflags section are incompatible. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-isa.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-ext.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-ases.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-isa.o 2>&1 \ +# RUN: | FileCheck -check-prefix=ISA-ERR %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-ext.o 2>&1 \ +# RUN: | FileCheck -check-prefix=EXT-ERR %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3.so %t-ases.o 2>&1 \ +# RUN: | FileCheck -check-prefix=ASE-ERR %s +# RUN: llvm-readobj -mips-abi-flags %t1.so %t2.so %t3.so \ +# RUN: | FileCheck -check-prefix=SEC %s + +# ISA-ERR: inconsistent ISA between .MIPS.abiflags and ELF header e_flags field +# EXT-ERR: inconsistent ISA between .MIPS.abiflags and ELF header e_flags field +# ASE-ERR: inconsistent ASEs between .MIPS.abiflags and ELF header e_flags field + +# SEC: There is no .MIPS.abiflags section in the file. + +# isa.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + +# ext.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_3, EF_MIPS_MACH_4650] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS3 + ISAExtension: EXT_4120 + +# ases.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ASEs: [] + +... diff --git a/test/old-elf/Mips/abi-flags-09.test b/test/old-elf/Mips/abi-flags-09.test new file mode 100644 index 000000000000..1ab03abe3810 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-09.test @@ -0,0 +1,67 @@ +# Check position of PT_MIPS_ABIFLAGS segment. +# It should go right after the PT_INTERP segment. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s + +# CHECK: ProgramHeader { +# CHECK: Type: PT_INTERP +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 13 +# CHECK-NEXT: MemSize: 13 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 1 +# CHECK-NEXT: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 24 +# CHECK-NEXT: MemSize: 24 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 8 +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/abi-flags-10.test b/test/old-elf/Mips/abi-flags-10.test new file mode 100644 index 000000000000..50732d5c1151 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-10.test @@ -0,0 +1,60 @@ +# Check that SHT_MIPS_REGINFO section does not get a separate segment +# if there is a SHT_MIPS_ABIFLAGS section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s + +# CHECK: ProgramHeaders [ +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_PHDR +# CHECK: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_INTERP +# CHECK: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS +# CHECK: } +# CHECK-NOT: Type: PT_MIPS_REGINFO + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "F0000000E0000000D0000000C0000000B000000000100000" + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/abi-flags-11.test b/test/old-elf/Mips/abi-flags-11.test new file mode 100644 index 000000000000..e0e8547abbc7 --- /dev/null +++ b/test/old-elf/Mips/abi-flags-11.test @@ -0,0 +1,59 @@ +# Check position of PT_MIPS_REGINFO segment. +# It should go right after the PT_INTERP segment. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s + +# CHECK: ProgramHeader { +# CHECK: Type: PT_INTERP +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 13 +# CHECK-NEXT: MemSize: 13 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 1 +# CHECK-NEXT: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_REGINFO +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 24 +# CHECK-NEXT: MemSize: 24 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 4 +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "F0000000E0000000D0000000C0000000B000000000100000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/base-address-64.test b/test/old-elf/Mips/base-address-64.test new file mode 100644 index 000000000000..6b553d227820 --- /dev/null +++ b/test/old-elf/Mips/base-address-64.test @@ -0,0 +1,80 @@ +# Check executable base address configuration. Base address should be +# equal to 0x400000 and the MIPS_BASE_ADDRESS dynamic tag's value should +# be the same. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el --noinhibit-exec -o %t.exe %t.o +# RUN: llvm-readobj -dynamic-table -program-headers %t.exe | FileCheck %s + +# CHECK: DynamicSection [ (15 entries) +# CHECK: Tag Type Name/Value +# CHECK-NEXT: 0x0000000000000004 HASH 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x0000000000000005 STRTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x0000000000000006 SYMTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x000000000000000A STRSZ 1 (bytes) +# CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes) +# CHECK-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 1 +# CHECK-NEXT: 0x0000000070000016 MIPS_RLD_MAP 0x120002000 +# CHECK-NEXT: 0x0000000070000035 MIPS_RLD_MAP_REL 0x1DB8 +# CHECK-NEXT: 0x0000000070000005 MIPS_FLAGS NOTPOT +# CHECK-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x120000000 +# CHECK-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 2 +# CHECK-NEXT: 0x0000000070000011 MIPS_SYMTABNO 1 +# CHECK-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x1 +# CHECK-NEXT: 0x0000000000000003 PLTGOT 0x120001000 +# CHECK-NEXT: 0x0000000000000000 NULL 0x0 +# CHECK-NEXT: ] + +# CHECK: ProgramHeaders [ +# CHECK: ProgramHeader { +# CHECK: Type: PT_PHDR (0x6) +# CHECK: Offset: 0x40 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_INTERP (0x3) +# CHECK: Offset: 0x190 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_LOAD (0x1) +# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: VirtualAddress: 0x120000000 + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_64R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x10 + Size: 0x00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x10 + Size: 0x00 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/base-address.test b/test/old-elf/Mips/base-address.test new file mode 100644 index 000000000000..67c04326cc15 --- /dev/null +++ b/test/old-elf/Mips/base-address.test @@ -0,0 +1,95 @@ +# Check executable base address configuration. Base address should be +# equal to 0x400000 and the MIPS_BASE_ADDRESS dynamic tag's value should +# be the same. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -o %t.exe %t.o +# RUN: llvm-readobj -dynamic-table -program-headers %t.exe | FileCheck %s + +# CHECK: DynamicSection [ (15 entries) +# CHECK: Tag Type Name/Value +# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x0000000A STRSZ 1 (bytes) +# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) +# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 +# CHECK-NEXT: 0x70000016 MIPS_RLD_MAP 0x402000 +# CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x1E9C +# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT +# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000 +# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2 +# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 1 +# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x1 +# CHECK-NEXT: 0x00000003 PLTGOT 0x401000 +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +# CHECK: ProgramHeaders [ +# CHECK: ProgramHeader { +# CHECK: Type: PT_PHDR (0x6) +# CHECK: Offset: 0x34 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_INTERP (0x3) +# CHECK: Offset: 0xF4 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_LOAD (0x1) +# CHECK: Offset: 0x0 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_LOAD (0x1) +# CHECK: Offset: 0x1000 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_LOAD (0x1) +# CHECK: Offset: 0x2000 +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ProgramHeader { +# CHECK: Type: PT_DYNAMIC (0x2) +# CHECK: Offset: 0x12C +# CHECK: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK: } +# CHECK: ] + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/ctors-order.test b/test/old-elf/Mips/ctors-order.test new file mode 100644 index 000000000000..b33ed43292e7 --- /dev/null +++ b/test/old-elf/Mips/ctors-order.test @@ -0,0 +1,164 @@ +# Check ordering of .ctors.* sections. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-crtbeginS.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-crtendS.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-obj.o +# RUN: lld -flavor old-gnu -target mipsel -shared --output-filetype=yaml \ +# RUN: %t-crtbeginS.o %t-obj.o %t-crtendS.o | FileCheck %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-crtbeginS.o %t-obj.o %t-crtendS.o +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=RAW %s + +# CHECK: defined-atoms: +# CHECK-NEXT: - type: data +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors +# CHECK-NEXT: references: +# CHECK-NEXT: - kind: layout-after +# CHECK-NEXT: offset: 0 +# CHECK-NEXT: target: __CTOR_LIST__ +# CHECK-NEXT: - name: __CTOR_LIST__ +# CHECK-NEXT: type: data +# CHECK-NEXT: content: [ FF, FF, FF, FF ] +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors +# CHECK-NEXT: - type: data +# CHECK-NEXT: content: [ 11, 11, 11, 11 ] +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors.1 +# CHECK-NEXT: - type: data +# CHECK-NEXT: content: [ 22, 22, 22, 22 ] +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors.2 +# CHECK-NEXT: - ref-name: L004 +# CHECK-NEXT: type: data +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors +# CHECK-NEXT: references: +# CHECK-NEXT: - kind: layout-after +# CHECK-NEXT: offset: 0 +# CHECK-NEXT: target: __CTOR_END__ +# CHECK-NEXT: - name: __CTOR_END__ +# CHECK-NEXT: type: data +# CHECK-NEXT: content: [ 00, 00, 00, 00 ] +# CHECK-NEXT: alignment: 4 +# CHECK-NEXT: section-choice: custom-required +# CHECK-NEXT: section-name: .ctors + +# RAW: Contents of section .ctors: +# RAW-NEXT: 1000 ffffffff 11111111 22222222 00000000 + +# crtbeginS.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .ctors + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Content: 'FFFFFFFF' + +Symbols: + Local: + - Name: .ctors + Type: STT_SECTION + Section: .ctors + - Name: __CTOR_LIST__ + Type: STT_OBJECT + Section: .ctors + +# crtendS.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x0F + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: .ctors + Type: R_MIPS_GOT16 + - Offset: 0x04 + Symbol: .ctors + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: .ctors + Type: R_MIPS_GOT16 + - Offset: 0x0C + Symbol: .ctors + Type: R_MIPS_LO16 + - Name: .ctors + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .ctors + Type: STT_SECTION + Section: .ctors + - Name: __CTOR_END__ + Type: STT_OBJECT + Section: .ctors + - Name: __do_global_ctors_aux + Type: STT_FUNC + Section: .text + +# obj.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .ctors.2 + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Content: '22222222' + - Name: .ctors.1 + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Content: '11111111' + +Symbols: + Local: + - Name: .ctors.2 + Type: STT_SECTION + Section: .ctors.2 + - Name: .ctors.1 + Type: STT_SECTION + Section: .ctors.1 +... diff --git a/test/old-elf/Mips/driver-hash-style.test b/test/old-elf/Mips/driver-hash-style.test new file mode 100644 index 000000000000..0ab636c427c9 --- /dev/null +++ b/test/old-elf/Mips/driver-hash-style.test @@ -0,0 +1,15 @@ +# REQUIRES: mips + +# Check that the driver rejects all --hash-style arguments except 'sysv' +# because it is the only style supported by MIPS ABI. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o +# RUN: not lld -flavor old-gnu -target mips --hash-style=both %t.o -o %t.exe 2>&1 \ +# RUN: | FileCheck %s +# RUN: not lld -flavor old-gnu -target mips --hash-style=gnu %t.o -o %t.exe 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: error: .gnu.hash is incompatible with the MIPS ABI + + .globl __start; +__start: diff --git a/test/old-elf/Mips/dt-textrel-64.test b/test/old-elf/Mips/dt-textrel-64.test new file mode 100644 index 000000000000..152e82372799 --- /dev/null +++ b/test/old-elf/Mips/dt-textrel-64.test @@ -0,0 +1,74 @@ +# Check that if a dynamic relocation R_MIPS_64 modify a read-only section, +# .dynamic section contains the DT_TEXTREL tag. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s + +# CHECK: 0x{{[0-9A-F]+}} TEXTREL + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x08 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Size: 0x8 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_64 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x8 + - Name: T1 +... diff --git a/test/old-elf/Mips/dt-textrel.test b/test/old-elf/Mips/dt-textrel.test new file mode 100644 index 000000000000..af86f4926273 --- /dev/null +++ b/test/old-elf/Mips/dt-textrel.test @@ -0,0 +1,74 @@ +# Check that if a dynamic relocation modify a read-only section, +# .dynamic section contains the DT_TEXTREL tag. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s + +# CHECK: 0x{{[0-9A-F]+}} TEXTREL + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x04 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '00000000' + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x04 + - Name: T1 +... diff --git a/test/old-elf/Mips/dynamic-linking.test b/test/old-elf/Mips/dynamic-linking.test new file mode 100644 index 000000000000..aeab7645ed51 --- /dev/null +++ b/test/old-elf/Mips/dynamic-linking.test @@ -0,0 +1,22 @@ +# REQUIRES: mips + +# Check _DYNAMIC_LINKING symbol definition. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o +# RUN: lld -flavor old-gnu -target mips %t.o -o %t.exe +# RUN: llvm-nm %t.exe | FileCheck -check-prefix=EXE-DYN %s + +# EXE-DYN: 00000001 A _DYNAMIC_LINKING + +# RUN: lld -flavor old-gnu -target mips -static %t.o -o %t.exe +# RUN: llvm-nm -just-symbol-name %t.exe | FileCheck -check-prefix=EXE-STATIC %s + +# EXE-STATIC-NOT: _DYNAMIC_LINKING + +# RUN: lld -flavor old-gnu -target mips -shared %t.o -o %t.so +# RUN: llvm-nm -just-symbol-name %t.so | FileCheck -check-prefix=DYNLIB %s + +# DYNLIB-NOT: _DYNAMIC_LINKING + + .globl __start; +__start: diff --git a/test/old-elf/Mips/dynamic-sym.test b/test/old-elf/Mips/dynamic-sym.test new file mode 100644 index 000000000000..43a69d82c3a3 --- /dev/null +++ b/test/old-elf/Mips/dynamic-sym.test @@ -0,0 +1,41 @@ +# Check _DYNAMIC symbol's value +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -e T0 -o %t.so %t.o +# RUN: llvm-objdump -h -t %t.so | FileCheck -check-prefix=SHARED %s + +# SHARED: Sections: +# SHARED: Idx Name Size Address Type +# SHARED: 5 .dynamic 00000068 00000000[[ADDR:[0-9a-f]+]] + +# SHARED: SYMBOL TABLE: +# SHARED: [[ADDR]] g .dynamic 00000000 _DYNAMIC + +# RUN: lld -flavor old-gnu -target mipsel -e main -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -h -t %t.exe | FileCheck -check-prefix=EXE %s + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .dynamic 00000078 00000000[[ADDR:[0-9a-f]+]] + +# EXE: SYMBOL TABLE: +# EXE: [[ADDR]] g .dynamic 00000000 _DYNAMIC + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 0x10 + Size: 0x04 + +Symbols: + Global: + - Name: T0 + Section: .text diff --git a/test/old-elf/Mips/dynlib-dynamic.test b/test/old-elf/Mips/dynlib-dynamic.test new file mode 100644 index 000000000000..fca036a52624 --- /dev/null +++ b/test/old-elf/Mips/dynlib-dynamic.test @@ -0,0 +1,110 @@ +# Check MIPS specific tags in the dynamic table. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: DynamicSection [ (13 entries) +# CHECK: Tag Type Name/Value +# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x0000000A STRSZ 17 (bytes) +# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) +# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 +# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT +# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x0 +# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 4 +# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 4 +# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2 +# CHECK-NEXT: 0x00000003 PLTGOT 0x1000 +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x18 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: '$.str1' + Type: R_MIPS_GOT16 + - Offset: 0x04 + Symbol: '$.str1' + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: '$.str2' + Type: R_MIPS_GOT16 + - Offset: 0x0C + Symbol: '$.str2' + Type: R_MIPS_LO16 + - Offset: 0x10 + Symbol: glob2 + Type: R_MIPS_CALL16 + - Offset: 0x14 + Symbol: ext1 + Type: R_MIPS_CALL16 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .rodata.str1 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + - Name: .rodata.str2 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + +Symbols: + Local: + - Name: '$.str1' + Section: .rodata.str1 + - Name: '$.str2' + Section: .rodata.str2 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .rodata.str1 + Type: STT_SECTION + Section: .rodata.str1 + - Name: .rodata.str2 + Type: STT_SECTION + Section: .rodata.str2 + Global: + - Name: glob + Section: .text + - Name: ext1 + - Name: glob2 diff --git a/test/old-elf/Mips/dynlib-dynsym-micro.test b/test/old-elf/Mips/dynlib-dynsym-micro.test new file mode 100644 index 000000000000..6757847fac73 --- /dev/null +++ b/test/old-elf/Mips/dynlib-dynsym-micro.test @@ -0,0 +1,208 @@ +# 1. Check sorting of .dynsym content accordingly to .got section +# in case of using microMIPS relocations. +# 2. Check that microMIPS records in a dynamic symbol table have: +# - cleared the STO_MIPS_MICROMIPS flag +# - adjusted adress + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t-so %t.o +# RUN: llvm-readobj -dyn-symbols %t-so | FileCheck -check-prefix=CHECK-DYN %s + +# Build shared library (yaml format) +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \ +# RUN: --output-filetype=yaml -o %t-yaml %t.o +# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t-yaml + +# CHECK-DYN: Format: ELF32-mips +# CHECK-DYN: Arch: mipsel +# CHECK-DYN: AddressSize: 32bit +# CHECK-DYN: LoadName: +# CHECK-DYN: DynamicSymbols [ +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: @ (0) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Local (0x0) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: bar@ (5) +# CHECK-DYN: Value: 0x139 +# CHECK-DYN: Size: 4 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: Function (0x2) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: .text (0x4) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: foo@ (1) +# CHECK-DYN: Value: 0x121 +# CHECK-DYN: Size: 24 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: Function (0x2) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: .text (0x4) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: ext1@ (9) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: ext2@ (14) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: ] + +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 80 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - ref-name: L000 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16 +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: L007 +# CHECK-GOT: - ref-name: L002 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16 +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: L008 +# CHECK-GOT: - ref-name: L004 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: foo +# CHECK-GOT: - ref-name: L005 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: ext1 +# CHECK-GOT: - ref-name: L006 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: ext2 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x1C + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: .rodata.str1 + Type: R_MICROMIPS_GOT16 + - Offset: 0x04 + Symbol: .rodata.str1 + Type: R_MICROMIPS_LO16 + - Offset: 0x08 + Symbol: .rodata.str2 + Type: R_MICROMIPS_GOT16 + - Offset: 0x0C + Symbol: .rodata.str2 + Type: R_MICROMIPS_LO16 + - Offset: 0x10 + Symbol: foo + Type: R_MICROMIPS_CALL16 + - Offset: 0x14 + Symbol: ext1 + Type: R_MICROMIPS_CALL16 + - Offset: 0x18 + Symbol: ext2 + Type: R_MICROMIPS_CALL16 + - Name: .rodata.str1 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + - Name: .rodata.str2 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .rodata.str1 + Type: STT_SECTION + Section: .rodata.str1 + - Name: .rodata.str2 + Type: STT_SECTION + Section: .rodata.str2 + Global: + - Name: bar + Section: .text + Value: 0x18 + Other: [ STO_MIPS_MICROMIPS ] + - Name: foo + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + - Name: ext1 + - Name: ext2 +... diff --git a/test/old-elf/Mips/dynlib-dynsym.test b/test/old-elf/Mips/dynlib-dynsym.test new file mode 100644 index 000000000000..23b0cd6a90c2 --- /dev/null +++ b/test/old-elf/Mips/dynlib-dynsym.test @@ -0,0 +1,202 @@ +# Check sorting of .dynsym content accordingly to .got section. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t-so %t.o +# RUN: llvm-readobj -dyn-symbols %t-so | FileCheck -check-prefix=CHECK-DYN %s + +# Build shared library (yaml format) +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \ +# RUN: --output-filetype=yaml -o %t-yaml %t.o +# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t-yaml + +# CHECK-DYN: Format: ELF32-mips +# CHECK-DYN: Arch: mipsel +# CHECK-DYN: AddressSize: 32bit +# CHECK-DYN: LoadName: +# CHECK-DYN: DynamicSymbols [ +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: @ (0) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Local (0x0) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: bar@ (5) +# CHECK-DYN: Value: 0x138 +# CHECK-DYN: Size: 4 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: Function (0x2) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: .text (0x4) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: foo@ (1) +# CHECK-DYN: Value: 0x120 +# CHECK-DYN: Size: 24 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: Function (0x2) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: .text (0x4) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: ext1@ (9) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: ext2@ (14) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Global (0x1) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: ] + +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 80 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - ref-name: L000 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16 +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: L007 +# CHECK-GOT: - ref-name: L002 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16 +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: L008 +# CHECK-GOT: - ref-name: L004 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: foo +# CHECK-GOT: - ref-name: L005 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: ext1 +# CHECK-GOT: - ref-name: L006 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: ext2 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x1C + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: .rodata.str1 + Type: R_MIPS_GOT16 + - Offset: 0x04 + Symbol: .rodata.str1 + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: .rodata.str2 + Type: R_MIPS_GOT16 + - Offset: 0x0C + Symbol: .rodata.str2 + Type: R_MIPS_LO16 + - Offset: 0x10 + Symbol: foo + Type: R_MIPS_CALL16 + - Offset: 0x14 + Symbol: ext1 + Type: R_MIPS_CALL16 + - Offset: 0x18 + Symbol: ext2 + Type: R_MIPS_CALL16 + - Name: .rodata.str1 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + - Name: .rodata.str2 + Type: SHT_PROGBITS + AddressAlign: 0x01 + Size: 0x05 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .rodata.str1 + Type: STT_SECTION + Section: .rodata.str1 + - Name: .rodata.str2 + Type: STT_SECTION + Section: .rodata.str2 + Global: + - Name: bar + Section: .text + Value: 0x18 + - Name: foo + Section: .text + - Name: ext1 + - Name: ext2 +... diff --git a/test/old-elf/Mips/dynlib-fileheader-64.test b/test/old-elf/Mips/dynlib-fileheader-64.test new file mode 100644 index 000000000000..f3b45d4d738e --- /dev/null +++ b/test/old-elf/Mips/dynlib-fileheader-64.test @@ -0,0 +1,72 @@ +# Check ELF Header for 64-bit shared library. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Format: ELF64-mips +# CHECK: Arch: mips64el +# CHECK: AddressSize: 64bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 64-bit (0x2) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 0 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: SharedObject (0x3) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x80000006) +# CHECK: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_PIC (0x2) +# CHECK: ] +# CHECK: HeaderSize: 64 +# CHECK: ProgramHeaderEntrySize: 56 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 64 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + Global: + - Name: data + Type: STT_OBJECT + Section: .data + Size: 0x04 +... diff --git a/test/old-elf/Mips/dynlib-fileheader-micro-64.test b/test/old-elf/Mips/dynlib-fileheader-micro-64.test new file mode 100644 index 000000000000..531cee134caf --- /dev/null +++ b/test/old-elf/Mips/dynlib-fileheader-micro-64.test @@ -0,0 +1,75 @@ +# Check ELF Header for shared library in case of microMIPS symbols. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Format: ELF64-mips +# CHECK-NEXT: Arch: mips64el +# CHECK-NEXT: AddressSize: 64bit +# CHECK-NEXT: LoadName: +# CHECK-NEXT: ElfHeader { +# CHECK-NEXT: Ident { +# CHECK-NEXT: Magic: (7F 45 4C 46) +# CHECK-NEXT: Class: 64-bit (0x2) +# CHECK-NEXT: DataEncoding: LittleEndian (0x1) +# CHECK-NEXT: FileVersion: 1 +# CHECK-NEXT: OS/ABI: SystemV (0x0) +# CHECK-NEXT: ABIVersion: 0 +# CHECK-NEXT: Unused: (00 00 00 00 00 00 00) +# CHECK-NEXT: } +# CHECK-NEXT: Type: SharedObject (0x3) +# CHECK-NEXT: Machine: EM_MIPS (0x8) +# CHECK-NEXT: Version: 1 +# CHECK-NEXT: Entry: 0x{{[0-9A-F]+}} +# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Flags [ (0x82000007) +# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK-NEXT: EF_MIPS_CPIC (0x4) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: EF_MIPS_PIC (0x2) +# CHECK-NEXT: ] +# CHECK-NEXT: HeaderSize: 64 +# CHECK-NEXT: ProgramHeaderEntrySize: 56 +# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}} +# CHECK-NEXT: SectionHeaderEntrySize: 64 +# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}} +# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}} +# CHECK-NEXT:} + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_MICROMIPS, EF_MIPS_ARCH_64R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Size: 0x08 + Other: [ STO_MIPS_MICROMIPS ] diff --git a/test/old-elf/Mips/dynlib-fileheader-micro.test b/test/old-elf/Mips/dynlib-fileheader-micro.test new file mode 100644 index 000000000000..dcd38f1036d0 --- /dev/null +++ b/test/old-elf/Mips/dynlib-fileheader-micro.test @@ -0,0 +1,79 @@ +# Check ELF Header for shared library in case of microMIPS symbols. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK-NEXT: Arch: mipsel +# CHECK-NEXT: AddressSize: 32bit +# CHECK-NEXT: LoadName: +# CHECK-NEXT: ElfHeader { +# CHECK-NEXT: Ident { +# CHECK-NEXT: Magic: (7F 45 4C 46) +# CHECK-NEXT: Class: 32-bit (0x1) +# CHECK-NEXT: DataEncoding: LittleEndian (0x1) +# CHECK-NEXT: FileVersion: 1 +# CHECK-NEXT: OS/ABI: SystemV (0x0) +# CHECK-NEXT: ABIVersion: 0 +# CHECK-NEXT: Unused: (00 00 00 00 00 00 00) +# CHECK-NEXT: } +# CHECK-NEXT: Type: SharedObject (0x3) +# CHECK-NEXT: Machine: EM_MIPS (0x8) +# CHECK-NEXT: Version: 1 +# CHECK-NEXT: Entry: 0x{{[0-9A-F]+}} +# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Flags [ (0x72001007) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000) +# CHECK-NEXT: EF_MIPS_CPIC (0x4) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: EF_MIPS_PIC (0x2) +# CHECK-NEXT: ] +# CHECK-NEXT: HeaderSize: 52 +# CHECK-NEXT: ProgramHeaderEntrySize: 32 +# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}} +# CHECK-NEXT: SectionHeaderEntrySize: 40 +# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}} +# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}} +# CHECK-NEXT:} + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x08 + ISA: MIPS32 + ISARevision: 2 + ASEs: [ MICROMIPS ] + +Symbols: + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] diff --git a/test/old-elf/Mips/dynlib-fileheader.test b/test/old-elf/Mips/dynlib-fileheader.test new file mode 100644 index 000000000000..a3b4a19a90f1 --- /dev/null +++ b/test/old-elf/Mips/dynlib-fileheader.test @@ -0,0 +1,76 @@ +# Check ELF Header for shared library. + +# Build shared library +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 32-bit (0x1) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 0 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: SharedObject (0x3) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x70001007) +# CHECK: EF_MIPS_ABI_O32 (0x1000) +# CHECK: EF_MIPS_ARCH_32R2 (0x70000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: EF_MIPS_PIC (0x2) +# CHECK: ] +# CHECK: HeaderSize: 52 +# CHECK: ProgramHeaderEntrySize: 32 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 40 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK:} + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x00 + - Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x08 + ISA: MIPS32 + ISARevision: 2 + +Symbols: + Global: + - Name: glob + Section: .text diff --git a/test/old-elf/Mips/dynsym-table-1.test b/test/old-elf/Mips/dynsym-table-1.test new file mode 100644 index 000000000000..8821ae358254 --- /dev/null +++ b/test/old-elf/Mips/dynsym-table-1.test @@ -0,0 +1,127 @@ +# Check that LLD does not populate an executable file dynamic symbol table +# by unnecessary symbols. +# 1. bar.so defines T2 +# 2. foo.so defines T1 and references T2 +# 3. main.o reference T1 +# 4. a.out dynamic table should contain T1 entry only + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-bar.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-foo.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-bar.so %t-bar.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-foo.so %t-foo.o %t-bar.so +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe --as-needed \ +# RUN: %t-main.o %t-foo.so %t-bar.so +# RUN: llvm-readobj -dt -dynamic-table %t.exe | FileCheck %s + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ ({{.*}}) +# CHECK-NEXT: Value: {{.*}} +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 8 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: 0x00000003 PLTGOT 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (dynsym-table-1.test.tmp-foo.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 + +# bar.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 +Symbols: + Global: + - Name: T2 + Type: STT_FUNC + Section: .text + Size: 0x08 + +# foo.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x08 + Info: .text + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MIPS_CALL16 +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: T2 + +# main.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x08 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: T1 +... diff --git a/test/old-elf/Mips/dynsym-table-2.test b/test/old-elf/Mips/dynsym-table-2.test new file mode 100644 index 000000000000..ad85bfe84e43 --- /dev/null +++ b/test/old-elf/Mips/dynsym-table-2.test @@ -0,0 +1,105 @@ +# Check that LLD does not populate a shared library dynamic symbol table +# by unnecessary symbols. +# 1. bar.so defines T2 and T3 +# 2. foo.so defines T1 and references T2 +# 4. foo.so dynamic table should contain T1 and T2 entries only + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-bar.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-foo.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-bar.so %t-bar.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-foo.so %t-foo.o %t-bar.so +# RUN: llvm-readobj -dt -dynamic-table %t-foo.so | FileCheck %s + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ ({{.*}}) +# CHECK-NEXT: Value: {{.*}} +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x4) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ ({{.*}}) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: 0x00000003 PLTGOT 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (dynsym-table-2.test.tmp-bar.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 + +# bar.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 +Symbols: + Global: + - Name: T2 + Type: STT_FUNC + Section: .text + Size: 0x04 + - Name: T3 + Type: STT_FUNC + Section: .text + Value: 0x04 + Size: 0x04 + +# foo.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x08 + Info: .text + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MIPS_CALL16 +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: T2 +... diff --git a/test/old-elf/Mips/e-flags-merge-1-64.test b/test/old-elf/Mips/e-flags-merge-1-64.test new file mode 100644 index 000000000000..3e52afd223cd --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-1-64.test @@ -0,0 +1,30 @@ +# Check that the linker shows an error when object +# file has unsupported ASE flags. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-mips16.o +# RUN: not lld -flavor old-gnu -target mips64el -e T -o %t.exe %t-mips16.o 2>&1 | \ +# RUN: FileCheck -check-prefix=MIPS16 %s + +# MIPS16: Unsupported extension: MIPS16 + +# mips16.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_ARCH_ASE_M16] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-1.test b/test/old-elf/Mips/e-flags-merge-1.test new file mode 100644 index 000000000000..bc100534112d --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-1.test @@ -0,0 +1,56 @@ +# Check that the linker shows an error when object file has missed +# or unsupported ABI and ARCH flags or unsupported ASE flags. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-no-abi.o +# RUN: not lld -flavor old-gnu -target mipsel -e T -o %t.exe %t-no-abi.o 2>&1 | \ +# RUN: FileCheck -check-prefix=INVALID-ABI %s + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-mips16.o +# RUN: not lld -flavor old-gnu -target mipsel -e T -o %t.exe %t-mips16.o 2>&1 | \ +# RUN: FileCheck -check-prefix=MIPS16 %s + +# INVALID-ABI: Unsupported ABI +# MIPS16: Unsupported extension: MIPS16 + +# no-abi.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T + Section: .text + +# mips16.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_M16] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-10.test b/test/old-elf/Mips/e-flags-merge-10.test new file mode 100644 index 000000000000..5dacaa0e069d --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-10.test @@ -0,0 +1,43 @@ +# Check that LLD shows an error and does not link files with mips32r2 +# and mips32r6 instructions sets. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32r2.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-32r6.o + +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-32r2.o %t-32r6.o 2>&1 | FileCheck %s + +# CHECK: Linking modules with incompatible ISA + +# 32r2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 32r6.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-11.test b/test/old-elf/Mips/e-flags-merge-11.test new file mode 100644 index 000000000000..e61eb0d6d65a --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-11.test @@ -0,0 +1,43 @@ +# Check that LLD shows an error and does not link files with mips64r2 +# and mips64r6 instructions sets. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-64r2.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64r6.o + +# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \ +# RUN: %t-64r2.o %t-64r6.o 2>&1 | FileCheck %s + +# CHECK: Linking modules with incompatible ISA + +# 64r2.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64r6.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64R6] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-12.test b/test/old-elf/Mips/e-flags-merge-12.test new file mode 100644 index 000000000000..0a0c43fc996a --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-12.test @@ -0,0 +1,44 @@ +# Check that LLD shows an error and does not link files with O32 and N32 ABIs. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o32.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-n32.o + +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-o32.o %t-n32.o 2>&1 | FileCheck %s + +# CHECK: Linking modules with incompatible ABI + +# o32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_32BITMODE, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# n32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI2, + EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-2-64.test b/test/old-elf/Mips/e-flags-merge-2-64.test new file mode 100644 index 000000000000..4e024d2a465b --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-2-64.test @@ -0,0 +1,33 @@ +# Check that the linker copies ELF header flags from the single input object +# file to the generated executable + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -e T -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Flags [ (0x62000001) +# CHECK-NEXT: EF_MIPS_ARCH_64 (0x60000000) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: ] + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ARCH_64, EF_MIPS_NOREORDER, EF_MIPS_MICROMIPS ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-2.test b/test/old-elf/Mips/e-flags-merge-2.test new file mode 100644 index 000000000000..3ca531728728 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-2.test @@ -0,0 +1,35 @@ +# Check that the linker copies ELF header flags from the single input object +# file to the generated executable + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Flags [ (0x52001001) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: ] + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, + EF_MIPS_NOREORDER, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-3-64.test b/test/old-elf/Mips/e-flags-merge-3-64.test new file mode 100644 index 000000000000..45326813e12f --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-3-64.test @@ -0,0 +1,130 @@ +# Check PIC/CPIC flags merging in case of multiple input objects. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-cpic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-both.o + +# RUN: lld -flavor old-gnu -target mips64el -e T1 -o %t-abi1.exe \ +# RUN: %t-none.o %t-pic.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s +# RUN: llvm-readobj -file-headers %t-abi1.exe \ +# RUN: | FileCheck -check-prefix=ABI-CALLS1 %s + +# RUN: lld -flavor old-gnu -target mips64el -e T1 -o %t-abi2.exe \ +# RUN: %t-cpic.o %t-none.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s +# RUN: llvm-readobj -file-headers %t-abi2.exe \ +# RUN: | FileCheck -check-prefix=ABI-CALLS2 %s + +# RUN: lld -flavor old-gnu -target mips64el -e T2 -o %t-cpic.exe %t-cpic.o %t-pic.o +# RUN: llvm-readobj -file-headers %t-cpic.exe | FileCheck -check-prefix=CPIC %s + +# RUN: lld -flavor old-gnu -target mips64el -e T3 -o %t-both.exe %t-pic.o %t-both.o +# RUN: llvm-readobj -file-headers %t-both.exe | FileCheck -check-prefix=BOTH %s + +# ABI-CALLS-WARN: lld warning: linking abicalls and non-abicalls files + +# ABI-CALLS1: Flags [ (0x60000004) +# ABI-CALLS1-NEXT: EF_MIPS_ARCH_64 (0x60000000) +# ABI-CALLS1-NEXT: EF_MIPS_CPIC (0x4) +# ABI-CALLS1-NEXT: ] + +# ABI-CALLS2: Flags [ (0x60000004) +# ABI-CALLS2-NEXT: EF_MIPS_ARCH_64 (0x60000000) +# ABI-CALLS2-NEXT: EF_MIPS_CPIC (0x4) +# ABI-CALLS2-NEXT: ] + +# CPIC: Flags [ (0x60000004) +# CPIC-NEXT: EF_MIPS_ARCH_64 (0x60000000) +# CPIC-NEXT: EF_MIPS_CPIC (0x4) +# CPIC-NEXT: ] + +# BOTH: Flags [ (0x60000006) +# BOTH-NEXT: EF_MIPS_ARCH_64 (0x60000000) +# BOTH-NEXT: EF_MIPS_CPIC (0x4) +# BOTH-NEXT: EF_MIPS_PIC (0x2) +# BOTH-NEXT: ] + +# none.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T1 + Section: .text + +# cpic.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T2 + Section: .text + +# pic.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_PIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T3 + Section: .text + +# both.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_CPIC, EF_MIPS_PIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: T4 + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-3.test b/test/old-elf/Mips/e-flags-merge-3.test new file mode 100644 index 000000000000..612f0b458631 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-3.test @@ -0,0 +1,134 @@ +# Check PIC/CPIC flags merging in case of multiple input objects. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-cpic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-both.o + +# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t-abi1.exe \ +# RUN: %t-none.o %t-pic.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s +# RUN: llvm-readobj -file-headers %t-abi1.exe \ +# RUN: | FileCheck -check-prefix=ABI-CALLS1 %s + +# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t-abi2.exe \ +# RUN: %t-cpic.o %t-none.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s +# RUN: llvm-readobj -file-headers %t-abi2.exe \ +# RUN: | FileCheck -check-prefix=ABI-CALLS2 %s + +# RUN: lld -flavor old-gnu -target mipsel -e T2 -o %t-cpic.exe %t-cpic.o %t-pic.o +# RUN: llvm-readobj -file-headers %t-cpic.exe | FileCheck -check-prefix=CPIC %s + +# RUN: lld -flavor old-gnu -target mipsel -e T3 -o %t-both.exe %t-pic.o %t-both.o +# RUN: llvm-readobj -file-headers %t-both.exe | FileCheck -check-prefix=BOTH %s + +# ABI-CALLS-WARN: lld warning: linking abicalls and non-abicalls files + +# ABI-CALLS1: Flags [ (0x50001004) +# ABI-CALLS1-NEXT: EF_MIPS_ABI_O32 (0x1000) +# ABI-CALLS1-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# ABI-CALLS1-NEXT: EF_MIPS_CPIC (0x4) +# ABI-CALLS1-NEXT: ] + +# ABI-CALLS2: Flags [ (0x50001004) +# ABI-CALLS2-NEXT: EF_MIPS_ABI_O32 (0x1000) +# ABI-CALLS2-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# ABI-CALLS2-NEXT: EF_MIPS_CPIC (0x4) +# ABI-CALLS2-NEXT: ] + +# CPIC: Flags [ (0x50001004) +# CPIC-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CPIC-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# CPIC-NEXT: EF_MIPS_CPIC (0x4) +# CPIC-NEXT: ] + +# BOTH: Flags [ (0x50001006) +# BOTH-NEXT: EF_MIPS_ABI_O32 (0x1000) +# BOTH-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# BOTH-NEXT: EF_MIPS_CPIC (0x4) +# BOTH-NEXT: EF_MIPS_PIC (0x2) +# BOTH-NEXT: ] + +# none.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T1 + Section: .text + +# cpic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T2 + Section: .text + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_PIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T3 + Section: .text + +# both.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T4 + Section: .text +... diff --git a/test/old-elf/Mips/e-flags-merge-4-64.test b/test/old-elf/Mips/e-flags-merge-4-64.test new file mode 100644 index 000000000000..59a8bf131d95 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-4-64.test @@ -0,0 +1,64 @@ +# Check ELF flags merging. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-noreorder.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o + +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so \ +# RUN: %t-none.o %t-noreorder.o %t-micro.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Flags [ (0x82000001) +# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: ] + +# none.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_5] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# noreorder.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_NOREORDER] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# micro.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 +... diff --git a/test/old-elf/Mips/e-flags-merge-4.test b/test/old-elf/Mips/e-flags-merge-4.test new file mode 100644 index 000000000000..6a2de375e624 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-4.test @@ -0,0 +1,65 @@ +# Check ELF flags merging. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-noreorder.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-none.o %t-noreorder.o %t-micro.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Flags [ (0x52001001) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_32 (0x50000000) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: ] + +# none.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# noreorder.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_NOREORDER] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# micro.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-5-64.test b/test/old-elf/Mips/e-flags-merge-5-64.test new file mode 100644 index 000000000000..f1fdac2c8c05 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-5-64.test @@ -0,0 +1,42 @@ +# Check that LLD does not allow to mix 32 and 64-bit MIPS object files. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o + +# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \ +# RUN: %t-32.o %t-64.o 2>&1 | FileCheck %s + +# CHECK: ELF64 expected, but got ELF32 + +# 32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 +... diff --git a/test/old-elf/Mips/e-flags-merge-5.test b/test/old-elf/Mips/e-flags-merge-5.test new file mode 100644 index 000000000000..56edc4bfa10f --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-5.test @@ -0,0 +1,42 @@ +# Check that LLD does not allow to mix 32 and 64-bit MIPS object files. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o + +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-32.o %t-64.o 2>&1 | FileCheck %s + +# CHECK: ELF32 expected, but got ELF64 + +# 32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-6-64.test b/test/old-elf/Mips/e-flags-merge-6-64.test new file mode 100644 index 000000000000..9f83365441af --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-6-64.test @@ -0,0 +1,79 @@ +# Check selecting ELF header ARCH flag. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-m3.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-m5.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-m64.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-m64r2.o + +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so \ +# RUN: %t-m64.o %t-m5.o %t-m64r2.o %t-m3.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Flags [ (0x80000000) +# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK-NEXT: ] + +# m3.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_3] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# m5.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_5] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# m64.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# m64r2.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 +... diff --git a/test/old-elf/Mips/e-flags-merge-6.test b/test/old-elf/Mips/e-flags-merge-6.test new file mode 100644 index 000000000000..0d8bcee5ad64 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-6.test @@ -0,0 +1,80 @@ +# Check selecting ELF header ARCH flag. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-m1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-m2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-m32.o +# RUN: yaml2obj -format=elf -docnum 4 %s > %t-m32r2.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-m32.o %t-m2.o %t-m32r2.o %t-m1.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Flags [ (0x70001000) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000) +# CHECK-NEXT: ] + +# m1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_1] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# m2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# m32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# m32r2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-7-64.test b/test/old-elf/Mips/e-flags-merge-7-64.test new file mode 100644 index 000000000000..0e74ac53684a --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-7-64.test @@ -0,0 +1,42 @@ +# Check that LLD does not allow to mix nan2008 and legacy MIPS object files. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-2008.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-legacy.o + +# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \ +# RUN: %t-2008.o %t-legacy.o 2>&1 | FileCheck %s + +# CHECK: Linking -mnan=2008 and -mnan=legacy modules + +# 2008.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64, EF_MIPS_NAN2008] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +# legacy.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 +... diff --git a/test/old-elf/Mips/e-flags-merge-7.test b/test/old-elf/Mips/e-flags-merge-7.test new file mode 100644 index 000000000000..08051df506be --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-7.test @@ -0,0 +1,42 @@ +# Check that LLD does not allow to mix nan2008 and legacy MIPS object files. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-2008.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-legacy.o + +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-2008.o %t-legacy.o 2>&1 | FileCheck %s + +# CHECK: Linking -mnan=2008 and -mnan=legacy modules + +# 2008.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_NAN2008] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# legacy.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-8.test b/test/old-elf/Mips/e-flags-merge-8.test new file mode 100644 index 000000000000..2a2fdfee3c46 --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-8.test @@ -0,0 +1,65 @@ +# Check that LLD links files with mips32 and mips64 instructions +# if all these files satisfy O32 ABI. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-64r2.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-32.o %t-64.o %t-64r2.o +# RUN: llvm-readobj -file-headers %t.so | FileCheck %s + +# CHECK: Flags [ (0x80001100) +# CHECK-NEXT: EF_MIPS_32BITMODE (0x100) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK-NEXT: ] + + +# 32.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64, EF_MIPS_32BITMODE] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64r2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64R2, EF_MIPS_32BITMODE] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/e-flags-merge-9.test b/test/old-elf/Mips/e-flags-merge-9.test new file mode 100644 index 000000000000..ada24d788c9a --- /dev/null +++ b/test/old-elf/Mips/e-flags-merge-9.test @@ -0,0 +1,43 @@ +# Check that LLD shows an error and does not link files with mips32r2 +# and mips64 instructions sets. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32r2.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o + +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \ +# RUN: %t-32r2.o %t-64.o 2>&1 | FileCheck %s + +# CHECK: Linking modules with incompatible ISA + +# 32r2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +# 64.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64, EF_MIPS_32BITMODE] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 +... diff --git a/test/old-elf/Mips/entry-name.test b/test/old-elf/Mips/entry-name.test new file mode 100644 index 000000000000..f6ce0c4f223b --- /dev/null +++ b/test/old-elf/Mips/entry-name.test @@ -0,0 +1,26 @@ +# Check name of executable entry symbol. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -o %t.exe %t.o +# RUN: llvm-nm %t.exe | FileCheck %s + +# CHECK: U __start +# CHECK: {{[0-9A-F]+}} T main + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/exe-dynamic.test b/test/old-elf/Mips/exe-dynamic.test new file mode 100644 index 000000000000..93fdce9fdc7d --- /dev/null +++ b/test/old-elf/Mips/exe-dynamic.test @@ -0,0 +1,110 @@ +# Check MIPS specific tags in the dynamic table in case executable linking. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: DynamicSection [ (20 entries) +# CHECK: Tag Type Name/Value +# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x0000000A STRSZ 28 (bytes) +# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) +# CHECK-NEXT: 0x00000002 PLTRELSZ 8 (bytes) +# CHECK-NEXT: 0x70000032 MIPS_PLTGOT 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000014 PLTREL REL +# CHECK-NEXT: 0x00000017 JMPREL 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 +# CHECK-NEXT: 0x70000016 MIPS_RLD_MAP 0x40200C +# CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x1E0C +# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT +# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000 +# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2 +# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 2 +# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2 +# CHECK-NEXT: 0x00000003 PLTGOT 0x{{[0-9A-F]+}} +# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (exe-dynamic.test.tmp.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: 0000000C000000000000000C000000000000000C00000000 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_26 + Addend: 0 + - Offset: 0x08 + Symbol: .text + Type: R_MIPS_26 + Addend: 0 + - Offset: 0x10 + Symbol: glob + Type: R_MIPS_26 + Addend: 0 + +Symbols: + Local: + - Name: loc + Section: .text + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Value: 0x08 + - Name: T1 +... diff --git a/test/old-elf/Mips/exe-dynsym-micro.test b/test/old-elf/Mips/exe-dynsym-micro.test new file mode 100644 index 000000000000..477e174f3d6c --- /dev/null +++ b/test/old-elf/Mips/exe-dynsym-micro.test @@ -0,0 +1,94 @@ +# Check that symbol referenced by an entry in the global part of GOT +# has a corresponded entry in the .dynsym section. This test covers +# the case when the GOT entry created because of the R_MICROMIPS_GOT16 +# relocation. + +# Build executable +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t.o +# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK-DYN %s + +# Build executabl (yaml format)e +# RUN: lld -flavor old-gnu -target mipsel -e glob \ +# RUN: --output-filetype=yaml -o %t.yaml %t.o +# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t.yaml + +# CHECK-DYN: Format: ELF32-mips +# CHECK-DYN: Arch: mipsel +# CHECK-DYN: AddressSize: 32bit +# CHECK-DYN: LoadName: +# CHECK-DYN: DynamicSymbols [ +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: @ (0) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Local (0x0) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: weakf@ (1) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Weak (0x2) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: ] + +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 80 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - ref-name: L000 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: weakf + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: weakf + Type: R_MICROMIPS_GOT16 + +Symbols: + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + Weak: + - Name: weakf diff --git a/test/old-elf/Mips/exe-dynsym.test b/test/old-elf/Mips/exe-dynsym.test new file mode 100644 index 000000000000..c50ce67d5f57 --- /dev/null +++ b/test/old-elf/Mips/exe-dynsym.test @@ -0,0 +1,91 @@ +# Check that symbol referenced by an entry in the global part of GOT +# has a corresponded entry in the .dynsym section. + +# Build executable +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t.o +# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK-DYN %s + +# Build executabl (yaml format)e +# RUN: lld -flavor old-gnu -target mipsel -e glob \ +# RUN: --output-filetype=yaml -o %t.yaml %t.o +# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t.yaml + +# CHECK-DYN: Format: ELF32-mips +# CHECK-DYN: Arch: mipsel +# CHECK-DYN: AddressSize: 32bit +# CHECK-DYN: LoadName: +# CHECK-DYN: DynamicSymbols [ +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: @ (0) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Local (0x0) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: Symbol { +# CHECK-DYN: Name: weakf@ (1) +# CHECK-DYN: Value: 0x0 +# CHECK-DYN: Size: 0 +# CHECK-DYN: Binding: Weak (0x2) +# CHECK-DYN: Type: None (0x0) +# CHECK-DYN: Other: 0 +# CHECK-DYN: Section: Undefined (0x0) +# CHECK-DYN: } +# CHECK-DYN: ] + +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - type: got +# CHECK-GOT: content: [ 00, 00, 00, 80 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: - ref-name: L000 +# CHECK-GOT: type: got +# CHECK-GOT: content: [ 00, 00, 00, 00 ] +# CHECK-GOT: alignment: 4 +# CHECK-GOT: section-choice: custom-required +# CHECK-GOT: section-name: .got +# CHECK-GOT: permissions: rw- +# CHECK-GOT: references: +# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# CHECK-GOT: offset: 0 +# CHECK-GOT: target: weakf + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: weakf + Type: R_MIPS_GOT16 + +Symbols: + Global: + - Name: glob + Section: .text + Weak: + - Name: weakf diff --git a/test/old-elf/Mips/exe-fileheader-02.test b/test/old-elf/Mips/exe-fileheader-02.test new file mode 100644 index 000000000000..b3cd88c139b6 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-02.test @@ -0,0 +1,62 @@ +# Check that LLD set ABIVersion to '1' if it generates executable +# file without EF_MIPS_PIC in the ELF header. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 32-bit (0x1) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 1 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x50001005) +# CHECK: EF_MIPS_ABI_O32 (0x1000) +# CHECK: EF_MIPS_ARCH_32 (0x50000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: ] +# CHECK: HeaderSize: 52 +# CHECK: ProgramHeaderEntrySize: 32 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 40 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T0 + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader-03.test b/test/old-elf/Mips/exe-fileheader-03.test new file mode 100644 index 000000000000..dfe4fcc43e67 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-03.test @@ -0,0 +1,72 @@ +# Check that LLD set ABIVersion to '3' if it generates executable +# file with FP_64 / FP_64A floating point abi flags. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 32-bit (0x1) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 3 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x50001005) +# CHECK: EF_MIPS_ABI_O32 (0x1000) +# CHECK: EF_MIPS_ARCH_32 (0x50000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: ] +# CHECK: HeaderSize: 52 +# CHECK: ProgramHeaderEntrySize: 32 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 40 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + + - Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 1 + ISAExtension: EXT_NONE + FpABI: FP_64 + GPRSize: REG_32 + CPR1Size: REG_64 + +Symbols: + Global: + - Name: T0 + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader-64.test b/test/old-elf/Mips/exe-fileheader-64.test new file mode 100644 index 000000000000..20bb43a216d5 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-64.test @@ -0,0 +1,66 @@ +# Check ELF Header for 64-bit executable file. + +# Build executable +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e glob -o %t.exe %t-o.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF64-mips +# CHECK: Arch: mips64el +# CHECK: AddressSize: 64bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 64-bit (0x2) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 0 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x60000007) +# CHECK: EF_MIPS_ARCH_64 (0x60000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: EF_MIPS_PIC (0x2) +# CHECK: ] +# CHECK: HeaderSize: 64 +# CHECK: ProgramHeaderEntrySize: 56 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 64 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_64 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader-be-64.test b/test/old-elf/Mips/exe-fileheader-be-64.test new file mode 100644 index 000000000000..70457fe217c6 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-be-64.test @@ -0,0 +1,60 @@ +# Check ELF Header for non-pic big-endian 64-bit executable file. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64 -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF64-mips +# CHECK: Arch: mips64 +# CHECK: AddressSize: 64bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 64-bit (0x2) +# CHECK: DataEncoding: BigEndian (0x2) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 0 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x60000007) +# CHECK: EF_MIPS_ARCH_64 (0x60000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: EF_MIPS_PIC (0x2) +# CHECK: ] +# CHECK: HeaderSize: 64 +# CHECK: ProgramHeaderEntrySize: 56 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 64 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: __start + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader-be.test b/test/old-elf/Mips/exe-fileheader-be.test new file mode 100644 index 000000000000..292a92e59097 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-be.test @@ -0,0 +1,60 @@ +# Check ELF Header for non-pic big-endian 32-bit executable file. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mips +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 32-bit (0x1) +# CHECK: DataEncoding: BigEndian (0x2) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 1 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x50001005) +# CHECK: EF_MIPS_ABI_O32 (0x1000) +# CHECK: EF_MIPS_ARCH_32 (0x50000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: ] +# CHECK: HeaderSize: 52 +# CHECK: ProgramHeaderEntrySize: 32 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 40 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: __start + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader-micro-64.test b/test/old-elf/Mips/exe-fileheader-micro-64.test new file mode 100644 index 000000000000..a37d2d710637 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-micro-64.test @@ -0,0 +1,68 @@ +# Check ELF Header for 64-bit executable file in case of microMIPS entry symbol. + +# Build executable +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e glob -o %t.exe %t-o.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF64-mips +# CHECK: Arch: mips64el +# CHECK: AddressSize: 64bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 64-bit (0x2) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 0 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x82000007) +# CHECK: EF_MIPS_ARCH_64R2 (0x80000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_MICROMIPS (0x2000000) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: EF_MIPS_PIC (0x2) +# CHECK: ] +# CHECK: HeaderSize: 64 +# CHECK: ProgramHeaderEntrySize: 56 +# CHECK: ProgramHeaderCount: 6 +# CHECK: SectionHeaderEntrySize: 64 +# CHECK: SectionHeaderCount: 12 +# CHECK: StringTableSectionIndex: 9 +# CHECK: } + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_MICROMIPS, EF_MIPS_ARCH_64R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] +... diff --git a/test/old-elf/Mips/exe-fileheader-micro.test b/test/old-elf/Mips/exe-fileheader-micro.test new file mode 100644 index 000000000000..0adaf5b17373 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-micro.test @@ -0,0 +1,69 @@ +# Check ELF Header for non-pic executable file in case +# of microMIPS entry symbol. + +# Build executable +# RUN: yaml2obj -format=elf %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK-NEXT: Arch: mipsel +# CHECK-NEXT: AddressSize: 32bit +# CHECK-NEXT: LoadName: +# CHECK-NEXT: ElfHeader { +# CHECK-NEXT: Ident { +# CHECK-NEXT: Magic: (7F 45 4C 46) +# CHECK-NEXT: Class: 32-bit (0x1) +# CHECK-NEXT: DataEncoding: LittleEndian (0x1) +# CHECK-NEXT: FileVersion: 1 +# CHECK-NEXT: OS/ABI: SystemV (0x0) +# CHECK-NEXT: ABIVersion: 1 +# CHECK-NEXT: Unused: (00 00 00 00 00 00 00) +# CHECK-NEXT: } +# CHECK-NEXT: Type: Executable (0x2) +# CHECK-NEXT: Machine: EM_MIPS (0x8) +# CHECK-NEXT: Version: 1 +# CHECK-NEXT: Entry: 0x{{[0-9A-F]+[13579bdf]}} +# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Flags [ (0x72001005) +# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000) +# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000) +# CHECK-NEXT: EF_MIPS_CPIC (0x4) +# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000) +# CHECK-NEXT: EF_MIPS_NOREORDER (0x1) +# CHECK-NEXT: ] +# CHECK-NEXT: HeaderSize: 52 +# CHECK-NEXT: ProgramHeaderEntrySize: 32 +# CHECK-NEXT: ProgramHeaderCount: 6 +# CHECK-NEXT: SectionHeaderEntrySize: 40 +# CHECK-NEXT: SectionHeaderCount: 12 +# CHECK-NEXT: StringTableSectionIndex: 9 +# CHECK-NEXT: } + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] +... diff --git a/test/old-elf/Mips/exe-fileheader-n32.test b/test/old-elf/Mips/exe-fileheader-n32.test new file mode 100644 index 000000000000..f6a1725b4443 --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader-n32.test @@ -0,0 +1,65 @@ +# Check ELF Header for N32 ABI executable file. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK-NEXT: Arch: mipsel +# CHECK-NEXT: AddressSize: 32bit +# CHECK-NEXT: LoadName: +# CHECK-NEXT: ElfHeader { +# CHECK-NEXT: Ident { +# CHECK-NEXT: Magic: (7F 45 4C 46) +# CHECK-NEXT: Class: 32-bit +# CHECK-NEXT: DataEncoding: LittleEndian +# CHECK-NEXT: FileVersion: 1 +# CHECK-NEXT: OS/ABI: SystemV +# CHECK-NEXT: ABIVersion: 0 +# CHECK-NEXT: Unused: (00 00 00 00 00 00 00) +# CHECK-NEXT: } +# CHECK-NEXT: Type: Executable +# CHECK-NEXT: Machine: EM_MIPS +# CHECK-NEXT: Version: 1 +# CHECK-NEXT: Entry: 0x10000130 +# CHECK-NEXT: ProgramHeaderOffset: 0x34 +# CHECK-NEXT: SectionHeaderOffset: 0x22C0 +# CHECK-NEXT: Flags [ (0x60000027) +# CHECK-NEXT: EF_MIPS_ABI2 +# CHECK-NEXT: EF_MIPS_ARCH_64 +# CHECK-NEXT: EF_MIPS_CPIC +# CHECK-NEXT: EF_MIPS_NOREORDER +# CHECK-NEXT: EF_MIPS_PIC +# CHECK-NEXT: ] +# CHECK-NEXT: HeaderSize: 52 +# CHECK-NEXT: ProgramHeaderEntrySize: 32 +# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}} +# CHECK-NEXT: SectionHeaderEntrySize: 40 +# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}} +# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}} +# CHECK-NEXT: } + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI2, EF_MIPS_ARCH_64 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: __start + Section: .text +... diff --git a/test/old-elf/Mips/exe-fileheader.test b/test/old-elf/Mips/exe-fileheader.test new file mode 100644 index 000000000000..0188a682b3fb --- /dev/null +++ b/test/old-elf/Mips/exe-fileheader.test @@ -0,0 +1,105 @@ +# Check ELF Header for non-pic executable file. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: Format: ELF32-mips +# CHECK: Arch: mipsel +# CHECK: AddressSize: 32bit +# CHECK: LoadName: +# CHECK: ElfHeader { +# CHECK: Ident { +# CHECK: Magic: (7F 45 4C 46) +# CHECK: Class: 32-bit (0x1) +# CHECK: DataEncoding: LittleEndian (0x1) +# CHECK: FileVersion: 1 +# CHECK: OS/ABI: SystemV (0x0) +# CHECK: ABIVersion: 1 +# CHECK: Unused: (00 00 00 00 00 00 00) +# CHECK: } +# CHECK: Type: Executable (0x2) +# CHECK: Machine: EM_MIPS (0x8) +# CHECK: Version: 1 +# CHECK: Entry: 0x{{[0-9A-F]+}} +# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}} +# CHECK: Flags [ (0x50001005) +# CHECK: EF_MIPS_ABI_O32 (0x1000) +# CHECK: EF_MIPS_ARCH_32 (0x50000000) +# CHECK: EF_MIPS_CPIC (0x4) +# CHECK: EF_MIPS_NOREORDER (0x1) +# CHECK: ] +# CHECK: HeaderSize: 52 +# CHECK: ProgramHeaderEntrySize: 32 +# CHECK: ProgramHeaderCount: {{[0-9]+}} +# CHECK: SectionHeaderEntrySize: 40 +# CHECK: SectionHeaderCount: {{[0-9]+}} +# CHECK: StringTableSectionIndex: {{[0-9]+}} +# CHECK: } + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + - Name: T1 +... diff --git a/test/old-elf/Mips/exe-got-micro.test b/test/old-elf/Mips/exe-got-micro.test new file mode 100644 index 000000000000..7b3a919880de --- /dev/null +++ b/test/old-elf/Mips/exe-got-micro.test @@ -0,0 +1,115 @@ +# Check that external symbol defined in the executable file +# and referenced by R_MICROMIPS_CALL16 relocation has a corresponded +# entry in the local GOT section. +# +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob \ +# RUN: --output-filetype=yaml -o %t.exe %t-o.o %t.so +# RUN: FileCheck -check-prefix=GOT %s < %t.exe + +# GOT header +# GOT: - type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: - type: got +# GOT: content: [ 00, 00, 00, 80 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# Local GOT entry for 'glob' symbol +# GOT: - ref-name: L000 +# GOT: type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: references: +# GOT: - kind: R_MIPS_32 +# GOT: offset: 0 +# GOT: target: glob +# Global GOT entry for 'T1' symbol +# GOT: - ref-name: L001 +# GOT: type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: references: +# GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# GOT: offset: 0 +# GOT: target: T1 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: glob + Type: R_MICROMIPS_CALL16 + - Offset: 0x04 + Symbol: T1 + Type: R_MICROMIPS_CALL16 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 +... diff --git a/test/old-elf/Mips/exe-got.test b/test/old-elf/Mips/exe-got.test new file mode 100644 index 000000000000..636de16b4202 --- /dev/null +++ b/test/old-elf/Mips/exe-got.test @@ -0,0 +1,116 @@ +# Check that external symbol defined in the executable file +# and referenced by R_MIPS_CALL16 relocation has a corresponded +# entry in the local GOT section. +# +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob \ +# RUN: --output-filetype=yaml -o %t.exe %t-o.o %t.so +# RUN: FileCheck -check-prefix=GOT %s < %t.exe + +# GOT header +# GOT: - type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: - type: got +# GOT: content: [ 00, 00, 00, 80 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# Local GOT entry for 'glob' symbol +# GOT: - ref-name: L000 +# GOT: type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: references: +# GOT: - kind: R_MIPS_32 +# GOT: offset: 0 +# GOT: target: glob +# Global GOT entry for 'T1' symbol +# GOT: - ref-name: L001 +# GOT: type: got +# GOT: content: [ 00, 00, 00, 00 ] +# GOT: alignment: 4 +# GOT: section-choice: custom-required +# GOT: section-name: .got +# GOT: permissions: rw- +# GOT: references: +# GOT: - kind: LLD_R_MIPS_GLOBAL_GOT +# GOT: offset: 0 +# GOT: target: T1 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: glob + Type: R_MIPS_CALL16 + Addend: 0 + - Offset: 0x04 + Symbol: T1 + Type: R_MIPS_CALL16 + Addend: 0 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + - Name: T1 +... diff --git a/test/old-elf/Mips/got-page-32-micro.test b/test/old-elf/Mips/got-page-32-micro.test new file mode 100644 index 000000000000..5457ab9f1879 --- /dev/null +++ b/test/old-elf/Mips/got-page-32-micro.test @@ -0,0 +1,251 @@ +# Check handling of R_MICROMIPS_GOT_DISP / PAGE / OFST relocations +# in case of O32 ABI. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \ +# RUN: | FileCheck -check-prefix=GOT %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s + +# GOT: Symbol { +# GOT: Name: LT3 +# GOT-NEXT: Value: 0x[[LT3:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT4 +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T0 +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: LT1 +# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT2 +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T1@ +# GOT-NEXT: Value: 0x0 +# GOT: Symbol { +# GOT: Name: T2@ +# GOT-NEXT: Value: 0x0 + +# GOT: Primary GOT { +# GOT-NEXT: Canonical gp value: 0x408FF0 +# GOT-NEXT: Reserved entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401000 +# GOT-NEXT: Access: -32752 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Purpose: Lazy resolver +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401004 +# GOT-NEXT: Access: -32748 +# GOT-NEXT: Initial: 0x80000000 +# GOT-NEXT: Purpose: Module pointer (GNU extension) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x[[LT1]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x[[LT3]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40101C +# GOT-NEXT: Access: -32724 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 +# GOT-NEXT: } + +# RAW: Contents of section .text: +# RAW-NEXT: {{[0-9a-f]+}} 00002c80 00001880 00002c80 00003080 +# ^ = -32724 (T1) +# ^ = -32744 (LT1) +# ^ -32724 (T1) +# ^ -32720 (T2) +# RAW-NEXT: {{[0-9a-f]+}} 00001c80 00002080 00000000 00000000 +# ^ -32740 (PAGE) +# ^ -32736 (PAGE) +# ^ T1 OFST +# ^ T2 OFST +# RAW-NEXT: {{[0-9a-f]+}} 0000a501 0000a901 00002480 00002880 +# ^ LT1 OFST +# ^ LT2 OFST +# ^ = -32732 (LT3) +# ^ -32728 (PAGE) +# RAW-NEXT: {{[0-9a-f]+}} 0000b101 00000000 +# ^ LT4 OFST + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_32R2, EF_MIPS_ABI_O32, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 0x4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_32R2, EF_MIPS_ABI_O32, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Size: 0x38 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MICROMIPS_GOT_DISP + - Offset: 0x4 + Symbol: LT1 + Type: R_MICROMIPS_GOT_DISP + - Offset: 0x8 + Symbol: T1 + Type: R_MICROMIPS_GOT_PAGE + - Offset: 0xC + Symbol: T2 + Type: R_MICROMIPS_GOT_PAGE + - Offset: 0x10 + Symbol: LT1 + Type: R_MICROMIPS_GOT_PAGE + - Offset: 0x14 + Symbol: LT2 + Type: R_MICROMIPS_GOT_PAGE + - Offset: 0x18 + Symbol: T1 + Type: R_MICROMIPS_GOT_OFST + - Offset: 0x1C + Symbol: T2 + Type: R_MICROMIPS_GOT_OFST + - Offset: 0x20 + Symbol: LT1 + Type: R_MICROMIPS_GOT_OFST + - Offset: 0x24 + Symbol: LT2 + Type: R_MICROMIPS_GOT_OFST + - Offset: 0x28 + Symbol: LT3 + Type: R_MICROMIPS_GOT_DISP + - Offset: 0x2C + Symbol: LT4 + Type: R_MICROMIPS_GOT_PAGE + - Offset: 0x30 + Symbol: LT4 + Type: R_MICROMIPS_GOT_OFST + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: LT3 + Type: STT_FUNC + Section: .text + Value: 0x30 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: LT4 + Type: STT_FUNC + Section: .text + Value: 0x34 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x8 + Other: [STO_MIPS_MICROMIPS] + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x28 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: LT2 + Type: STT_FUNC + Section: .text + Value: 0x2c + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/got-page-32.test b/test/old-elf/Mips/got-page-32.test new file mode 100644 index 000000000000..44f45536d501 --- /dev/null +++ b/test/old-elf/Mips/got-page-32.test @@ -0,0 +1,244 @@ +# Check handling of R_MIPS_GOT_DISP / PAGE / OFST relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \ +# RUN: | FileCheck -check-prefix=GOT %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s + +# GOT: Symbol { +# GOT: Name: LT3 (12) +# GOT-NEXT: Value: 0x[[LT3:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT4 (16) +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T0 (1) +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: LT1 (4) +# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT2 (8) +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T1@ (1) +# GOT-NEXT: Value: 0x0 +# GOT: Symbol { +# GOT: Name: T2@ (4) +# GOT-NEXT: Value: 0x0 + +# GOT: Primary GOT { +# GOT-NEXT: Canonical gp value: 0x408FF0 +# GOT-NEXT: Reserved entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401000 +# GOT-NEXT: Access: -32752 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Purpose: Lazy resolver +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401004 +# GOT-NEXT: Access: -32748 +# GOT-NEXT: Initial: 0x80000000 +# GOT-NEXT: Purpose: Module pointer (GNU extension) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x[[LT1]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x[[LT3]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x400000 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40101C +# GOT-NEXT: Access: -32724 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 +# GOT-NEXT: } + +# RAW: Contents of section .text: +# RAW-NEXT: {{[0-9a-f]+}} 2c800000 18800000 2c800000 30800000 +# ^ = -32724 (T1) +# ^ = -32744 (LT1) +# ^ -32724 (T1) +# ^ -32720 (T2) +# RAW-NEXT: {{[0-9a-f]+}} 1c800000 20800000 00000000 00000000 +# ^ -32740 (PAGE) +# ^ -32736 (PAGE) +# ^ T1 OFST +# ^ T2 OFST +# RAW-NEXT: {{[0-9a-f]+}} 9c010000 a0010000 24800000 28800000 +# ^ LT1 OFST +# ^ LT2 OFST +# ^ = -32732 (LT3) +# ^ -32728 (PAGE) +# RAW-NEXT: {{[0-9a-f]+}} a8010000 00000000 +# ^ LT4 OFST + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_32, EF_MIPS_ABI_O32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 0x4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_32, EF_MIPS_ABI_O32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Size: 0x38 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_GOT_DISP + - Offset: 0x4 + Symbol: LT1 + Type: R_MIPS_GOT_DISP + - Offset: 0x8 + Symbol: T1 + Type: R_MIPS_GOT_PAGE + - Offset: 0xC + Symbol: T2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x10 + Symbol: LT1 + Type: R_MIPS_GOT_PAGE + - Offset: 0x14 + Symbol: LT2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_GOT_OFST + - Offset: 0x1C + Symbol: T2 + Type: R_MIPS_GOT_OFST + - Offset: 0x20 + Symbol: LT1 + Type: R_MIPS_GOT_OFST + - Offset: 0x24 + Symbol: LT2 + Type: R_MIPS_GOT_OFST + - Offset: 0x28 + Symbol: LT3 + Type: R_MIPS_GOT_DISP + - Offset: 0x2C + Symbol: LT4 + Type: R_MIPS_GOT_PAGE + - Offset: 0x30 + Symbol: LT4 + Type: R_MIPS_GOT_OFST + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: LT3 + Type: STT_FUNC + Section: .text + Value: 0x30 + Size: 0x4 + - Name: LT4 + Type: STT_FUNC + Section: .text + Value: 0x34 + Size: 0x4 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x8 + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x28 + Size: 0x4 + - Name: LT2 + Type: STT_FUNC + Section: .text + Value: 0x2c + Size: 0x4 + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/got-page-64-micro.test b/test/old-elf/Mips/got-page-64-micro.test new file mode 100644 index 000000000000..37bae77001e4 --- /dev/null +++ b/test/old-elf/Mips/got-page-64-micro.test @@ -0,0 +1,210 @@ +# Check handling of R_MICROMIPS_GOT_DISP / PAGE / OFST relocations +# in case of N64 ABI. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \ +# RUN: | FileCheck -check-prefix=GOT %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s + +# GOT: Symbol { +# GOT: Name: T0 +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: LT1 +# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT2 +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T1@ +# GOT-NEXT: Value: 0x0 +# GOT: Symbol { +# GOT: Name: T2@ +# GOT-NEXT: Value: 0x0 + +# GOT: Primary GOT { +# GOT-NEXT: Canonical gp value: 0x120008FF0 +# GOT-NEXT: Reserved entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001000 +# GOT-NEXT: Access: -32752 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Purpose: Lazy resolver +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x8000000000000000 +# GOT-NEXT: Purpose: Module pointer (GNU extension) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x[[LT1]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x120000000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x120000000 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001028 +# GOT-NEXT: Access: -32712 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001030 +# GOT-NEXT: Access: -32704 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 +# GOT-NEXT: } + +# RAW: Contents of section .text: +# RAW-NEXT: {{[0-9a-f]+}} 38800000 20800000 38800000 40800000 +# ^ = -32712 (T1) +# ^ = -32736 (LT1) +# ^ -32712 (T1) +# ^ -32704 (T2) +# RAW-NEXT: {{[0-9a-f]+}} 28800000 30800000 00000000 00000000 +# ^ -32728 (PAGE) +# ^ -32720 (PAGE) +# ^ T1 OFST +# ^ T2 OFST +# RAW-NEXT: {{[0-9a-f]+}} 59020000 5d020000 00000000 00000000 +# ^ LT1 OFST +# ^ LT2 OFST + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 0x4 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Size: 0x30 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_GOT_DISP + - Offset: 0x4 + Symbol: LT1 + Type: R_MIPS_GOT_DISP + - Offset: 0x8 + Symbol: T1 + Type: R_MIPS_GOT_PAGE + - Offset: 0xC + Symbol: T2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x10 + Symbol: LT1 + Type: R_MIPS_GOT_PAGE + - Offset: 0x14 + Symbol: LT2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_GOT_OFST + - Offset: 0x1C + Symbol: T2 + Type: R_MIPS_GOT_OFST + - Offset: 0x20 + Symbol: LT1 + Type: R_MIPS_GOT_OFST + - Offset: 0x24 + Symbol: LT2 + Type: R_MIPS_GOT_OFST + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x8 + Other: [STO_MIPS_MICROMIPS] + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x28 + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: LT2 + Type: STT_FUNC + Section: .text + Value: 0x2c + Size: 0x4 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/got-page-64.test b/test/old-elf/Mips/got-page-64.test new file mode 100644 index 000000000000..3c6ef57c78f5 --- /dev/null +++ b/test/old-elf/Mips/got-page-64.test @@ -0,0 +1,203 @@ +# Check handling of R_MIPS_GOT_DISP / PAGE / OFST relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \ +# RUN: | FileCheck -check-prefix=GOT %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s + +# GOT: Symbol { +# GOT: Name: T0 (1) +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: LT1 (4) +# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]] +# GOT: Symbol { +# GOT: Name: LT2 (8) +# GOT-NEXT: Value: 0x{{[0-9A-F]+}} +# GOT: Symbol { +# GOT: Name: T1@ (1) +# GOT-NEXT: Value: 0x0 +# GOT: Symbol { +# GOT: Name: T2@ (4) +# GOT-NEXT: Value: 0x0 + +# GOT: Primary GOT { +# GOT-NEXT: Canonical gp value: 0x120008FF0 +# GOT-NEXT: Reserved entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001000 +# GOT-NEXT: Access: -32752 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Purpose: Lazy resolver +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x8000000000000000 +# GOT-NEXT: Purpose: Module pointer (GNU extension) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x[[LT1]] +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x120000000 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x120000000 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001028 +# GOT-NEXT: Access: -32712 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001030 +# GOT-NEXT: Access: -32704 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 +# GOT-NEXT: } + +# RAW: Contents of section .text: +# RAW-NEXT: {{[0-9a-f]+}} 38800000 20800000 38800000 40800000 +# ^ = -32712 (T1) +# ^ = -32736 (LT1) +# ^ -32712 (T1) +# ^ -32704 (T2) +# RAW-NEXT: {{[0-9a-f]+}} 28800000 30800000 00000000 00000000 +# ^ -32728 (PAGE) +# ^ -32720 (PAGE) +# ^ T1 OFST +# ^ T2 OFST +# RAW-NEXT: {{[0-9a-f]+}} 50020000 54020000 00000000 00000000 +# ^ LT1 OFST +# ^ LT2 OFST + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 0x4 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x4 + Size: 0x30 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_GOT_DISP + - Offset: 0x4 + Symbol: LT1 + Type: R_MIPS_GOT_DISP + - Offset: 0x8 + Symbol: T1 + Type: R_MIPS_GOT_PAGE + - Offset: 0xC + Symbol: T2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x10 + Symbol: LT1 + Type: R_MIPS_GOT_PAGE + - Offset: 0x14 + Symbol: LT2 + Type: R_MIPS_GOT_PAGE + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_GOT_OFST + - Offset: 0x1C + Symbol: T2 + Type: R_MIPS_GOT_OFST + - Offset: 0x20 + Symbol: LT1 + Type: R_MIPS_GOT_OFST + - Offset: 0x24 + Symbol: LT2 + Type: R_MIPS_GOT_OFST + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x8 + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x28 + Size: 0x4 + - Name: LT2 + Type: STT_FUNC + Section: .text + Value: 0x2c + Size: 0x4 + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/got16-2.test b/test/old-elf/Mips/got16-2.test new file mode 100644 index 000000000000..01f11a5920cd --- /dev/null +++ b/test/old-elf/Mips/got16-2.test @@ -0,0 +1,73 @@ +# Check handling of R_MIPS_GOT16 relocation against local +# symbols when addresses of local data cross 64 KBytes border. + +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t-exe %t-obj +# RUN: llvm-objdump -s %t-exe | FileCheck %s + +# CHECK: Contents of section .got: +# CHECK-NEXT: 40a000 00000000 00000080 00004000 00004100 ..........@...A. +# lazy module 0x400000 0x410000 +# resolver pointer for L1 for L2 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '00000000000000000000000000000000' + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Address: 0x1000 + Relocations: + - Offset: 0 + Symbol: L1 + Type: R_MIPS_GOT16 + - Offset: 4 + Symbol: L1 + Type: R_MIPS_LO16 + - Offset: 8 + Symbol: L2 + Type: R_MIPS_GOT16 + - Offset: 12 + Symbol: L2 + Type: R_MIPS_LO16 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x9000 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: L1 + Type: STT_OBJECT + Section: .data + Value: 0x00 + Size: 0x8000 + - Name: L2 + Type: STT_OBJECT + Section: .data + Value: 0x8000 + Size: 0x04 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x04 diff --git a/test/old-elf/Mips/got16-micro.test b/test/old-elf/Mips/got16-micro.test new file mode 100644 index 000000000000..25de08e95c4e --- /dev/null +++ b/test/old-elf/Mips/got16-micro.test @@ -0,0 +1,165 @@ +# REQUIRES: mips + +# Check handling of global/local R_MICROMIPS_GOT16 relocations. +# RUN: llvm-mc -triple=mipsel -mattr=micromips -relocation-model=pic \ +# RUN: -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \ +# RUN: --output-filetype=yaml %t.o \ +# RUN: | FileCheck -check-prefix YAML %s +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t2 %t.o +# RUN: llvm-objdump -t -disassemble -mattr=micromips %t2 \ +# RUN: | FileCheck -check-prefix RAW %s + +# Function glob +# YAML: - name: main +# YAML: scope: global +# YAML: content: [ 5C, FC, 00, 00, 42, 30, 00, 00, 5C, FC, 00, 00, +# YAML: 42, 30, 00, 00, 5C, FC, 00, 00, 5C, FC, 00, 00, +# YAML: 5C, FC, 00, 00 ] +# YAML: alignment: 4 mod 16 +# YAML: code-model: mips-micro +# YAML: references: +# YAML-NEXT: - kind: R_MICROMIPS_GOT16 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: L000 +# YAML-NEXT: - kind: R_MICROMIPS_LO16 +# YAML-NEXT: offset: 4 +# YAML-NEXT: target: data_1 +# YAML-NEXT: - kind: R_MICROMIPS_GOT16 +# YAML-NEXT: offset: 8 +# YAML-NEXT: target: L001 +# YAML-NEXT: - kind: R_MICROMIPS_LO16 +# YAML-NEXT: offset: 12 +# YAML-NEXT: target: data_2 +# YAML-NEXT: - kind: R_MICROMIPS_GOT16 +# YAML-NEXT: offset: 16 +# YAML-NEXT: target: L002 +# YAML-NEXT: - kind: R_MICROMIPS_CALL16 +# YAML-NEXT: offset: 20 +# YAML-NEXT: target: L003 +# YAML-NEXT: - kind: R_MICROMIPS_CALL16 +# YAML-NEXT: offset: 24 +# YAML-NEXT: target: L004 + +# Local GOT entries: +# YAML: - ref-name: L000 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: data_1 +# YAML-NEXT: - ref-name: L001 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: data_2 +# YAML-NEXT: - ref-name: L002 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: R_MIPS_32 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: data_h + +# Global GOT entries: +# YAML-NEXT: - ref-name: L003 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: bar +# YAML-NEXT: - kind: R_MIPS_32 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: bar +# YAML-NEXT: - ref-name: L004 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: foo + +# RAW: Disassembly of section .text: +# RAW: main: +# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 18 80 lw $2, -32744($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 42 30 40 10 addiu $2, $2, 4160 +# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 1c 80 lw $2, -32740($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 42 30 60 20 addiu $2, $2, 8288 +# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 20 80 lw $2, -32736($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 24 80 lw $2, -32732($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 28 80 lw $2, -32728($gp) + +# RAW: SYMBOL TABLE: +# RAW: {{[0x0-9a-f]+}} *UND* 00000000 +# RAW: {{[0x0-9a-f]+}} l .data 00001020 data_1 +# RAW: {{[0x0-9a-f]+}} l .data 00000001 data_2 +# RAW: {{[0x0-9a-f]+}} g F .text 00000004 bar +# RAW: {{[0x0-9a-f]+}} g F .text 0000001c main +# RAW: {{[0x0-9a-f]+}} g .data 00000001 data_h + + .data + .type data_1, @object + .size data_1, 4128 +data_1: + .byte 1 + .space 4127 + .type data_2, @object + .size data_2, 1 +data_2: + .byte 2 + .hidden data_h + .globl data_h + .type data_h, @object + .size data_h, 1 +data_h: + .byte 3 + + .text + .globl bar + .set micromips + .ent bar + .type bar, @function +bar: + nop + .end bar + .size bar, .-bar + + .globl main + .set micromips + .ent main + .type main, @function +main: + lw $2,%got(data_1)($28) + addiu $2,$2,%lo(data_1) + lw $2,%got(data_2)($28) + addiu $2,$2,%lo(data_2) + lw $2,%got(data_h)($28) + lw $2,%call16(bar)($28) + lw $2,%call16(foo)($28) + + .end main + .size main, .-main diff --git a/test/old-elf/Mips/got16.test b/test/old-elf/Mips/got16.test new file mode 100644 index 000000000000..4dde15a11c26 --- /dev/null +++ b/test/old-elf/Mips/got16.test @@ -0,0 +1,196 @@ +# REQUIRES: mips + +# Check handling of global/local GOT16 relocations. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \ +# RUN: --output-filetype=yaml %t.o \ +# RUN: | FileCheck -check-prefix YAML %s +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t2 %t.o +# RUN: llvm-objdump -t -disassemble %t2 | FileCheck -check-prefix RAW %s + +# Function glob +# YAML: - name: glob +# YAML: scope: global +# YAML: content: [ 00, 00, 84, 8F, 00, 00, 84, 24, 01, 00, 84, 8F, +# YAML: 00, 02, 84, 24, 00, 00, 84, 8F, 00, 00, 84, 8F, +# YAML: 00, 00, 84, 8F ] +# YAML: alignment: 4 +# YAML: references: +# YAML: - kind: R_MIPS_GOT16 +# YAML: offset: 0 +# YAML: target: L000 +# YAML: - kind: R_MIPS_LO16 +# YAML: offset: 4 +# YAML: target: L009 +# YAML: - kind: R_MIPS_GOT16 +# YAML: offset: 8 +# YAML: target: L002 +# YAML: addend: 66048 +# YAML: - kind: R_MIPS_LO16 +# YAML: offset: 12 +# YAML: target: L009 +# YAML: addend: 512 +# YAML: - kind: R_MIPS_GOT16 +# YAML: offset: 16 +# YAML: target: L004 +# YAML: - kind: R_MIPS_CALL16 +# YAML: offset: 20 +# YAML: target: L005 +# YAML: - kind: R_MIPS_CALL16 +# YAML: offset: 24 +# YAML: target: L006 + +# Local GOT entries: +# YAML: - ref-name: L000 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: L009 +# YAML-NEXT: - ref-name: L002 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: L009 +# YAML-NEXT: addend: 66048 +# YAML-NEXT: - ref-name: L004 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: R_MIPS_32 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: hidden + +# Global GOT entries: +# YAML-NEXT: - ref-name: L005 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: glob +# YAML-NEXT: - kind: R_MIPS_32 +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: glob +# YAML-NEXT: - ref-name: L006 +# YAML-NEXT: type: got +# YAML-NEXT: content: [ 00, 00, 00, 00 ] +# YAML-NEXT: alignment: 4 +# YAML-NEXT: section-choice: custom-required +# YAML-NEXT: section-name: .got +# YAML-NEXT: permissions: rw- +# YAML-NEXT: references: +# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT +# YAML-NEXT: offset: 0 +# YAML-NEXT: target: extern + +# RAW: Disassembly of section .text: +# RAW: glob: +# RAW-NEXT: {{[0x0-9a-f]+}}: 18 80 84 8f lw $4, -32744($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 00 20 84 24 addiu $4, $4, 8192 +# RAW-NEXT: {{[0x0-9a-f]+}}: 1c 80 84 8f lw $4, -32740($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 00 22 84 24 addiu $4, $4, 8704 +# RAW-NEXT: {{[0x0-9a-f]+}}: 20 80 84 8f lw $4, -32736($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 24 80 84 8f lw $4, -32732($gp) +# RAW-NEXT: {{[0x0-9a-f]+}}: 28 80 84 8f lw $4, -32728($gp) + +# RAW: SYMBOL TABLE: +# RAW: {{[0x0-9a-f]+}} *UND* 00000000 +# RAW: {{[0x0-9a-f]+}} l .data 00000000 str1 +# RAW: {{[0x0-9a-f]+}} l .data 00000005 str2 +# RAW: {{[0x0-9a-f]+}} g F .text 0000001c glob +# RAW: {{[0x0-9a-f]+}} g .data 00000004 hidden + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '0000848F000084240100848F000284240000848F0000848F0000848F' + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: .data + Type: R_MIPS_GOT16 + - Offset: 0x04 + Symbol: .data + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: .data + Type: R_MIPS_GOT16 + - Offset: 0x0C + Symbol: .data + Type: R_MIPS_LO16 + - Offset: 0x10 + Symbol: hidden + Type: R_MIPS_GOT16 + - Offset: 0x14 + Symbol: glob + Type: R_MIPS_CALL16 + - Offset: 0x18 + Symbol: extern + Type: R_MIPS_CALL16 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x10209 + +Symbols: + Local: + - Name: str1 + Type: STT_OBJECT + Section: .data + Size: 0x10200 + - Name: str2 + Type: STT_OBJECT + Section: .data + Value: 0x10200 + Size: 0x05 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + Global: + - Name: glob + Section: .text + - Name: hidden + Type: STT_OBJECT + Section: .data + Value: 0x10205 + Size: 0x04 + Visibility: STV_HIDDEN + - Name: extern diff --git a/test/old-elf/Mips/gotsym.test b/test/old-elf/Mips/gotsym.test new file mode 100644 index 000000000000..bc89ba5d3768 --- /dev/null +++ b/test/old-elf/Mips/gotsym.test @@ -0,0 +1,43 @@ +# Check _gp_disp and GOT_OFFSET_TABLE value +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o +# RUN: llvm-objdump -h -t %t.so | FileCheck -check-prefix=SHARED %s + +# SHARED: Sections: +# SHARED: Idx Name Size Address Type +# SHARED: 6 .got 00000008 0000000000001000 DATA +# SHARED: SYMBOL TABLE: +# SHARED: 00001000 .got 00000000 _GLOBAL_OFFSET_TABLE_ +# SHARED: 00008ff0 g *ABS* 00000000 _gp +# SHARED: 00008ff0 g *ABS* 00000000 _gp_disp + +# RUN: lld -flavor old-gnu -target mipsel -e main --noinhibit-exec -o %t.exe %t.o +# RUN: llvm-objdump -h -t %t.exe | FileCheck -check-prefix=EXE %s + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 7 .got 00000008 0000000000401000 DATA +# EXE: SYMBOL TABLE: +# EXE: 00401000 .got 00000000 _GLOBAL_OFFSET_TABLE_ +# EXE: 00408ff0 g *ABS* 00000000 _gp +# EXE: 00408ff0 g *ABS* 00000000 _gp_disp + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + +Symbols: + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/gp-sym-1-micro.test b/test/old-elf/Mips/gp-sym-1-micro.test new file mode 100644 index 000000000000..0e1bea9c38da --- /dev/null +++ b/test/old-elf/Mips/gp-sym-1-micro.test @@ -0,0 +1,88 @@ +# Check that microMIPS relocations against __gnu_local_gp +# use "gp" value as target. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=SEC %s + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x408FF0 + +# SEC: Contents of section .text: +# SEC-NEXT: 400184 00004100 0000f08f 2000bc00 ..A..... ... +# SEC: Contents of section .got: +# SEC-NEXT: 401000 00000000 00000080 ........ + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 12 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: __gnu_local_gp + Type: R_MICROMIPS_HI16 + - Offset: 0x04 + Symbol: __gnu_local_gp + Type: R_MICROMIPS_LO16 + - Offset: 0x08 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x08 + Other: [ STO_MIPS_MICROMIPS ] + - Name: __gnu_local_gp + - Name: T1 +... diff --git a/test/old-elf/Mips/gp-sym-1.test b/test/old-elf/Mips/gp-sym-1.test new file mode 100644 index 000000000000..ebb73c3afd60 --- /dev/null +++ b/test/old-elf/Mips/gp-sym-1.test @@ -0,0 +1,86 @@ +# Check that relocations against __gnu_local_gp use "gp" value as target. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=SEC %s + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x408FF0 + +# SEC: Contents of section .text: +# SEC-NEXT: 400190 41000000 f08f0000 60001000 +# SEC: Contents of section .got: +# SEC-NEXT: 401000 00000000 00000080 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 12 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: __gnu_local_gp + Type: R_MIPS_HI16 + - Offset: 0x04 + Symbol: __gnu_local_gp + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: __gnu_local_gp + - Name: T1 +... diff --git a/test/old-elf/Mips/gp-sym-2.test b/test/old-elf/Mips/gp-sym-2.test new file mode 100644 index 000000000000..b6d95f350af3 --- /dev/null +++ b/test/old-elf/Mips/gp-sym-2.test @@ -0,0 +1,103 @@ +# Check that R_MIPS32 relocation against __gnu_local_gp causes emitting +# of R_MIPS_REL32 relocation in case of shared library file linking +# and does not produce any dynamic relocation in case of linking a non-shared +# executable file. + +# Now the test failed because the __gnu_local_gp symbol becomes defined +# absolute symbol and we do not generate R_MIPS_REL32 in case of shared +# library linking. +# XFAIL: * + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-1.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t-1.so +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=EXE %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-2.so %t-o.o %t-1.so +# RUN: llvm-readobj -r %t-2.so | FileCheck -check-prefix=SO %s + +# EXE: Relocations [ +# EXE-NEXT: ] + +# SO: Relocations [ +# SO-NEXT: Section (5) .rel.dyn { +# SO-NEXT: 0x0 R_MIPS_NONE - 0x0 +# SO-NEXT: 0x2EC R_MIPS_REL32 __gnu_local_gp 0x0 +# SO-NEXT: } +# SO-NEXT: ] + +# so.so +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 12 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: __gnu_local_gp + Type: R_MIPS_32 + - Offset: 0x04 + Symbol: T1 + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: T2 + Type: R_MIPS_CALL16 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: __gnu_local_gp + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/hilo16-1.test b/test/old-elf/Mips/hilo16-1.test new file mode 100644 index 000000000000..b284140f748f --- /dev/null +++ b/test/old-elf/Mips/hilo16-1.test @@ -0,0 +1,40 @@ +# REQUIRES: mips + +# Check handling multiple HI16 relocation followed by a single LO16 relocation. + +# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -d -t %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: T0: +# CHECK-NEXT: 400180: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 42 00 08 3c lui $8, 66 +# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088 +# CHECK-NEXT: {{[0-9a-f]+}}: a5 01 08 25 addiu $8, $8, 421 + +# CHECK: SYMBOL TABLE: +# CHECK: 00400180 g F .text 00000024 T0 +# CHECK: 004001a4 g F .text 00000004 T1 + + .text + .globl T0 +T0: + lui $8, %hi(T1+1) + lui $8, %hi(T1-1) + lui $8, %hi(T1+0x1ff) + lui $8, %hi(T1+(-0x1ff)) + lui $8, %hi(T1+0x1ffff) + lui $8, %hi(T1+(-0x1ffff)) + lui $8, %hi(T1+0x1ffffff) + lui $8, %hi(T1+(-0x1ffffff)) + addiu $8, $8, %lo(T1+(-0x1ffffff)) + + .globl T1 +T1: + nop diff --git a/test/old-elf/Mips/hilo16-2.test b/test/old-elf/Mips/hilo16-2.test new file mode 100644 index 000000000000..e47b9003a8dd --- /dev/null +++ b/test/old-elf/Mips/hilo16-2.test @@ -0,0 +1,70 @@ +# REQUIRES: mips + +# Check handling of HI16 and LO16 relocations for regular symbol. +# +# R_MIPS_HI16: (AHL + S) - (short)(AHL + S) +# R_MIPS_LO16: AHL + S +# where AHL = (AHI << 16) + ALO + +# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: T0: +# CHECK-NEXT: 400180: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: bf 03 08 25 addiu $8, $8, 959 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: c1 ff 08 25 addiu $8, $8, -63 +# +# CHECK: T1: +# CHECK-NEXT: 4001a0: 42 00 08 3c lui $8, 66 +# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447 +# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62 +# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576 +# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447 +# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088 +# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449 +# +# CHECK: T2: +# CHECK-NEXT: 4001c0: 00 00 00 00 nop + + .section .text.1,"ax",@progbits + .align 4 + .globl T0 +T0: + lui $8, %hi(T2+1) + addiu $8, $8, %lo(T2+1) + lui $8, %hi(T2+(-1)) + addiu $8, $8, %lo(T2+(-1)) + lui $8, %hi(T2+0x1ff) + addiu $8, $8, %lo(T2+0x1ff) + lui $8, %hi(T2+(-0x1ff)) + addiu $8, $8, %lo(T2+(-0x1ff)) + .size T0, .-T0 + + .section .text.2,"ax",@progbits + .align 4 + .globl T1 +T1: + lui $8, %hi(T2+0x1ffff) + addiu $8, $8, %lo(T2+0x1ffff) + lui $8, %hi(T2+(-0x1ffff)) + addiu $8, $8, %lo(T2+(-0x1ffff)) + lui $8, %hi(T2+0x1ffffff) + addiu $8, $8, %lo(T2+0x1ffffff) + lui $8, %hi(T2+(-0x1ffffff)) + addiu $8, $8, %lo(T2+(-0x1ffffff)) + .size T1, .-T1 + + .section .text.3,"ax",@progbits + .align 4 + .globl T2 +T2: + nop + .size T2, .-T2 diff --git a/test/old-elf/Mips/hilo16-3-overflow.test b/test/old-elf/Mips/hilo16-3-overflow.test new file mode 100644 index 000000000000..94fc90b3be54 --- /dev/null +++ b/test/old-elf/Mips/hilo16-3-overflow.test @@ -0,0 +1,44 @@ +# Check R_MIPS_HI16 relocation overflow handling. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to _gp_disp+2147483648 of type 5 (R_MIPS_HI16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0080000000000000" +# ^ %hi(gp+0x80000000) +# ^ %lo(gp+0x80000000) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x4 + Symbol: _gp_disp + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: _gp_disp diff --git a/test/old-elf/Mips/hilo16-3.test b/test/old-elf/Mips/hilo16-3.test new file mode 100644 index 000000000000..17873c0a629c --- /dev/null +++ b/test/old-elf/Mips/hilo16-3.test @@ -0,0 +1,74 @@ +# Check handling of HI16 and LO16 relocations for _gp_disp. +# +# R_MIPS_HI16: (AHL + GP - P) - (short)(AHL + GP - P) +# R_MIPS_LO16: AHL + GP - P + 4 +# where AHL = (AHI << 16) + ALO + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-objdump -s -t %t.so | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 00d0 0100083c 218f0885 0100083c 178f0885 +# CHECK-NEXT: 00e0 0100083c 0f910885 0100083c 098d0885 +# CHECK-NEXT: 00f0 0200083c ffff0885 + +# CHECK: SYMBOL TABLE: +# CHECK: 000000d0 g F .text 00000028 T0 +# CHECK: 00008ff0 g *ABS* 00000000 _gp_disp + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000083C010008850000083CFFFF08850000083CFF0108850000083C01FE08850200083CFFFF0885" +# ^ %hi(gp+1) ^ %hi(gp-1) ^ %hi(gp+0x1ff) ^ %hi(gp-0x1ff) ^ %lo(gp+0x1ffff) +# ^ %lo(gp+1) ^ %lo(gp-1) ^ %lo(gp+0x1ff) ^ %lo(gp-0x1ff) +# ^ %hi(gp+0x1ffff) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x4 + Symbol: _gp_disp + Type: R_MIPS_LO16 + - Offset: 0x8 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0xC + Symbol: _gp_disp + Type: R_MIPS_LO16 + - Offset: 0x10 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x14 + Symbol: _gp_disp + Type: R_MIPS_LO16 + - Offset: 0x18 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x1C + Symbol: _gp_disp + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 80 + - Name: _gp_disp diff --git a/test/old-elf/Mips/hilo16-4.test b/test/old-elf/Mips/hilo16-4.test new file mode 100644 index 000000000000..2db17344e30f --- /dev/null +++ b/test/old-elf/Mips/hilo16-4.test @@ -0,0 +1,93 @@ +# REQUIRES: mips + +# Check pairing of R_MIPS_HI16 and R_MIPS_LO16 relocations. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -e glob1 -o %t-exe %t-obj +# RUN: llvm-objdump -t -disassemble %t-exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK: glob1: +# CHECK-NEXT: 400130: 40 00 04 3c lui $4, 64 +# CHECK-NEXT: 400134: ff 9f a6 8c lw $6, -24577($5) + +# CHECK: glob2: +# CHECK-NEXT: 400138: 00 20 c7 80 lb $7, 8192($6) +# CHECK-NEXT: 40013c: 04 20 c8 80 lb $8, 8196($6) + +# CHECK: glob3: +# CHECK-NEXT: 400140: 40 80 05 3c lui $5, 32832 + +# CHECK: SYMBOL TABLE: +# CHECK: 00400130 g F .text 00000008 glob1 +# CHECK: 00400138 g F .text 00000008 glob2 +# CHECK: 00400140 g F .text 00000004 glob3 +# CHECK: 00402000 g .data 0000000c X + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS +# glob1: +# lui $4,%hi(X) # rel A +# lw $6,%lo(X+32767)($5) # rel B +# glob2: +# lb $7,%lo(X)($6) # rel C +# lb $8,%lo(X+4)($6) # rel D +# glob3: +# lui $5,%hi(X+32767) # rel E + Content: "0000043CFF7FA68C0000C7800400C880FF7F053C" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Content: "000000000000000000000000" + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x10 # rel E + Symbol: X + Type: R_MIPS_HI16 + - Offset: 0x04 # rel B + Symbol: X + Type: R_MIPS_LO16 + - Offset: 0x00 # rel A + Symbol: X + Type: R_MIPS_HI16 + - Offset: 0x0C # rel D + Symbol: X + Type: R_MIPS_LO16 + - Offset: 0x08 # rel C + Symbol: X + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: glob1 + Section: .text + Value: 0x0 + Size: 8 + - Name: glob2 + Section: .text + Value: 0x8 + Size: 8 + - Name: glob3 + Section: .text + Value: 0x10 + Size: 4 + - Name: X + Section: .data + Value: 0x0 + Size: 12 diff --git a/test/old-elf/Mips/hilo16-5.test b/test/old-elf/Mips/hilo16-5.test new file mode 100644 index 000000000000..597425e8ba74 --- /dev/null +++ b/test/old-elf/Mips/hilo16-5.test @@ -0,0 +1,103 @@ +# Check that linker shows a warning when +# there is orphaned R_MIPS_HI16 relocation. + +# RUN: yaml2obj -format=elf -o %t-so.o -docnum 1 %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -o %t-o.o -docnum 2 %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so 2>&1 \ +# RUN: | FileCheck -check-prefix=DIAG %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=DATA %s + +# DIAG: lld warning: cannot matching LO16 relocation +# DIAG: lld warning: cannot matching LO16 relocation + +# DATA: Contents of section .data: +# DATA-NEXT: 402000 40000000 10200000 40000000 @.... ..@... + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Content: "000000000000000000000000" + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_HI16 + - Offset: 0x08 + Symbol: D2 + Type: R_MIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_LO16 + - Offset: 0x08 + Symbol: .text + Type: R_MIPS_HI16 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: D1 + - Name: D2 +... diff --git a/test/old-elf/Mips/hilo16-8-micro.test b/test/old-elf/Mips/hilo16-8-micro.test new file mode 100644 index 000000000000..ef8ac782341c --- /dev/null +++ b/test/old-elf/Mips/hilo16-8-micro.test @@ -0,0 +1,81 @@ +# REQUIRES: mips + +# Check calculation of AHL addendums for R_MICROMIPS_HI16 / R_MICROMIPS_LO16 +# relocations for a regular symbol. + +# RUN: llvm-mc -arch=mipsel -filetype=obj -mattr=micromips -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: T0: +# CHECK-NEXT: 400180: a8 41 40 00 lui $8, 64 +# CHECK-NEXT: 400184: 08 31 c1 01 addiu $8, $8, 449 +# CHECK-NEXT: 400188: a8 41 41 00 lui $8, 65 +# CHECK-NEXT: 40018c: 08 31 bf 81 addiu $8, $8, -32321 +# CHECK-NEXT: 400190: a8 41 41 00 lui $8, 65 +# CHECK-NEXT: 400194: 08 31 40 82 addiu $8, $8, -32192 +# CHECK-NEXT: 400198: a8 41 42 00 lui $8, 66 +# CHECK-NEXT: 40019c: 08 31 c0 81 addiu $8, $8, -32320 +# +# CHECK: T1: +# CHECK-NEXT: 4001a0: a8 41 40 40 lui $8, 16448 +# CHECK-NEXT: 4001a4: 08 31 c0 01 addiu $8, $8, 448 +# CHECK-NEXT: 4001a8: a8 41 40 80 lui $8, 32832 +# CHECK-NEXT: 4001ac: 08 31 c0 01 addiu $8, $8, 448 +# CHECK-NEXT: 4001b0: a8 41 c1 80 lui $8, 32961 +# CHECK-NEXT: 4001b4: 08 31 40 82 addiu $8, $8, -32192 +# CHECK-NEXT: 4001b8: 00 00 00 00 nop +# CHECK-NEXT: 4001bc: 00 00 00 00 nop +# +# CHECK: T2: +# CHECK-NEXT: 4001c0: 00 00 00 00 nop +# CHECK-NEXT: 4001c4: a8 41 40 00 lui $8, 64 +# CHECK-NEXT: 4001c8: a8 41 40 00 lui $8, 64 +# CHECK-NEXT: 4001cc: a8 41 41 00 lui $8, 65 +# CHECK-NEXT: 4001d0: a8 41 42 00 lui $8, 66 +# CHECK-NEXT: 4001d4: a8 41 40 40 lui $8, 16448 +# CHECK-NEXT: 4001d8: a8 41 40 80 lui $8, 32832 +# CHECK-NEXT: 4001dc: a8 41 c1 80 lui $8, 32961 +# CHECK-NEXT: 4001e0: 08 31 00 82 addiu $8, $8, -32256 + + .section .text.1,"ax",@progbits + .align 4 + .globl T0 +T0: + lui $8, %hi(T2+1) + addiu $8, $8, %lo(T2+1) + lui $8, %hi(T2+0x7fff) + addiu $8, $8, %lo(T2+0x7fff) + lui $8, %hi(T2+0x8080) + addiu $8, $8, %lo(T2+0x8080) + lui $8, %hi(T2+0x18000) + addiu $8, $8, %lo(T2+0x18000) + .size T0, .-T0 + + .section .text.2,"ax",@progbits + .align 4 + .globl T1 +T1: + lui $8, %hi(T2+0x40000000) + addiu $8, $8, %lo(T2+0x40000000) + lui $8, %hi(T2+0x80000000) + addiu $8, $8, %lo(T2+0x80000000) + lui $8, %hi(T2+0x80808080) + addiu $8, $8, %lo(T2+0x80808080) + .size T1, .-T1 + + .section .text.3,"ax",@progbits + .align 4 + .globl T2 +T2: + nop + lui $8, %hi(T0+0x1) + lui $8, %hi(T0+0x7fff) + lui $8, %hi(T0+0x8080) + lui $8, %hi(T0+0x18000) + lui $8, %hi(T0+0x40000000) + lui $8, %hi(T0+0x80000000) + lui $8, %hi(T0+0x80808080) + addiu $8, $8, %lo(T0+0x80808080) + .size T2, .-T2 diff --git a/test/old-elf/Mips/hilo16-9-micro.test b/test/old-elf/Mips/hilo16-9-micro.test new file mode 100644 index 000000000000..293e35f36cd5 --- /dev/null +++ b/test/old-elf/Mips/hilo16-9-micro.test @@ -0,0 +1,142 @@ +# Check calculation of AHL addendums for R_MICROMIPS_HI16 / R_MICROMIPS_LO16 +# relocations for the _gp_disp symbol. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-objdump -s -t %t.so | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 0110 00000100 0000e08e 00000100 0000d60e +# CHECK-NEXT: 0120 00000100 00004f0f 00000000 00000000 +# CHECK-NEXT: 0130 00000200 0000bf0e 00000140 0000378f +# CHECK-NEXT: 0140 00000100 00000100 00000200 00000300 +# CHECK-NEXT: 0150 00000140 00001f8f + +# CHECK: SYMBOL TABLE: +# CHECK: 00000110 g F .text 00000018 T0 +# CHECK: 00000130 g F .text 00000010 T1 +# CHECK: 00000140 g F .text 00000018 T2 +# CHECK: 00008ff0 g *ABS* 00000000 _gp_disp + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text.1 + Type: SHT_PROGBITS + Content: "0000000000000100000000000000FF7F0000010000008080" +# ^ %hi(gp+0x1) ^ %hi(gp+0x7fff) ^ %lo(gp+0x8080) +# ^ %lo(gp+0x1) ^ %lo(gp+0x7fff) +# ^ %hi(gp+0x8080) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text.1 + Type: SHT_REL + Info: .text.1 + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x4 + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + - Offset: 0x8 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0xC + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + - Offset: 0x10 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x14 + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + +- Name: .text.2 + Type: SHT_PROGBITS + Content: "00000200000000800000004000008000" +# ^ %hi(gp+0x18000) ^ %lo(gp+0x40000080) +# ^ %lo(gp+0x18000) +# ^ %hi(gp+0x40000080) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text.2 + Type: SHT_REL + Info: .text.2 + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x4 + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + - Offset: 0x8 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0xC + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + +- Name: .text.3 + Type: SHT_PROGBITS + Content: "000000000000000000000100000002000000004000008000" +# ^ %hi(gp+0x1) ^ %hi(gp+0x8080) ^ %lo(gp+0x40000080) +# ^ %hi(gp+0x7fff) ^ %hi(gp+0x40000080) +# ^ %hi(gp+0x18000) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text.3 + Type: SHT_REL + Info: .text.3 + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x4 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x8 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0xC + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x10 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x14 + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text.1 + Type: STT_FUNC + Value: 0 + Size: 24 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + Section: .text.2 + Type: STT_FUNC + Value: 0 + Size: 16 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 + Section: .text.3 + Type: STT_FUNC + Value: 0 + Size: 24 + Other: [STO_MIPS_MICROMIPS] + - Name: _gp_disp diff --git a/test/old-elf/Mips/initfini-micro.test b/test/old-elf/Mips/initfini-micro.test new file mode 100644 index 000000000000..ca2708f1bb29 --- /dev/null +++ b/test/old-elf/Mips/initfini-micro.test @@ -0,0 +1,45 @@ +# Check that if _init/_fini symbols are microMIPS encoded, DT_INIT/DT_FINI tags +# use adjusted values with set the last bit. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s + +# CHECK: Name: _init (1) +# CHECK-NEXT: Value: 0xF5 +# CHECK: Name: _fini (7) +# CHECK-NEXT: Value: 0xF9 +# +# CHECK: 0x0000000C INIT 0xF5 +# CHECK: 0x0000000D FINI 0xF9 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x18 + +Symbols: + Global: + - Name: _init + Type: STT_FUNC + Section: .text + Value: 0x0 + Size: 0x4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: _fini + Type: STT_FUNC + Section: .text + Value: 0x4 + Size: 0x4 + Other: [ STO_MIPS_MICROMIPS ] +... diff --git a/test/old-elf/Mips/interpreter-64.test b/test/old-elf/Mips/interpreter-64.test new file mode 100644 index 000000000000..7cfd0c51a3c4 --- /dev/null +++ b/test/old-elf/Mips/interpreter-64.test @@ -0,0 +1,26 @@ +# Check program interpreter setup. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -e main -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .interp: +# CHECK-NEXT: {{[0-9a-f]+}} 2f6c6962 36342f6c 642e736f 2e3100 /lib64/ld.so.1. + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x08 + +Symbols: + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/interpreter-n32.test b/test/old-elf/Mips/interpreter-n32.test new file mode 100644 index 000000000000..7d17256ba43c --- /dev/null +++ b/test/old-elf/Mips/interpreter-n32.test @@ -0,0 +1,27 @@ +# Check program interpreter setup in case of N32 ABI. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .interp: +# CHECK-NEXT: {{[0-9a-f ]+}} /lib32/ld.so.1. + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_ABI2 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + +Symbols: + Global: + - Name: __start + Section: .text diff --git a/test/old-elf/Mips/interpreter.test b/test/old-elf/Mips/interpreter.test new file mode 100644 index 000000000000..4ae17b42df1c --- /dev/null +++ b/test/old-elf/Mips/interpreter.test @@ -0,0 +1,26 @@ +# Check program interpreter setup. +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e main -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .interp: +# CHECK-NEXT: {{[0-9a-f]+}} 2f6c6962 2f6c642e 736f2e31 00 /lib/ld.so.1. + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + +Symbols: + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/invalid-reginfo.test b/test/old-elf/Mips/invalid-reginfo.test new file mode 100644 index 000000000000..2856ecc92607 --- /dev/null +++ b/test/old-elf/Mips/invalid-reginfo.test @@ -0,0 +1,28 @@ +# Check that LLD shows an error if .reginfo section has invalid size + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -o %t.exe %t.o 2>&1 | FileCheck %s + +# CHECK: Invalid size of MIPS_REGINFO section + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 0x01 + Size: 0x25 +Symbols: + Global: + - Name: main + Section: .text diff --git a/test/old-elf/Mips/jalx-align-err.test b/test/old-elf/Mips/jalx-align-err.test new file mode 100644 index 000000000000..8fc5310bbad8 --- /dev/null +++ b/test/old-elf/Mips/jalx-align-err.test @@ -0,0 +1,46 @@ +# Check that LLD shows an error if jalx target value is not word-aligned. + +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t-exe %t-obj 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: The jalx target 0x{{[0-9a-f]+}} is not word-aligned + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 6 + Size: 2 diff --git a/test/old-elf/Mips/jalx-jalr.test b/test/old-elf/Mips/jalx-jalr.test new file mode 100644 index 000000000000..d02e9d7c2bac --- /dev/null +++ b/test/old-elf/Mips/jalx-jalr.test @@ -0,0 +1,47 @@ +# Check that R_MIPS_JALR relocation does not affect code in case of cross jump. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9a-f]+}} 08002003 00000000 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_MICROMIPS, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "0800200300000000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: M1 + Type: R_MIPS_JALR + +Symbols: + Global: + - Name: __start + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + - Name: M1 + Type: STT_FUNC + Section: .text + Value: 4 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] diff --git a/test/old-elf/Mips/jalx.test b/test/old-elf/Mips/jalx.test new file mode 100644 index 000000000000..60d6ea71193c --- /dev/null +++ b/test/old-elf/Mips/jalx.test @@ -0,0 +1,71 @@ +# Check jal => jalx conversion in case of mixed microMIPS and regular code. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s +# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYM %s + +# RAW: Contents of section .text: +# RAW-NEXT: 400130 00000000 4c001074 10f04d00 4e001074 + +# SYM: 00400138 T M1 +# SYM: 00400130 T M2 +# SYM: 0040013c T T1 +# SYM: 00400134 T T2 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_MICROMIPS, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "000000000000000c00f400000000000c" +# ^ M2 ^ T2 ^ M1 ^ T1 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 4 + Symbol: M2 + Type: R_MIPS_26 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + - Offset: 12 + Symbol: M1 + Type: R_MIPS_26 + +Symbols: + Global: + - Name: M2 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T2 + Type: STT_FUNC + Section: .text + Value: 4 + Size: 4 + - Name: M1 + Type: STT_FUNC + Section: .text + Value: 8 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 12 + Size: 4 diff --git a/test/old-elf/Mips/jump-fix-err.test b/test/old-elf/Mips/jump-fix-err.test new file mode 100644 index 000000000000..0e5a5298a731 --- /dev/null +++ b/test/old-elf/Mips/jump-fix-err.test @@ -0,0 +1,45 @@ +# Check that LLD shows an error in case +# of replacing an unknown unstruction by jalx. + +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: not lld -flavor old-gnu -target mipsel -o %t-exe %t-obj 2>&1 | FileCheck %s + +# CHECK: Unsupported jump opcode (0x0) for ISA modes cross call + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MICROMIPS_26_S1 + +Symbols: + Global: + - Name: __start + Section: .text + Type: STT_FUNC + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/la25-stub-be.test b/test/old-elf/Mips/la25-stub-be.test new file mode 100644 index 000000000000..9527e7a80644 --- /dev/null +++ b/test/old-elf/Mips/la25-stub-be.test @@ -0,0 +1,113 @@ +# REQUIRES: mips + +# Check LA25 stubs creation in the big-endian case. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-npic.o %t-pic.o %t-main.o + +# RUN: llvm-objdump -disassemble %t.exe | FileCheck %s + +# CHECK: 400170: 3c 19 00 40 lui $25, 64 +# CHECK-NEXT: 400174: 08 10 00 50 j 4194624 +# CHECK-NEXT: 400178: 27 39 01 40 addiu $25, $25, 320 +# CHECK-NEXT: 40017c: 00 00 00 00 nop + +# npic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1N + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# main.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 40 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 8 + Symbol: .text + Type: R_MIPS_26 + - Offset: 16 + Symbol: __start + Type: R_MIPS_26 + - Offset: 24 + Symbol: T1N + Type: R_MIPS_26 + - Offset: 32 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 16 + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: __start + Section: .text + - Name: T1 + - Name: T1N +... diff --git a/test/old-elf/Mips/la25-stub-micro-be.test b/test/old-elf/Mips/la25-stub-micro-be.test new file mode 100644 index 000000000000..0bea3e6ac8b0 --- /dev/null +++ b/test/old-elf/Mips/la25-stub-micro-be.test @@ -0,0 +1,121 @@ +# REQUIRES: mips + +# Check LA25 stubs creation in the big-endian case. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-npic.o %t-pic.o %t-main.o + +# RUN: llvm-objdump -disassemble -mattr=micromips %t.exe | FileCheck %s + +# CHECK: 400170: 41 be 00 40 lui $fp, 64 +# CHECK-NEXT: 400174: d4 20 00 a0 j 4194624 +# CHECK-NEXT: 400178: 33 39 01 41 addiu $25, $25, 321 +# CHECK-NEXT: 40017c: 00 00 00 00 nop + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1N + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + +# main.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Content: '0000000000000000f400000000000000f400000000000000f400000000000000f400000000000000' +# jal loc jal glob jal T1N jal T1 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 8 + Symbol: .text + Type: R_MICROMIPS_26_S1 + - Offset: 16 + Symbol: glob + Type: R_MICROMIPS_26_S1 + - Offset: 24 + Symbol: T1N + Type: R_MICROMIPS_26_S1 + - Offset: 32 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 16 + Size: 24 + Other: [ STO_MIPS_MICROMIPS ] + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: __start + Section: .text + Size: 16 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + - Name: T1N +... diff --git a/test/old-elf/Mips/la25-stub-micro.test b/test/old-elf/Mips/la25-stub-micro.test new file mode 100644 index 000000000000..c01da5908829 --- /dev/null +++ b/test/old-elf/Mips/la25-stub-micro.test @@ -0,0 +1,136 @@ +# Check microMIPS LA25 stubs creation when PIC code +# is called from non-PIC routines. + +# Build executable from pic and non-pic code. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe \ +# RUN: %t-npic.o %t-pic.o %t-main.o + +# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=ASM %s + +# SYM: 00400140 T T1 +# SYM: 00400130 T T1N +# SYM: 00400144 T glob +# SYM: 00400154 t loc + +# ASM: Contents of section .text: +# ASM-NEXT: 400130 00000000 00000000 00000000 00000000 +# ASM-NEXT: 400140 00000000 00000000 00000000 10f05100 +# 0x100055 << 2 == 0x400154 (jalx glob) --^ +# ASM-NEXT: 400150 00000000 20f4a200 00000000 20f49800 +# ^-- 0x100055 << 2 == 0x400154 (jal glob) +# 0x10004c << 2 == 0x400130 (jal T1N) --^ +# ASM-NEXT: 400160 00000000 20f4b800 00000000 00000000 +# ^-- 0x100054 << 2 == 0x400170 (jal T1 stub) +# ASM-NEXT: 400170 b9414000 20d4a000 39334101 00000000 +# ^-- j 0x400140 (T1) + +# npic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1N + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + +# main.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_CPIC, EF_MIPS_MICROMIPS ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '000000000000000000f400000000000000f400000000000000f400000000000000f4000000000000' +# jal loc jal glob jal T1N jal T1 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: .text + Type: R_MICROMIPS_26_S1 + - Offset: 0x10 + Symbol: glob + Type: R_MICROMIPS_26_S1 + - Offset: 0x18 + Symbol: T1N + Type: R_MICROMIPS_26_S1 + - Offset: 0x20 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + Size: 0x18 + Other: [ STO_MIPS_MICROMIPS ] + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Size: 0x10 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + - Name: T1N +... diff --git a/test/old-elf/Mips/la25-stub-npic-01.test b/test/old-elf/Mips/la25-stub-npic-01.test new file mode 100644 index 000000000000..9ff6af06cb2b --- /dev/null +++ b/test/old-elf/Mips/la25-stub-npic-01.test @@ -0,0 +1,153 @@ +# Check that LA25 stubs are created for branch relocations +# when a PIC function is called from non-pic code. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe \ +# RUN: %t-reg.o %t-micro.o %t-pic.o + +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK-NOT: Contents of section .plt: +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 5c001000 0f000000 0e000000 0d000000 +# ^ T0 ^ .pic.T1 (0x400170) +# ^ 0x400134 + 0x3c = 0x400170 +# ^ ... +# CHECK-NEXT: 400140 2000c000 1e000000 1c000000 00001a00 +# ^ T3 ^ .pic.T2 +# ^ ... +# CHECK-NEXT: 400150 00000c00 00000000 00000000 00000000 +# CHECK-NEXT: 400160 00000000 00000000 00000000 00000000 +# ^ T1 ^ T2 +# CHECK-NEXT: 400170 4000193c 58001008 60013927 00000000 +# ^ .pic.T1 +# CHECK-NEXT: 400180 b9414000 20d4b200 39336501 00000000 +# ^ .pic.T2 + +# CHECK: SYMBOL TABLE: +# CHECK: 00400130 g F .text 00000010 T0 +# CHECK: 00400140 g F .text 00000014 T3 +# CHECK: 00400160 g F .text 00000004 T1 +# CHECK: 00400164 g F .text 00000004 T2 + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# reg.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 16 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_PC21_S2 + - Offset: 12 + Symbol: T1 + Type: R_MIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Size: 16 + - Name: T1 + +# micro.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 20 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + - Offset: 4 + Symbol: T2 + Type: R_MICROMIPS_PC7_S1 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_PC10_S1 + - Offset: 12 + Symbol: T2 + Type: R_MICROMIPS_PC16_S1 + - Offset: 16 + Symbol: T2 + Type: R_MICROMIPS_PC23_S2 + +Symbols: + Global: + - Name: T3 + Section: .text + Size: 20 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 +... diff --git a/test/old-elf/Mips/la25-stub-npic-02.test b/test/old-elf/Mips/la25-stub-npic-02.test new file mode 100644 index 000000000000..4f2eb14d8c92 --- /dev/null +++ b/test/old-elf/Mips/la25-stub-npic-02.test @@ -0,0 +1,123 @@ +# Check that LA25 stubs are created for branch relocations +# when a PIC function is defined in a non-PIC file and +# is called from non-pic code. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t1.o %t2.o + +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK-NOT: Contents of section .plt: +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 00000000 00000000 58001000 09000000 +# ^ T1 ^ T2 ^ .pic.T1 (0x400160) +# CHECK-NEXT: 400140 08000000 07000000 2000b800 12000000 +# ^ .pic.T2 (0x400170) +# CHECK-NEXT: 400150 10000000 00000e00 00000600 00000000 +# CHECK-NEXT: 400160 4000193c 4c001008 30013927 00000000 +# ^ .pic.T1 +# CHECK-NEXT: 400170 b9414000 20d49a00 39333501 00000000 +# ^ .pic.T2 + +# CHECK: SYMBOL TABLE: +# CHECK: 00400130 g F .text 00000004 T1 +# CHECK: 00400134 g F .text 00000004 T2 +# CHECK: 00400138 g F .text 00000010 T0 +# CHECK: 00400148 g F .text 00000014 T3 + +# 1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + Other: [STO_MIPS_PIC] + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS, STO_MIPS_PIC] + +# 2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 36 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_PC21_S2 + - Offset: 12 + Symbol: T1 + Type: R_MIPS_PC26_S2 + - Offset: 16 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + - Offset: 20 + Symbol: T2 + Type: R_MICROMIPS_PC7_S1 + - Offset: 24 + Symbol: T2 + Type: R_MICROMIPS_PC10_S1 + - Offset: 28 + Symbol: T2 + Type: R_MICROMIPS_PC16_S1 + - Offset: 32 + Symbol: T2 + Type: R_MICROMIPS_PC23_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Value: 0 + Size: 16 + - Name: T3 + Section: .text + Value: 16 + Size: 20 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + - Name: T2 +... diff --git a/test/old-elf/Mips/la25-stub-npic-shared.test b/test/old-elf/Mips/la25-stub-npic-shared.test new file mode 100644 index 000000000000..72bac30f86ad --- /dev/null +++ b/test/old-elf/Mips/la25-stub-npic-shared.test @@ -0,0 +1,152 @@ +# Check that PLT entries are created for branch relocations +# when a PIC shared library function is called from non-pic code. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-pic.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-reg.o %t-micro.o %t.so + +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .plt: +# CHECK-NEXT: 400190 40001c3c 0020998f 00209c27 23c01c03 +# CHECK-NEXT: 4001a0 2578e003 82c01800 09f82003 feff1827 +# CHECK-NEXT: 4001b0 40000f3c 0820f98d 08002003 0820f825 +# ^ PLT.T1 +# CHECK-NEXT: 4001c0 00799307 22ff0000 9945020f +# ^ PLT.T2 + +# CHECK: Contents of section .text: +# CHECK-NEXT: 4001cc 6c001000 f8ff0000 f7ff1f00 f6ffff03 +# ^ T0 ^ PLT.T1 (0x4001b0) +# ^ 0x4001d0 -32 = 0x4001b0 +# ^ ... +# CHECK-NEXT: 4001dc 2000e000 70000000 ee030000 0000ecff +# ^ T3 ^ PLT.T2 +# ^ ... +# CHECK-NEXT: 4001ec 7f00f5ff + +# CHECK: SYMBOL TABLE: +# CHECK: 004001cc g F .text 00000010 T0 +# CHECK: 004001dc g F .text 00000014 T3 + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# reg.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 16 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_PC21_S2 + - Offset: 12 + Symbol: T1 + Type: R_MIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Size: 16 + - Name: T1 + +# micro.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 20 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + - Offset: 4 + Symbol: T2 + Type: R_MICROMIPS_PC7_S1 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_PC10_S1 + - Offset: 12 + Symbol: T2 + Type: R_MICROMIPS_PC16_S1 + - Offset: 16 + Symbol: T2 + Type: R_MICROMIPS_PC23_S2 + +Symbols: + Global: + - Name: T3 + Section: .text + Size: 20 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 +... diff --git a/test/old-elf/Mips/la25-stub-pic.test b/test/old-elf/Mips/la25-stub-pic.test new file mode 100644 index 000000000000..8db88404aaef --- /dev/null +++ b/test/old-elf/Mips/la25-stub-pic.test @@ -0,0 +1,144 @@ +# Check that we do not create LA26 stubs and PLT entries +# when a PIC function is called from PIC code. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o %t-reg.o %t-micro.o + +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK-NOT: Contents of section .plt: +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 00000000 00000000 4c001000 fdff0000 +# ^ T1 ^ T2 ^ T1 (0x400130) +# ^ 0x40013c - 12 = 0x0x400130 +# CHECK-NEXT: 400140 fcff1f00 fbffff03 20009a00 74000000 +# ^ T2 (0x400134) + +# CHECK: SYMBOL TABLE: +# CHECK: 00400130 g F .text 00000004 T1 +# CHECK: 00400134 g F .text 00000004 T2 +# CHECK: 00400138 g F .text 00000010 T0 +# CHECK: 00400148 g F .text 00000014 T3 + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# reg.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 16 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_PC21_S2 + - Offset: 12 + Symbol: T1 + Type: R_MIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Size: 16 + - Name: T1 + +# micro.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, + EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 20 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + - Offset: 4 + Symbol: T2 + Type: R_MICROMIPS_PC7_S1 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_PC10_S1 + - Offset: 12 + Symbol: T2 + Type: R_MICROMIPS_PC16_S1 + - Offset: 16 + Symbol: T2 + Type: R_MICROMIPS_PC23_S2 + +Symbols: + Global: + - Name: T3 + Section: .text + Size: 20 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 +... diff --git a/test/old-elf/Mips/la25-stub.test b/test/old-elf/Mips/la25-stub.test new file mode 100644 index 000000000000..4df7f85e8c89 --- /dev/null +++ b/test/old-elf/Mips/la25-stub.test @@ -0,0 +1,133 @@ +# Check LA25 stubs creation when PIC code is called from non-PIC routines. + +# Build executable from pic and non-pic code. +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe \ +# RUN: %t-npic.o %t-pic.o %t-main.o + +# RUN: llvm-readobj -t %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=ASM %s + +# SYM: Name: loc (13) +# SYM-NEXT: Value: 0x400154 +# SYM: Name: T1N (1) +# SYM-NEXT: Value: 0x400130 +# SYM: Name: T1 (5) +# SYM-NEXT: Value: 0x400140 +# SYM: Name: glob (8) +# SYM-NEXT: Value: 0x400144 + +# ASM: Contents of section .text: +# ASM-NEXT: 400130 00000000 00000000 00000000 00000000 +# ASM-NEXT: 400140 00000000 00000000 00000000 51001000 +# 0x100051 << 2 == 0x400144 (glob) --^ +# ASM-NEXT: 400150 00000000 51001000 00000000 4c001000 +# ^-- 0x100051 << 2 == 0x400144 (glob) +# 0x100044 << 2 == 0x400110 (T1N) --^ +# ASM-NEXT: 400160 00000000 5c001000 00000000 00000000 +# ^-- 0x10005c << 2 == 0x400170 (T1 stub) +# ASM-NEXT: 400170 4000193c 50001008 40013927 00000000 +# ^-- j 0x400140 (T1) + +# npic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1N + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# pic.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# main.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x28 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: .text + Type: R_MIPS_26 + Addend: 0 + - Offset: 0x10 + Symbol: glob + Type: R_MIPS_26 + Addend: 0 + - Offset: 0x18 + Symbol: T1N + Type: R_MIPS_26 + Addend: 0 + - Offset: 0x20 + Symbol: T1 + Type: R_MIPS_26 + Addend: 0 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + - Name: T1 + - Name: T1N +... diff --git a/test/old-elf/Mips/mips-options-01.test b/test/old-elf/Mips/mips-options-01.test new file mode 100644 index 000000000000..8f2e63ca3b5f --- /dev/null +++ b/test/old-elf/Mips/mips-options-01.test @@ -0,0 +1,34 @@ +# Check that LLD does not write a .MIPS.options section if input +# object file does not contain such section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-readobj -s -dynamic-table %t.so | FileCheck %s + +# CHECK: Sections [ +# CHECK-NOT: Name: .MIPS.options + +# CHECK: DynamicSection [ +# CHECK-NOT: 0x{{[0-9A-F]+}} MIPS_OPTIONS + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/mips-options-02.test b/test/old-elf/Mips/mips-options-02.test new file mode 100644 index 000000000000..a5f19e55735f --- /dev/null +++ b/test/old-elf/Mips/mips-options-02.test @@ -0,0 +1,104 @@ +# Check merging input .MIPS.options sections. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t1.o %t2.o +# RUN: llvm-readobj -s -dynamic-table %t.so | FileCheck -check-prefix=SEC %s +# RUN: llvm-objdump -s -t %t.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -program-headers %t.so | FileCheck -check-prefix=PHDR %s + +# SEC: Index: 1 +# SEC-NEXT: Name: .MIPS.options (1) +# SEC-NEXT: Type: SHT_MIPS_OPTIONS (0x7000000D) +# SEC-NEXT: Flags [ (0x8000002) +# SEC-NEXT: SHF_ALLOC (0x2) +# SEC-NEXT: SHF_MIPS_NOSTRIP (0x8000000) +# SEC-NEXT: ] +# SEC-NEXT: Address: 0x[[OPT_ADDR:[0-9A-F]+]] +# SEC-NEXT: Offset: {{[0-9A-F]+}} +# SEC-NEXT: Size: 40 +# SEC-NEXT: Link: 0 +# SEC-NEXT: Info: 0 +# SEC-NEXT: AddressAlignment: 8 +# SEC-NEXT: EntrySize: 1 + +# SEC: DynamicSection [ +# SEC: 0x{{[0-9A-F]+}} MIPS_OPTIONS 0x[[OPT_ADDR]] + +# RAW: Contents of section .MIPS.options: +# RAW-NEXT: {{[0-9a-f]+}} 01280000 00000000 f0000001 00000000 +# RAW-NEXT: {{[0-9a-f]+}} e0000002 d0000003 b0000004 c0000005 +# RAW-NEXT: {{[0-9a-f]+}} f08f0000 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 0000000000008ff0 g *ABS* 00000000 _gp + +# Check that %t.so contains only two PT_LOAD segments +# PHDR: ProgramHeaders +# PHDR: Type: PT_LOAD +# PHDR: Type: PT_LOAD +# PHDR-NOT: Type: PT_LOAD +# PHDR: Type: PT_DYNAMIC + +# t1.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 +# v ODK_NULL 0x18 bytes long v ODK_REGINFO + Content: "0018000000000000000000000000000000000000000000000128000000000000F000000000000000E0000000D0000000B0000000C00000000010000000000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 +# v ODK_NULL 0x18 bytes long v ODK_REGINFO + Content: "00180000000000000000000000000000000000000000000001280000000000000000000100000000000000020000000300000004000000050000010000000000" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/mips-options-03.test b/test/old-elf/Mips/mips-options-03.test new file mode 100644 index 000000000000..a0dea5709b6f --- /dev/null +++ b/test/old-elf/Mips/mips-options-03.test @@ -0,0 +1,41 @@ +# Check handling a zero-filled input .MIPS.options section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-objdump -s -t %t.so | FileCheck %s + +# CHECK: Contents of section .MIPS.options: +# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 00000000 00000000 +# CHECK-NEXT: {{[0-9a-f]+}} 00000000 00000000 00000000 00000000 +# CHECK-NEXT: {{[0-9a-f]+}} f08f0000 00000000 + +# CHECK: SYMBOL TABLE: +# CHECK: 00008ff0 g *ABS* 00000000 _gp + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000000000000000000000000000000000000000000000000000000000000000000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/mips-options-04.test b/test/old-elf/Mips/mips-options-04.test new file mode 100644 index 000000000000..5df94aae9257 --- /dev/null +++ b/test/old-elf/Mips/mips-options-04.test @@ -0,0 +1,77 @@ +# Check that .MIPS.options sections from shared libraries do not affect +# output .MIPS.options section content. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.exe.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.so %t.exe.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .MIPS.options: +# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 44444444 00000000 +# CHECK-NEXT: {{[0-9a-f]+}} 44444444 44444444 44444444 44444444 +# CHECK-NEXT: {{[0-9a-f]+}} f08f0020 01000000 + +# CHECK: SYMBOL TABLE: +# CHECK: 20008ff0 g *ABS* 00000000 _gp + +# t.so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000001111111100000000111111111111111111111111111111110010000000000000" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t.exe.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000004444444400000000444444444444444444444444444444440010000000000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/mips-options-05.test b/test/old-elf/Mips/mips-options-05.test new file mode 100644 index 000000000000..f7e9728b3cf4 --- /dev/null +++ b/test/old-elf/Mips/mips-options-05.test @@ -0,0 +1,119 @@ +# Check that .MIPS.options section gets register usage mask from "used" files +# only. In this test case we take only t2.o from liboptions.a and should not +# add register usage masks from t1.o to the output .MIPS.options section. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: llvm-ar q %T/liboptions.a %t1.o %t2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t3.o -L%T -loptions +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .MIPS.options: +# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 66666666 00000000 +# CHECK-NEXT: {{[0-9a-f]+}} 66666666 66666666 66666666 66666666 +# CHECK-NEXT: {{[0-9a-f]+}} f08f0020 01000000 + +# CHECK: SYMBOL TABLE: +# CHECK: 20008ff0 g *ABS* 00000000 _gp + +# t1.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000001111111100000000111111111111111111111111111111110010000000000000" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000002222222200000000222222222222222222222222222222220010000000000000" + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t3.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MIPS_32 + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 8 + Content: "01280000000000004444444400000000444444444444444444444444444444440010000000000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 +... diff --git a/test/old-elf/Mips/mips-options-gp0.test b/test/old-elf/Mips/mips-options-gp0.test new file mode 100644 index 000000000000..73e578347f2c --- /dev/null +++ b/test/old-elf/Mips/mips-options-gp0.test @@ -0,0 +1,77 @@ +# Check reading GP0 value from .MIPS.options section +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -e G1 -shared -o %t.so %t.o +# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s + +# SYM: Name: L1 +# SYM-NEXT: Value: 0x15C +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Local (0x0) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x8FF0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Object (0x1) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Absolute (0xFFF1) + +# 0xffff816c == 0x0 (addend) + 0x015C (L1) + 0x1000 (GP0) - 0x8ff0 (_gp) +# SEC: Contents of section .rodata: +# SEC-NEXT: {{[0-9a-f]+}} 6c81ffff 00000000 00000000 00000000 + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2 ] +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + +- Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x04 + Size: 16 + +- Name: .rel.rodata + Type: SHT_RELA + Link: .symtab + Info: .rodata + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: L1 + Type: R_MIPS_GPREL32 + +- Name: .MIPS.options + Type: SHT_MIPS_OPTIONS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x01 + Content: "012800000000000000000000000000000000000000000000000000000000000000100000" + +Symbols: + Local: + - Name: L1 + Section: .text + Value: 0x00 + Size: 0x04 + - Name: .rodata + Type: STT_SECTION + Section: .rodata + Global: + - Name: G1 + Section: .text + Value: 0x04 + Size: 0x04 diff --git a/test/old-elf/Mips/n32-rela-chain.test b/test/old-elf/Mips/n32-rela-chain.test new file mode 100644 index 000000000000..9569eb7c5855 --- /dev/null +++ b/test/old-elf/Mips/n32-rela-chain.test @@ -0,0 +1,68 @@ +# Check grouping of multiple consecutive relocations in case of N32 +# and 64-bit MIPS ABIs. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 10000130 00001001 00002004 + +# CHECK: 10002000 l .data 00000004 D0 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_ABI2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: D0 + Type: R_MIPS_32 + Addend: 0x10000 + - Offset: 0 + Symbol: D0 + Type: R_MIPS_HI16 + - Offset: 4 + Symbol: D0 + Type: R_MIPS_32 + Addend: 4 + - Offset: 4 + Symbol: D0 + Type: R_MIPS_LO16 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 16 + Size: 4 + +Symbols: + Local: + - Name: D0 + Type: STT_FUNC + Section: .data + Value: 0 + Size: 4 + Global: + - Name: __start + Type: STT_FUNC + Section: .text + Value: 0 + Size: 8 +... diff --git a/test/old-elf/Mips/n64-rel-chain.test b/test/old-elf/Mips/n64-rel-chain.test new file mode 100644 index 000000000000..3797c4321701 --- /dev/null +++ b/test/old-elf/Mips/n64-rel-chain.test @@ -0,0 +1,204 @@ +# Check handling MIPS N64 ABI relocation "chains". + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -s -t -dt -mips-plt-got %t.exe | \ +# RUN: FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s + +# SYM: Section { +# SYM: Index: 6 +# SYM-NEXT: Name: .rodata +# SYM-NEXT: Type: SHT_PROGBITS +# SYM-NEXT: Flags [ +# SYM-NEXT: SHF_ALLOC +# SYM-NEXT: ] +# SYM-NEXT: Address: 0x120000230 +# +# SYM: Symbol { +# SYM: Name: LT1 +# SYM-NEXT: Value: 0x120000210 +# SYM-NEXT: Size: 16 +# SYM-NEXT: Binding: Global +# SYM-NEXT: Type: Function +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T0 +# SYM-NEXT: Value: 0x120000220 +# SYM-NEXT: Size: 16 +# SYM-NEXT: Binding: Global +# SYM-NEXT: Type: Function +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T1@ +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Global +# SYM-NEXT: Type: Function +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Undefined +# SYM-NEXT: } +# +# SYM: Canonical gp value: 0x120008FF0 +# SYM: Local entries [ +# SYM-NEXT: Entry { +# SYM-NEXT: Address: 0x{{[0-9A-F]+}} +# SYM-NEXT: Access: -32736 +# SYM-NEXT: Initial: 0x120000000 +# SYM-NEXT: } +# SYM-NEXT: ] +# SYM-NEXT: Global entries [ +# SYM-NEXT: Entry { +# SYM-NEXT: Address: 0x{{[0-9A-F]+}} +# SYM-NEXT: Access: -32728 +# SYM-NEXT: Initial: 0x0 +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Section: Undefined (0x0) +# SYM-NEXT: Name: T1@ (1) +# SYM-NEXT: } +# SYM-NEXT: ] + +# RAW: Contents of section .text: +# RAW-NEXT: 120000210 01000000 00000000 e08d0000 00000000 +# ^ +# S - GP = 0x120000210 - 0x120008ff0 = -36320 +# S - A = 0 - (-36320) = 36320 +# (AHL + S + 0x8000) >> 16 = 1 +# ^ +# S - GP = 0x120000210 - 0x120008ff0 = -36320 +# S - A = 0 - (-36320) = 36320 +# AHL + S = 0x8DE0 +# RAW-NEXT: 120000220 20800000 38020000 28800000 00000000 +# ^ 0x8020 = -32736 GOT +# ^ (0x120000230 + 8 - page) = 0x238 +# ^ 0x8028 = -32728 +# RAW: Contents of section .pdr: +# RAW-NEXT: 0000 10020020 20020020 + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 8 + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 32 + + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 8 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: LT1 + Type: R_MIPS_GPREL16 + Type2: R_MIPS_SUB + Type3: R_MIPS_HI16 + - Offset: 0x08 + Symbol: LT1 + Type: R_MIPS_GPREL16 + Type2: R_MIPS_SUB + Type3: R_MIPS_LO16 + - Offset: 0x10 + Symbol: .rodata + Type: R_MIPS_GOT_PAGE + Addend: 8 + - Offset: 0x14 + Symbol: .rodata + Type: R_MIPS_GOT_OFST + Addend: 8 + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_CALL16 + + - Name: .pdr + Type: SHT_PROGBITS + AddressAlign: 4 + Size: 8 + + - Name: .rela.pdr + Type: SHT_RELA + Link: .symtab + AddressAlign: 8 + Info: .pdr + Relocations: + - Offset: 0x00 + Symbol: LT1 + Type: R_MIPS_32 + - Offset: 0x04 + Symbol: T0 + Type: R_MIPS_32 + + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 16 + Size: 16 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .rodata + Type: STT_SECTION + Section: .rodata + - Name: .pdr + Type: STT_SECTION + Section: .pdr + + Global: + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x00 + Size: 0x10 + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0x10 + Size: 0x10 + - Name: T1 +... diff --git a/test/old-elf/Mips/n64-rel-shift.test b/test/old-elf/Mips/n64-rel-shift.test new file mode 100644 index 000000000000..31a780beb998 --- /dev/null +++ b/test/old-elf/Mips/n64-rel-shift.test @@ -0,0 +1,48 @@ +# Check that LLD shift right relocation result after calculation +# each relocations in N64 relocation chain. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-objdump -s %t.so | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9a-f]+}} 00000000 01000000 00000000 00000000 + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 16 + + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 8 + Info: .text + Relocations: + - Offset: 4 + Symbol: T1 + Addend: 8 + Type: R_MIPS_PC19_S2 + Type2: R_MIPS_64 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 8 + - Name: bar + Type: STT_FUNC + Section: .text + Value: 8 + Size: 8 diff --git a/test/old-elf/Mips/opt-emulation.test b/test/old-elf/Mips/opt-emulation.test new file mode 100644 index 000000000000..a48b49bfaa02 --- /dev/null +++ b/test/old-elf/Mips/opt-emulation.test @@ -0,0 +1,43 @@ +# Check MIPS specific arguments of the -m command line option. + +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -m elf32ltsmip -o %t-exe %t-obj +# RUN: llvm-readobj -file-headers %t-exe | FileCheck -check-prefix=LE-O32 %s +# RUN: lld -flavor old-gnu -target mipsel -melf32ltsmip -o %t-exe %t-obj +# RUN: llvm-readobj -file-headers %t-exe | FileCheck -check-prefix=LE-O32 %s + +# LE-O32: Class: 32-bit (0x1) +# LE-O32: DataEncoding: LittleEndian (0x1) +# LE-O32: FileVersion: 1 +# LE-O32: OS/ABI: SystemV (0x0) +# LE-O32: ABIVersion: 1 +# LE-O32: Machine: EM_MIPS (0x8) +# LE-O32: Version: 1 +# LE-O32: Flags [ (0x70001005) +# LE-O32-NEXT: EF_MIPS_ABI_O32 (0x1000) +# LE-O32-NEXT: EF_MIPS_ARCH_32R2 (0x70000000) +# LE-O32-NEXT: EF_MIPS_CPIC (0x4) +# LE-O32-NEXT: EF_MIPS_NOREORDER (0x1) +# LE-O32-NEXT: ] + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0x0 + Size: 4 diff --git a/test/old-elf/Mips/pc23-range.test b/test/old-elf/Mips/pc23-range.test new file mode 100644 index 000000000000..89e9ab7bb73f --- /dev/null +++ b/test/old-elf/Mips/pc23-range.test @@ -0,0 +1,54 @@ +# Check that LLD shows an error if ADDIUPC immediate is out of range. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -o %t.exe %t.o 2>&1 | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}}: reference from __start+4 to T0+4 of type 173 (R_MICROMIPS_PC23_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000080780100" +# ^ PC23: 1 << 2 = 4 => T0 + 4 - 4 = T0 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x4000000 + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: T0 + Type: R_MICROMIPS_PC23_S2 + +Symbols: + Global: + - Name: __start + Section: .text + Type: STT_FUNC + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: TZ + Section: .data + Type: STT_FUNC + Value: 0 + Size: 0x2000000 + - Name: T0 + Section: .data + Type: STT_FUNC + Value: 0x2000000 + Size: 4 diff --git a/test/old-elf/Mips/plt-entry-mixed-1.test b/test/old-elf/Mips/plt-entry-mixed-1.test new file mode 100644 index 000000000000..e05eec4c8109 --- /dev/null +++ b/test/old-elf/Mips/plt-entry-mixed-1.test @@ -0,0 +1,114 @@ +# REQUIRES: mips + +# Conditions: +# a) Object file contains both R_MIPS_26 and microMIPS non-jal relocations. +# b) The R_MIPS_26 relocation handled first. +# Check: +# a) PLT contains the only regular entry. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK-NEXT: .plt: +# CHECK-NEXT: 400170: 40 00 1c 3c lui $gp, 64 +# CHECK-NEXT: 400174: 00 20 99 8f lw $25, 8192($gp) +# CHECK-NEXT: 400178: 00 20 9c 27 addiu $gp, $gp, 8192 +# CHECK-NEXT: 40017c: 23 c0 1c 03 subu $24, $24, $gp +# CHECK-NEXT: 400180: 25 78 e0 03 move $15, $ra +# CHECK-NEXT: 400184: 82 c0 18 00 srl $24, $24, 2 +# CHECK-NEXT: 400188: 09 f8 20 03 jalr $25 +# CHECK-NEXT: 40018c: fe ff 18 27 addiu $24, $24, -2 +# CHECK-NEXT: 400190: 40 00 0f 3c lui $15, 64 +# CHECK-NEXT: 400194: 08 20 f9 8d lw $25, 8200($15) +# CHECK-NEXT: 400198: 08 00 20 03 jr $25 +# CHECK-NEXT: 40019c: 08 20 f8 25 addiu $24, $15, 8200 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000C00000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x8 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-entry-mixed-2.test b/test/old-elf/Mips/plt-entry-mixed-2.test new file mode 100644 index 000000000000..299aa5ce065c --- /dev/null +++ b/test/old-elf/Mips/plt-entry-mixed-2.test @@ -0,0 +1,93 @@ +# REQUIRES: mips + +# Conditions: +# a) Object file contains both R_MIPS_26 and R_MICROMIPS_26_S1 relocations. +# Check: +# a) PLT contains both regular and compressed PLT entries + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# FIXME (simon): Check the disassembler output when llvm-objdump starts +# to support microMIPS instruction encoding. + +# CHECK: Contents of section .plt: +# CHECK-NEXT: 400170 40001c3c 0020998f 00209c27 23c01c03 +# CHECK-NEXT: 400180 2578e003 82c01800 09f82003 feff1827 +# CHECK-NEXT: 400190 40000f3c 0820f98d 08002003 0820f825 +# CHECK-NEXT: 4001a0 00799a07 22ff0000 9945020f + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000C000000000000000000000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: T2 + Type: R_MIPS_26 + - Offset: 0x8 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 0x8 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 +... diff --git a/test/old-elf/Mips/plt-entry-mixed-3.test b/test/old-elf/Mips/plt-entry-mixed-3.test new file mode 100644 index 000000000000..c946ecc82d2f --- /dev/null +++ b/test/old-elf/Mips/plt-entry-mixed-3.test @@ -0,0 +1,98 @@ +# REQUIRES: mips + +# Conditions: +# a) Object file contains microMIPS instructions. +# b) There is a relocation refers arbitrary symbols and requires a PLT entry. +# Check: +# a) PLT contains a compressed entry. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# FIXME (simon): Check the disassembler output when llvm-objdump starts +# to support microMIPS instruction encoding. + +# CHECK: Contents of section .plt: +# CHECK-NEXT: 400170 8079a407 23ff0000 35052525 0233feff .y..#...5.%%.3.. +# CHECK-NEXT: 400180 ff0df945 830f000c 0079a007 22ff0000 ...E.....y.."... +# CHECK-NEXT: 400190 9945020f .E.. + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 16 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 16 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-entry-mixed-4.test b/test/old-elf/Mips/plt-entry-mixed-4.test new file mode 100644 index 000000000000..ba8b04866b98 --- /dev/null +++ b/test/old-elf/Mips/plt-entry-mixed-4.test @@ -0,0 +1,85 @@ +# REQUIRES: mips + +# Conditions: +# a) Object file contains R_MIPS_26 relocation refers to the microMIPS symbol. +# Check: +# a) PLT contains a regular non-compressed entry. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# FIXME (simon): Check the disassembler output when llvm-objdump starts +# to support microMIPS instruction encoding. + +# CHECK: Contents of section .plt: +# CHECK-NEXT: 400170 40001c3c 0020998f 00209c27 23c01c03 +# CHECK-NEXT: 400180 2578e003 82c01800 09f82003 feff1827 +# CHECK-NEXT: 400190 40000f3c 0820f98d 08002003 0820f825 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000C00000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x8 + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-entry-r6-be.test b/test/old-elf/Mips/plt-entry-r6-be.test new file mode 100644 index 000000000000..3e15ece894e0 --- /dev/null +++ b/test/old-elf/Mips/plt-entry-r6-be.test @@ -0,0 +1,109 @@ +# REQUIRES: mips + +# Check generation of PLT entries in case of R6 big-endian target ABI. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK-NEXT: .plt: +# CHECK-NEXT: 400160: 3c 1c 00 40 lui $gp, 64 +# CHECK-NEXT: 400164: 8f 99 20 00 lw $25, 8192($gp) +# CHECK-NEXT: 400168: 27 9c 20 00 addiu $gp, $gp, 8192 +# CHECK-NEXT: 40016c: 03 1c c0 23 subu $24, $24, $gp +# CHECK-NEXT: 400170: 03 e0 78 25 move $15, $ra +# CHECK-NEXT: 400174: 00 18 c0 82 srl $24, $24, 2 +# CHECK-NEXT: 400178: 03 20 f8 09 jalr $25 +# CHECK-NEXT: 40017c: 27 18 ff fe addiu $24, $24, -2 +# CHECK-NEXT: 400180: 3c 0f 00 40 lui $15, 64 +# CHECK-NEXT: 400184: 8d f9 20 08 lw $25, 8200($15) +# CHECK-NEXT: 400188: 03 20 00 09 jr $25 +# CHECK-NEXT: 40018c: 25 f8 20 08 addiu $24, $15, 8200 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0C00000000000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x8 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-entry-r6.test b/test/old-elf/Mips/plt-entry-r6.test new file mode 100644 index 000000000000..0d8bbf494afe --- /dev/null +++ b/test/old-elf/Mips/plt-entry-r6.test @@ -0,0 +1,109 @@ +# REQUIRES: mips + +# Check generation of PLT entries in case of R6 target ABI. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK-NEXT: .plt: +# CHECK-NEXT: 400160: 40 00 1c 3c lui $gp, 64 +# CHECK-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp) +# CHECK-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192 +# CHECK-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp +# CHECK-NEXT: 400170: 25 78 e0 03 move $15, $ra +# CHECK-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2 +# CHECK-NEXT: 400178: 09 f8 20 03 jalr $25 +# CHECK-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2 +# CHECK-NEXT: 400180: 40 00 0f 3c lui $15, 64 +# CHECK-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15) +# CHECK-NEXT: 400188: 09 00 20 03 jr $25 +# CHECK-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000C00000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x8 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-header-be.test b/test/old-elf/Mips/plt-header-be.test new file mode 100644 index 000000000000..e453e44f76d6 --- /dev/null +++ b/test/old-elf/Mips/plt-header-be.test @@ -0,0 +1,104 @@ +# REQUIRES: mips + +# Check initialization of big-endian .plt header entries. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -section-headers -disassemble %t.exe | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK-NEXT: .plt: +# CHECK-NEXT: 400160: 3c 1c 00 40 lui $gp, 64 +# CHECK-NEXT: 400164: 8f 99 20 00 lw $25, 8192($gp) +# CHECK-NEXT: 400168: 27 9c 20 00 addiu $gp, $gp, 8192 +# CHECK-NEXT: 40016c: 03 1c c0 23 subu $24, $24, $gp +# CHECK-NEXT: 400170: 03 e0 78 25 move $15, $ra +# CHECK-NEXT: 400174: 00 18 c0 82 srl $24, $24, 2 +# CHECK-NEXT: 400178: 03 20 f8 09 jalr $25 +# CHECK-NEXT: 40017c: 27 18 ff fe addiu $24, $24, -2 + +# CHECK-NEXT: 400180: 3c 0f 00 40 lui $15, 64 +# CHECK-NEXT: 400184: 8d f9 20 08 lw $25, 8200($15) +# CHECK-NEXT: 400188: 03 20 00 08 jr $25 +# CHECK-NEXT: 40018c: 25 f8 20 08 addiu $24, $15, 8200 + +# CHECK: Sections: +# CHECK: Idx Name Size Address Type +# CHECK: 6 .plt 00000030 0000000000400160 TEXT DATA +# CHECK: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 12 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 32 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 8 + Symbol: .text + Type: R_MIPS_26 + - Offset: 16 + Symbol: __start + Type: R_MIPS_26 + - Offset: 24 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 16 + - Name: .text + Type: STT_SECTION + Section: .text + + Global: + - Name: __start + Section: .text + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-header-micro-be.test b/test/old-elf/Mips/plt-header-micro-be.test new file mode 100644 index 000000000000..e9aa51ef85eb --- /dev/null +++ b/test/old-elf/Mips/plt-header-micro-be.test @@ -0,0 +1,105 @@ +# REQUIRES: mips + +# Check initialization of .plt header entries +# if all PLT entries use microMIPS big-endian encoding. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t2.o %t.so +# RUN: llvm-objdump -section-headers -d -mattr=micromips %t.exe | FileCheck %s + +# CHECK: Disassembly of section .plt: +# CHECK-NEXT: .plt: +# CHECK-NEXT: 400170: 79 80 07 a4 addiupc $3, 7824 +# CHECK-NEXT: 400174: ff 23 00 00 lw $25, 0($3) +# CHECK-NEXT: 400178: 05 35 subu16 $2, $2, $3 +# CHECK-NEXT: 40017a: 25 25 srl16 $2, $2, 2 +# CHECK-NEXT: 40017c: 33 02 ff fe addiu $24, $2, -2 +# CHECK-NEXT: 400180: 0d ff move $15, $ra +# CHECK-NEXT: 400182: 45 f9 jalrs16 $25 +# CHECK-NEXT: 400184: 0f 83 move $gp, $3 +# CHECK-NEXT: 400186: 0c 00 nop + +# CHECK-NEXT: 400188: 79 00 07 a0 addiupc $2, 7808 +# CHECK-NEXT: 40018c: ff 22 00 00 lw $25, 0($2) +# CHECK-NEXT: 400190: 45 99 jr16 $25 +# CHECK-NEXT: 400192: 0f 02 move $24, $2 + +# CHECK: Sections: +# CHECK: Idx Name Size Address Type +# CHECK: 6 .plt 00000024 0000000000400170 TEXT DATA +# CHECK: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 12 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '0000000000000000f40000000000000000000000f400000000000000f4000000' +# jal .text jal __start jal T1 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 8 + Symbol: .text + Type: R_MICROMIPS_26_S1 + - Offset: 20 + Symbol: __start + Type: R_MICROMIPS_26_S1 + - Offset: 28 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 16 + Other: [ STO_MIPS_MICROMIPS ] + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: __start + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-header-micro.test b/test/old-elf/Mips/plt-header-micro.test new file mode 100644 index 000000000000..743c4c332184 --- /dev/null +++ b/test/old-elf/Mips/plt-header-micro.test @@ -0,0 +1,108 @@ +# REQUIRES: mips + +# Check initialization of .plt header entries +# if all PLT entries use microMIPS encoding. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s +# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s + +# DIS: Disassembly of section .plt: +# DIS-NEXT: .plt: +# DIS-NEXT: 400170: 80 79 a4 07 addiupc $3, 7824 +# DIS-NEXT: 400174: 23 ff 00 00 lw $25, 0($3) +# DIS-NEXT: 400178: 35 05 subu16 $2, $2, $3 +# DIS-NEXT: 40017a: 25 25 srl16 $2, $2, 2 +# DIS-NEXT: 40017c: 02 33 fe ff addiu $24, $2, -2 +# DIS-NEXT: 400180: ff 0d move $15, $ra +# DIS-NEXT: 400182: f9 45 jalrs16 $25 +# DIS-NEXT: 400184: 83 0f move $gp, $3 +# DIS-NEXT: 400186: 00 0c nop + +# DIS-NEXT: 400188: 00 79 a0 07 addiupc $2, 7808 +# DIS-NEXT: 40018c: 22 ff 00 00 lw $25, 0($2) +# DIS-NEXT: 400190: 99 45 jr16 $25 +# DIS-NEXT: 400192: 02 0f move $24, $2 + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .plt 00000024 0000000000400170 TEXT DATA +# EXE: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '000000000000000000f4000000000000f400000000000000f400000000000000' +# jal .text jal glob jal T1 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: .text + Type: R_MICROMIPS_26_S1 + - Offset: 0x10 + Symbol: glob + Type: R_MICROMIPS_26_S1 + - Offset: 0x18 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + Other: [ STO_MIPS_MICROMIPS ] + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-header-mixed.test b/test/old-elf/Mips/plt-header-mixed.test new file mode 100644 index 000000000000..456f5a91c98b --- /dev/null +++ b/test/old-elf/Mips/plt-header-mixed.test @@ -0,0 +1,105 @@ +# REQUIRES: mips + +# Check initialization of .plt header entries if there are both regular +# and microMIPS encoded PLT entries. Check that R_MIPS_26 and R_MICROMIPS_26_S1 +# relocation with the same target cause generation of two distinct PLT entries. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e globR -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d %t.exe | FileCheck -check-prefix=DIS %s +# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s + +# DIS: Disassembly of section .plt: +# DIS-NEXT: .plt: +# DIS-NEXT: 400170: 40 00 1c 3c lui $gp, 64 +# DIS-NEXT: 400174: 00 20 99 8f lw $25, 8192($gp) +# DIS-NEXT: 400178: 00 20 9c 27 addiu $gp, $gp, 8192 +# DIS-NEXT: 40017c: 23 c0 1c 03 subu $24, $24, $gp +# DIS-NEXT: 400180: 25 78 e0 03 move $15, $ra +# DIS-NEXT: 400184: 82 c0 18 00 srl $24, $24, 2 +# DIS-NEXT: 400188: 09 f8 20 03 jalr $25 +# DIS-NEXT: 40018c: fe ff 18 27 addiu $24, $24, -2 + +# DIS-NEXT: 400190: 40 00 0f 3c lui $15, 64 +# DIS-NEXT: 400194: 08 20 f9 8d lw $25, 8200($15) +# DIS-NEXT: 400198: 08 00 20 03 jr $25 +# DIS-NEXT: 40019c: 08 20 f8 25 addiu $24, $15, 8200 + +# FIXME (simon): Check micromips PLT entry +# DIS-NEXT: 4001a8: 99 45 02 0f jal 201922148 + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .plt 0000003c 0000000000400170 TEXT DATA +# EXE: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x8 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 0x4 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Global: + - Name: globR + Section: .text + Value: 0x0 + Size: 0x4 + - Name: globM + Section: .text + Value: 0x4 + Size: 0x4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 +... diff --git a/test/old-elf/Mips/plt-header.test b/test/old-elf/Mips/plt-header.test new file mode 100644 index 000000000000..6d303254d16d --- /dev/null +++ b/test/old-elf/Mips/plt-header.test @@ -0,0 +1,99 @@ +# REQUIRES: mips + +# Check initialization of .plt header entries. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -section-headers -disassemble %t.exe | \ +# RUN: FileCheck -check-prefix=EXE %s + +# EXE: Disassembly of section .plt: +# EXE: .plt: +# PLT0 entry. Points to the .got.plt[0] +# EXE-NEXT: 400160: 40 00 1c 3c lui $gp, 64 +# EXE-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp) +# EXE-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192 +# EXE-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp +# EXE-NEXT: 400170: 25 78 e0 03 move $15, $ra +# EXE-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2 +# EXE-NEXT: 400178: 09 f8 20 03 jalr $25 +# EXE-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2 + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .plt 00000030 0000000000400160 TEXT DATA +# EXE: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x20 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: .text + Type: R_MIPS_26 + - Offset: 0x10 + Symbol: glob + Type: R_MIPS_26 + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + - Name: T1 +... diff --git a/test/old-elf/Mips/r26-1-micro.test b/test/old-elf/Mips/r26-1-micro.test new file mode 100644 index 000000000000..c59b5aa61a53 --- /dev/null +++ b/test/old-elf/Mips/r26-1-micro.test @@ -0,0 +1,131 @@ +# REQUIRES: mips + +# Check handling of R_MICROMIPS_26_S1 relocation. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: llvm-readobj -relocations %t-o.o | \ +# RUN: FileCheck -check-prefix=OBJ-REL %s +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -relocations %t.exe | FileCheck -check-prefix=EXE-REL %s +# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s +# RUN: llvm-objdump -s -d -mattr=micromips %t.exe | \ +# RUN: FileCheck -check-prefix=DIS %s + +# Object file has three R_MICROMIPS_26_S1 relocations +# OBJ-REL: Relocations [ +# OBJ-REL-NEXT: Section (2) .rel.text { +# OBJ-REL-NEXT: 0x8 R_MICROMIPS_26_S1 loc 0x0 +# OBJ-REL-NEXT: 0x10 R_MICROMIPS_26_S1 glob 0x0 +# OBJ-REL-NEXT: 0x18 R_MICROMIPS_26_S1 T1 0x0 +# OBJ-REL-NEXT: } +# OBJ-REL-NEXT: ] + +# Executable file has the only relocation for external symbol +# EXE-REL: Relocations [ +# EXE-REL-NEXT: Section (5) .rel.plt { +# EXE-REL-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0 +# EXE-REL-NEXT: } +# EXE-REL-NEXT: ] + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .plt 00000024 0000000000400160 TEXT DATA +# EXE: 10 .got.plt 0000000c 0000000000402000 DATA + +# DIS: Disassembly of section .plt: +# DIS-NEXT: .plt: +# DIS-NEXT: 400160: 80 79 a8 07 addiupc $3, 7840 +# DIS-NEXT: 400164: 23 ff 00 00 lw $25, 0($3) +# DIS-NEXT: 400168: 35 05 subu16 $2, $2, $3 +# DIS-NEXT: 40016a: 25 25 srl16 $2, $2, 2 +# DIS-NEXT: 40016c: 02 33 fe ff addiu $24, $2, -2 +# DIS-NEXT: 400170: ff 0d move $15, $ra +# DIS-NEXT: 400172: f9 45 jalrs16 $25 +# DIS-NEXT: 400174: 83 0f move $gp, $3 +# DIS-NEXT: 400176: 00 0c nop + +# DIS-NEXT: 400178: 00 79 a4 07 addiupc $2, 7824 +# DIS-NEXT: 40017c: 22 ff 00 00 lw $25, 0($2) +# DIS-NEXT: 400180: 99 45 jr16 $25 +# DIS-NEXT: 400182: 02 0f move $24, $2 + +# DIS: Contents of section .text: +# DIS-NEXT: 400184 09f82003 00000000 2400ca0c 00000000 .. .....$....... +# DIS-NEXT: 400194 2000c20c 00000000 2000bc0c 00000000 ....... ....... + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '09F82003000000000400000C000000000000000C000000000000000C00000000' + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: loc + Type: R_MICROMIPS_26_S1 + - Offset: 0x10 + Symbol: glob + Type: R_MICROMIPS_26_S1 + - Offset: 0x18 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + Other: [ STO_MIPS_MICROMIPS ] + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 +... diff --git a/test/old-elf/Mips/r26-1.test b/test/old-elf/Mips/r26-1.test new file mode 100644 index 000000000000..41c58deceedb --- /dev/null +++ b/test/old-elf/Mips/r26-1.test @@ -0,0 +1,132 @@ +# REQUIRES: mips + +# Check handling of R_MIPS_26 relocation. + +# Build shared library +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Build executable +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: llvm-readobj -relocations %t-o.o | \ +# RUN: FileCheck -check-prefix=OBJ-REL %s +# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -section-headers -disassemble %t.exe | \ +# RUN: FileCheck -check-prefix=EXE %s +# RUN: llvm-readobj -relocations %t.exe | FileCheck -check-prefix=EXE-REL %s + +# Object file has three R_MIPS_26 relocations +# OBJ-REL: Relocations [ +# OBJ-REL-NEXT: Section (2) .rel.text { +# OBJ-REL-NEXT: 0x8 R_MIPS_26 .text 0x0 +# OBJ-REL-NEXT: 0x10 R_MIPS_26 glob 0x0 +# OBJ-REL-NEXT: 0x18 R_MIPS_26 T1 0x0 +# OBJ-REL-NEXT: } +# OBJ-REL-NEXT: ] + +# Executable file has the only relocation for external symbol +# EXE-REL: Relocations [ +# EXE-REL-NEXT: Section (5) .rel.plt { +# EXE-REL-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0 +# EXE-REL-NEXT: } +# EXE-REL-NEXT: ] + +# EXE: Disassembly of section .plt: +# EXE: .plt: +# PLTA entry. Points to the .got.plt[1] +# EXE: 400180: 40 00 0f 3c lui $15, 64 +# EXE-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15) +# EXE-NEXT: 400188: 08 00 20 03 jr $25 +# EXE-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200 + +# EXE: Disassembly of section .text: +# EXE: glob: +# EXE-NEXT: 400190: 09 f8 20 03 jalr $25 +# EXE-NEXT: 400194: 00 00 00 00 nop +# +# Jump to 'loc' label address +# EXE-NEXT: 400198: 68 00 10 0c jal 4194720 +# EXE-NEXT: 40019c: 00 00 00 00 nop +# +# EXE: loc: +# Jump to 'glob' label address +# EXE-NEXT: 4001a0: 64 00 10 0c jal 4194704 +# EXE-NEXT: 4001a4: 00 00 00 00 nop +# +# Jump to the first PLT entry (.plt + 32) for T1 entry +# EXE-NEXT: 4001a8: 60 00 10 0c jal 4194688 +# EXE-NEXT: 4001ac: 00 00 00 00 nop + +# EXE: Sections: +# EXE: Idx Name Size Address Type +# EXE: 6 .plt 00000030 0000000000400160 TEXT DATA +# EXE: 10 .got.plt 0000000c 0000000000402000 DATA + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: '09F82003000000000400000C000000000000000C000000000000000C00000000' + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x08 + Symbol: .text + Type: R_MIPS_26 + - Offset: 0x10 + Symbol: glob + Type: R_MIPS_26 + - Offset: 0x18 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Local: + - Name: loc + Section: .text + Value: 0x10 + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: glob + Section: .text + - Name: T1 +... diff --git a/test/old-elf/Mips/r26-2-micro.test b/test/old-elf/Mips/r26-2-micro.test new file mode 100644 index 000000000000..7d4f86e57f70 --- /dev/null +++ b/test/old-elf/Mips/r26-2-micro.test @@ -0,0 +1,31 @@ +# REQUIRES: mips + +# Check reading addendum for R_MICROMIPS_26_S1 relocation. +# RUN: llvm-mc -arch=mipsel -filetype=obj -mattr=micromips -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o +# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: __start: +# CHECK-NEXT: 400180: 10 f0 60 70 jalx 2154688 +# CHECK-NEXT: 400184: 00 00 00 00 nop +# CHECK-NEXT: 400188: 10 f0 68 70 jalx 2154704 +# CHECK-NEXT: 40018c: 00 00 00 00 nop +# CHECK-NEXT: 400190: 10 f0 58 00 jalx 2097328 +# CHECK-NEXT: 400194: 00 00 00 00 nop +# CHECK-NEXT: 400198: 10 f0 62 00 jalx 2097348 +# CHECK-NEXT: 40019c: 00 00 00 00 nop +# +# CHECK: loc: +# CHECK-NEXT: 4001a0: 00 00 00 00 nop + + .text + .globl __start +__start: + jal __start + 0x1C000 + jal loc + 0x1C000 + jal __start + 0x7ffffe2 + jal loc + 0x7ffffea + +loc: + nop diff --git a/test/old-elf/Mips/r26-2.test b/test/old-elf/Mips/r26-2.test new file mode 100644 index 000000000000..b9db959d3ea7 --- /dev/null +++ b/test/old-elf/Mips/r26-2.test @@ -0,0 +1,31 @@ +# REQUIRES: mips + +# Check reading addendum for R_MIPS_26 relocation. +# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: __start: +# CHECK-NEXT: 400180: 60 70 10 0c jal 4309376 +# CHECK-NEXT: 400184: 00 00 00 00 nop +# CHECK-NEXT: 400188: 68 70 10 0c jal 4309408 +# CHECK-NEXT: 40018c: 00 00 00 00 nop +# CHECK-NEXT: 400190: 5f 00 10 0c jal 4194684 +# CHECK-NEXT: 400194: 00 00 00 00 nop +# CHECK-NEXT: 400198: 67 00 10 0c jal 4194716 +# CHECK-NEXT: 40019c: 00 00 00 00 nop +# +# CHECK: loc: +# CHECK-NEXT: 4001a0: 00 00 00 00 nop + + .text + .globl __start +__start: + jal __start + 0x1C000 + jal loc + 0x1C000 + jal __start + (-1) + jal loc + (-1) + +loc: + nop diff --git a/test/old-elf/Mips/reginfo-01.test b/test/old-elf/Mips/reginfo-01.test new file mode 100644 index 000000000000..ee7cd6a5fcee --- /dev/null +++ b/test/old-elf/Mips/reginfo-01.test @@ -0,0 +1,30 @@ +# Check that LLD does not write a .reginfo section if input +# object file does not contain such section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -s %t.so | FileCheck %s + +# CHECK-NOT: Name: .reginfo + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/reginfo-02.test b/test/old-elf/Mips/reginfo-02.test new file mode 100644 index 000000000000..41eac01a11b1 --- /dev/null +++ b/test/old-elf/Mips/reginfo-02.test @@ -0,0 +1,107 @@ +# Check merging input .reginfo sections. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o +# RUN: llvm-readobj -program-headers -s -t -mips-reginfo %t.so | FileCheck %s + +# CHECK: Index: 1 +# CHECK-NEXT: Name: .reginfo (1) +# CHECK-NEXT: Type: SHT_MIPS_REGINFO +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: ] +# CHECK-NEXT: Address: {{[0-9A-F]+}} +# CHECK-NEXT: Offset: {{[0-9A-F]+}} +# CHECK-NEXT: Size: 24 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 0 +# CHECK-NEXT: AddressAlignment: 4 +# CHECK-NEXT: EntrySize: 24 + +# CHECK: Name: _gp +# CHECK-NEXT: 0x8FF0 + +# CHECK: ProgramHeaders [ +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_REGINFO +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 24 +# CHECK-NEXT: MemSize: 24 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 4 +# CHECK-NEXT: } + +# CHECK: MIPS RegInfo { +# CHECK-NEXT: GP: 0x8FF0 +# CHECK-NEXT: General Mask: 0x10000F0 +# CHECK-NEXT: Co-Proc Mask0: 0x20000E0 +# CHECK-NEXT: Co-Proc Mask1: 0x30000D0 +# CHECK-NEXT: Co-Proc Mask2: 0x40000C0 +# CHECK-NEXT: Co-Proc Mask3: 0x50000B0 +# CHECK-NEXT: } + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "F0000000E0000000D0000000C0000000B000000000100000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "000000010000000200000003000000040000000500000100" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/reginfo-03.test b/test/old-elf/Mips/reginfo-03.test new file mode 100644 index 000000000000..edee1440d358 --- /dev/null +++ b/test/old-elf/Mips/reginfo-03.test @@ -0,0 +1,45 @@ +# Check handling a zero-filled input .reginfo section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -t -mips-reginfo %t.so | FileCheck %s + +# CHECK: Name: _gp +# CHECK-NEXT: 0x8FF0 + +# CHECK: MIPS RegInfo { +# CHECK-NEXT: GP: 0x8FF0 +# CHECK-NEXT: General Mask: 0x0 +# CHECK-NEXT: Co-Proc Mask0: 0x0 +# CHECK-NEXT: Co-Proc Mask1: 0x0 +# CHECK-NEXT: Co-Proc Mask2: 0x0 +# CHECK-NEXT: Co-Proc Mask3: 0x0 +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "000000000000000000000000000000000000000000000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/reginfo-04.test b/test/old-elf/Mips/reginfo-04.test new file mode 100644 index 000000000000..bad34e5003f7 --- /dev/null +++ b/test/old-elf/Mips/reginfo-04.test @@ -0,0 +1,81 @@ +# Check that .reginfo sections from shared libraries do not affect +# output .reginfo section content. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.exe.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.so %t.exe.o +# RUN: llvm-readobj -t -mips-reginfo %t.exe | FileCheck %s + +# CHECK: Name: _gp +# CHECK-NEXT: 0x408FF0 + +# CHECK: MIPS RegInfo { +# CHECK-NEXT: GP: 0x408FF0 +# CHECK-NEXT: General Mask: 0x44444444 +# CHECK-NEXT: Co-Proc Mask0: 0x44444444 +# CHECK-NEXT: Co-Proc Mask1: 0x44444444 +# CHECK-NEXT: Co-Proc Mask2: 0x44444444 +# CHECK-NEXT: Co-Proc Mask3: 0x44444444 +# CHECK-NEXT: } + +# t.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "111111111111111111111111111111111111111100100000" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t.exe.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "444444444444444444444444444444444444444400000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/reginfo-05.test b/test/old-elf/Mips/reginfo-05.test new file mode 100644 index 000000000000..9de9fa62149a --- /dev/null +++ b/test/old-elf/Mips/reginfo-05.test @@ -0,0 +1,123 @@ +# Check that .reginfo section gets register usage mask from "used" files only. +# In this test case we take only t2.o from libreginfo.a and should not add +# register usage masks from t1.o to the output .reginfo section. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: llvm-ar q %T/libreginfo.a %t1.o %t2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t3.o -L%T -lreginfo +# RUN: llvm-readobj -t -mips-reginfo %t.exe | FileCheck %s + +# CHECK: Name: _gp +# CHECK-NEXT: 0x408FF0 + +# CHECK: MIPS RegInfo { +# CHECK-NEXT: GP: 0x408FF0 +# CHECK-NEXT: General Mask: 0x66666666 +# CHECK-NEXT: Co-Proc Mask0: 0x66666666 +# CHECK-NEXT: Co-Proc Mask1: 0x66666666 +# CHECK-NEXT: Co-Proc Mask2: 0x66666666 +# CHECK-NEXT: Co-Proc Mask3: 0x66666666 +# CHECK-NEXT: } + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "111111111111111111111111111111111111111100000000" + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "222222222222222222222222222222222222222200000000" + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t3.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T2 + Type: R_MIPS_32 + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "444444444444444444444444444444444444444400000000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 +... diff --git a/test/old-elf/Mips/rel-16-overflow.test b/test/old-elf/Mips/rel-16-overflow.test new file mode 100644 index 000000000000..e2a73f693361 --- /dev/null +++ b/test/old-elf/Mips/rel-16-overflow.test @@ -0,0 +1,45 @@ +# Check R_MIPS_16 relocation overflow handling. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+32767 of type 1 (R_MIPS_16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ff7f00000000000000000000" +# ^ T1 +# ^ T0 A := 0x7fff + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-16.test b/test/old-elf/Mips/rel-16.test new file mode 100644 index 000000000000..24961e8b78ff --- /dev/null +++ b/test/old-elf/Mips/rel-16.test @@ -0,0 +1,51 @@ +# Check handling of R_MIPS_16 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 00f0 f0000000 00000000 00000000 +# ^ V = (T1 - 8) = T0 + +# CHECK: SYMBOL TABLE: +# CHECK: 000000f0 g F .text 00000008 T0 +# CHECK: 000000f8 g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "f8ff00000000000000000000" +# ^ T1 +# ^ T0 A := 0xfff8 = -8 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-32-be.test b/test/old-elf/Mips/rel-32-be.test new file mode 100644 index 000000000000..3eac8a2848f0 --- /dev/null +++ b/test/old-elf/Mips/rel-32-be.test @@ -0,0 +1,60 @@ +# Check handling of R_MIPS_32 relocation in the big-endian case. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 402000 00000000 01402088 01402084 +# ^^ D2 + 0x1000080 = 0x1402088 +# ^^ D1 + 0x1000080 = 0x1402084 +# CHECK: SYMBOL TABLE: +# CHECK: 00402004 g .data 00000004 D1 +# CHECK: 00402008 g .data 00000004 D2 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + AddressAlign: 16 + Flags: [SHF_ALLOC] + Size: 4 + +- Name: .data + Type: SHT_PROGBITS + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + Content: "000000000100008001000080" + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: D2 + Type: R_MIPS_32 + - Offset: 8 + Symbol: D1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0 + Size: 4 + - Name: D1 + Section: .data + Value: 4 + Size: 4 + - Name: D2 + Section: .data + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-32.test b/test/old-elf/Mips/rel-32.test new file mode 100644 index 000000000000..f028d79c8688 --- /dev/null +++ b/test/old-elf/Mips/rel-32.test @@ -0,0 +1,59 @@ +# Check handling of R_MIPS_32 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 402000 00000000 09204080 05204080 ..... @.. @. +# ^^ data2 + 0x80000001 = 0x80402009 +# ^^ data1 + 0x80000001 = 0x80402005 +# CHECK: SYMBOL TABLE: +# CHECK: 00402004 g .data 00000004 data1 +# CHECK: 00402008 g .data 00000004 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC] +- Name: .data + Type: SHT_PROGBITS + Content: "000000000100008001000080" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x4 + Symbol: data2 + Type: R_MIPS_32 + - Offset: 0x8 + Symbol: data1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Value: 0x4 + Size: 4 + - Name: data2 + Section: .data + Value: 0x8 + Size: 4 diff --git a/test/old-elf/Mips/rel-64.test b/test/old-elf/Mips/rel-64.test new file mode 100644 index 000000000000..c97ff991c0c4 --- /dev/null +++ b/test/old-elf/Mips/rel-64.test @@ -0,0 +1,61 @@ +# Check handling of R_MIPS_64 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 120002000 d1010020 01000000 d0010020 01000100 ... ....... .... +# ^^ __start + 1 = 0x1200001d1 +# ^^ __start + 0x1000000000000 +# = 0x10001200001d0 +# CHECK: SYMBOL TABLE: +# CHECK: 00000001200001d0 g .rodata 00000008 __start + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_ALLOC] +- Name: .data + Type: SHT_PROGBITS + Size: 0x10 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: __start + Type: R_MIPS_64 + Addend: 1 + - Offset: 0x8 + Symbol: __start + Type: R_MIPS_64 + Addend: 0x1000000000000 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0x0 + Size: 8 + - Name: data1 + Section: .data + Value: 0x0 + Size: 8 + - Name: data2 + Section: .data + Value: 0x8 + Size: 8 diff --git a/test/old-elf/Mips/rel-call-hilo-01.test b/test/old-elf/Mips/rel-call-hilo-01.test new file mode 100644 index 000000000000..88f2e337d928 --- /dev/null +++ b/test/old-elf/Mips/rel-call-hilo-01.test @@ -0,0 +1,109 @@ +# Check handling of R_MIPS_CALL_HI16 / R_MIPS_CALL_LO16 relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so +# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# RAW: Contents of section .text: +# RAW-NEXT: 0110 00000000 18800000 00000000 1c800000 +# ^ -32744 ^ -32740 +# RAW-NEXT: 0120 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 00000120 l F .text 00000004 T1 + +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x120 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: ] + +# t1.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 20 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_CALL_HI16 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_CALL_LO16 + - Offset: 8 + Symbol: T2 + Type: R_MIPS_CALL_HI16 + - Offset: 12 + Symbol: T2 + Type: R_MIPS_CALL_LO16 + +Symbols: + Local: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 16 + Size: 4 + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 16 + - Name: T2 +... diff --git a/test/old-elf/Mips/rel-call-hilo-micro.test b/test/old-elf/Mips/rel-call-hilo-micro.test new file mode 100644 index 000000000000..0df68def92b3 --- /dev/null +++ b/test/old-elf/Mips/rel-call-hilo-micro.test @@ -0,0 +1,154 @@ +# Check handling of R_MICROMIPS_CALL_HI16 / R_MICROMIPS_CALL_LO16 relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so +# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# RAW: Contents of section .text: +# RAW-NEXT: 0130 00000000 00001880 00000000 00002080 +# ^ -32744 ^ -32736 +# RAW-NEXT: 0140 00000000 00001c80 00000000 00002480 +# ^ -32740 ^ -32732 +# RAW-NEXT: 0150 00000000 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 00000140 l F .text 00000014 T1 +# RAW: 00000154 l F .text 00000004 M1 + +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x140 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x155 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: M2@ (7) +# GOT-NEXT: } +# GOT-NEXT: ] + +# t1.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: M2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# t2.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 40 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_CALL_HI16 + - Offset: 4 + Symbol: T1 + Type: R_MICROMIPS_CALL_LO16 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_CALL_HI16 + - Offset: 12 + Symbol: T2 + Type: R_MICROMIPS_CALL_LO16 + - Offset: 16 + Symbol: M1 + Type: R_MICROMIPS_CALL_HI16 + - Offset: 20 + Symbol: M1 + Type: R_MICROMIPS_CALL_LO16 + - Offset: 24 + Symbol: M2 + Type: R_MICROMIPS_CALL_HI16 + - Offset: 28 + Symbol: M2 + Type: R_MICROMIPS_CALL_LO16 + +Symbols: + Local: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 16 + Size: 4 + - Name: M1 + Section: .text + Type: STT_FUNC + Value: 36 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 16 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 + - Name: M2 +... diff --git a/test/old-elf/Mips/rel-copy-micro.test b/test/old-elf/Mips/rel-copy-micro.test new file mode 100644 index 000000000000..ba47c84a2c5c --- /dev/null +++ b/test/old-elf/Mips/rel-copy-micro.test @@ -0,0 +1,159 @@ +# Check R_MIPS_COPY relocation emitting +# when linking non-shared executable file. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so1.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-so2.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-so2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t1.so %t2.so +# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x402010 R_MIPS_COPY D1 0x0 +# CHECK-NEXT: 0x402018 R_MIPS_COPY D2 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (1) +# CHECK-NEXT: Value: 0x402010 +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (4) +# CHECK-NEXT: Value: 0x402018 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSection [ ({{.*}} entries) +# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-micro.test.tmp1.so) +# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-micro.test.tmp2.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +# so1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + +# so2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .data + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: D1 + Type: R_MICROMIPS_LO16 + - Offset: 0x08 + Symbol: D2 + Type: R_MICROMIPS_HI16 + - Offset: 0x08 + Symbol: D2 + Type: R_MICROMIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 +... diff --git a/test/old-elf/Mips/rel-copy-pc.test b/test/old-elf/Mips/rel-copy-pc.test new file mode 100644 index 000000000000..cf723f53719c --- /dev/null +++ b/test/old-elf/Mips/rel-copy-pc.test @@ -0,0 +1,113 @@ +# Check R_MIPS_COPY relocation emitting caused by R_MIPS_PCHI16 / R_MIPS_PCLO16 +# relocations when linking non-shared executable file. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x402008 R_MIPS_COPY D1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (1) +# CHECK-NEXT: Value: 0x402008 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSection [ ({{.*}} entries) +# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-pc.test.tmp.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .data + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_PCHI16 + - Offset: 0 + Symbol: D1 + Type: R_MIPS_PCLO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 + - Name: D1 +... diff --git a/test/old-elf/Mips/rel-copy.test b/test/old-elf/Mips/rel-copy.test new file mode 100644 index 000000000000..751034dcd728 --- /dev/null +++ b/test/old-elf/Mips/rel-copy.test @@ -0,0 +1,177 @@ +# Check R_MIPS_COPY relocation emitting +# when linking non-shared executable file. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so1.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-so2.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-so2.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t1.so %t2.so +# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x402004 R_MIPS_REL32 D2 0x0 +# CHECK-NEXT: 0x402010 R_MIPS_COPY D1 0x0 +# CHECK-NEXT: 0x402018 R_MIPS_COPY D3 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (1) +# CHECK-NEXT: Value: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D3@ (4) +# CHECK-NEXT: Value: 0x{{[0-9A-F]+}} +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSection [ ({{.*}} entries) +# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy.test.tmp1.so) +# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy.test.tmp2.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: ] + +# so1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# so2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .data + Type: SHT_PROGBITS + Size: 0x04 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: D3 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + - Offset: 0x08 + Symbol: D3 + Type: R_MIPS_HI16 + - Offset: 0x08 + Symbol: D3 + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D3 +... diff --git a/test/old-elf/Mips/rel-dynamic-01-micro.test b/test/old-elf/Mips/rel-dynamic-01-micro.test new file mode 100644 index 000000000000..56dd7dfdeccd --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-01-micro.test @@ -0,0 +1,201 @@ +# REQUIRES: mips + +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# Check: +# a) Emitting R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations. +# b) PLT entries creation. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# DIS: Disassembly of section .plt: +# DIS-NEXT: .plt: +# DIS-NEXT: 4001b0: 80 79 94 07 addiupc $3, 7760 +# DIS-NEXT: 4001b4: 23 ff 00 00 lw $25, 0($3) +# DIS-NEXT: 4001b8: 35 05 subu16 $2, $2, $3 +# DIS-NEXT: 4001ba: 25 25 srl16 $2, $2, 2 +# DIS-NEXT: 4001bc: 02 33 fe ff addiu $24, $2, -2 +# DIS-NEXT: 4001c0: ff 0d move $15, $ra +# DIS-NEXT: 4001c2: f9 45 jalrs16 $25 +# DIS-NEXT: 4001c4: 83 0f move $gp, $3 +# DIS-NEXT: 4001c6: 00 0c nop + +# DIS-NEXT: 4001c8: 00 79 90 07 addiupc $2, 7744 +# DIS-NEXT: 4001cc: 22 ff 00 00 lw $25, 0($2) +# DIS-NEXT: 4001d0: 99 45 jr16 $25 +# DIS-NEXT: 4001d2: 02 0f move $24, $2 + +# DIS-NEXT: 4001d4: 00 79 8e 07 addiupc $2, 7736 +# DIS-NEXT: 4001d8: 22 ff 00 00 lw $25, 0($2) +# DIS-NEXT: 4001dc: 99 45 jr16 $25 +# DIS-NEXT: 4001de: 02 0f move $24, $2 + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.dyn { +# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Section (6) .rel.plt { +# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0 +# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: D1@ (1) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 8 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Object (0x1) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: .bss +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T1@ (4) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 8 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T3@ (7) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MICROMIPS_26_S1 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_LO16 + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_LO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-dynamic-01.test b/test/old-elf/Mips/rel-dynamic-01.test new file mode 100644 index 000000000000..e24449eeeb58 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-01.test @@ -0,0 +1,261 @@ +# REQUIRES: mips + +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# Check: +# a) Emitting R_MIPS_REL32, R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations. +# b) PLT entries creation. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -disassemble %t.exe | FileCheck -check-prefix=PLT %s +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# PLT: Disassembly of section .plt: +# PLT-NEXT: .plt: +# PLT-NEXT: 4001f0: 40 00 1c 3c lui $gp, 64 +# PLT-NEXT: 4001f4: 00 20 99 8f lw $25, 8192($gp) +# PLT-NEXT: 4001f8: 00 20 9c 27 addiu $gp, $gp, 8192 +# PLT-NEXT: 4001fc: 23 c0 1c 03 subu $24, $24, $gp +# PLT-NEXT: 400200: 25 78 e0 03 move $15, $ra +# PLT-NEXT: 400204: 82 c0 18 00 srl $24, $24, 2 +# PLT-NEXT: 400208: 09 f8 20 03 jalr $25 +# PLT-NEXT: 40020c: fe ff 18 27 addiu $24, $24, -2 +# +# PLT-NEXT: 400210: 40 00 0f 3c lui $15, 64 +# PLT-NEXT: 400214: 08 20 f9 8d lw $25, 8200($15) +# PLT-NEXT: 400218: 08 00 20 03 jr $25 +# PLT-NEXT: 40021c: 08 20 f8 25 addiu $24, $15, 8200 +# +# PLT-NEXT: 400220: 40 00 0f 3c lui $15, 64 +# PLT-NEXT: 400224: 0c 20 f9 8d lw $25, 8204($15) +# PLT-NEXT: 400228: 08 00 20 03 jr $25 +# PLT-NEXT: 40022c: 0c 20 f8 25 addiu $24, $15, 8204 + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.dyn { +# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 T2 0x0 +# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 D2 0x0 +# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Section (6) .rel.plt { +# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0 +# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: D1@ (1) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 4 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Object (0x1) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: .bss +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T1@ (4) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 8 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T3@ (10) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T2@ (7) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: D2@ (13) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 4 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Object (0x1) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x{{[0-9A-F]+}} +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (7) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x{{[0-9A-F]+}} +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (13) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-dynamic-02.test b/test/old-elf/Mips/rel-dynamic-02.test new file mode 100644 index 000000000000..24b7c624c6a0 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-02.test @@ -0,0 +1,101 @@ +# Conditions: +# a) Linking a shared library. +# b) Relocations' targets are undefined symbols. +# Check: +# a) Emitting R_MIPS_REL32 relocations for both undefined symbols. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o +# RUN: llvm-readobj -dt -r -s %t.so | FileCheck %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) +# +# CHECK: Relocations [ +# CHECK-NEXT: Section (4) .rel.dyn { +# CHECK-NEXT: 0x[[ADDR1:[0-9A-Z]+]] R_MIPS_REL32 T1 0x0 +# CHECK-NEXT: 0x[[ADDR2:[0-9A-Z]+]] R_MIPS_REL32 T1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] +# +# CHECK: Symbol { +# CHECK: Name: T0@ +# CHECK-NEXT: Value: 0x[[ADDR1]] +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK: Symbol { +# CHECK: Name: D0@ +# CHECK-NEXT: Value: 0x[[ADDR2]] +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Object +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: } +# CHECK: Symbol { +# CHECK: Name: T1@ +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 8 diff --git a/test/old-elf/Mips/rel-dynamic-03-micro.test b/test/old-elf/Mips/rel-dynamic-03-micro.test new file mode 100644 index 000000000000..891649d8cdbc --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-03-micro.test @@ -0,0 +1,133 @@ +# REQUIRES: mips + +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' target is a symbol defined in the shared object. +# c) The target symbol is referenced by both branch (R_MICROMIPS_26_S1) +# and regular (R_MIPS_32) relocations. +# Check: +# a) There should be no R_MIPS_REL32 relocation. +# b) Linker creates a single PLT entry. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# DIS: Disassembly of section .plt: +# DIS-NEXT: .plt: +# DIS-NEXT: 400170: 80 79 a4 07 addiupc $3, 7824 +# DIS-NEXT: 400174: 23 ff 00 00 lw $25, 0($3) +# DIS-NEXT: 400178: 35 05 subu16 $2, $2, $3 +# DIS-NEXT: 40017a: 25 25 srl16 $2, $2, 2 +# DIS-NEXT: 40017c: 02 33 fe ff addiu $24, $2, -2 +# DIS-NEXT: 400180: ff 0d move $15, $ra +# DIS-NEXT: 400182: f9 45 jalrs16 $25 +# DIS-NEXT: 400184: 83 0f move $gp, $3 +# DIS-NEXT: 400186: 00 0c nop + +# DIS-NEXT: 400188: 00 79 a0 07 addiupc $2, 7808 +# DIS-NEXT: 40018c: 22 ff 00 00 lw $25, 0($2) +# DIS-NEXT: 400190: 99 45 jr16 $25 +# DIS-NEXT: 400192: 02 0f move $24, $2 + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.plt { +# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# PLT-SYM: Name: T1@ (1) +# PLT-SYM-NEXT: Value: 0x400189 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 8 +# PLT-SYM-NEXT: Section: Undefined (0x0) + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T1 + Type: R_MICROMIPS_26_S1 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 +... diff --git a/test/old-elf/Mips/rel-dynamic-03.test b/test/old-elf/Mips/rel-dynamic-03.test new file mode 100644 index 000000000000..2552473ca80f --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-03.test @@ -0,0 +1,129 @@ +# REQUIRES: mips + +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' target is a symbol defined in the shared object. +# c) The target symbol is referenced by both branch (R_MIPS_26) +# and regular (R_MIPS_32) relocations. +# Check: +# a) There should be no R_MIPS_REL32 relocation. +# b) Linker creates a single PLT entry. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -disassemble %t.exe | FileCheck -check-prefix=PLT %s +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT: Disassembly of section .plt: +# PLT-NEXT: .plt: +# PLT-NEXT: 400160: 40 00 1c 3c lui $gp, 64 +# PLT-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp) +# PLT-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192 +# PLT-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp +# PLT-NEXT: 400170: 25 78 e0 03 move $15, $ra +# PLT-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2 +# PLT-NEXT: 400178: 09 f8 20 03 jalr $25 +# PLT-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2 +# +# PLT-NEXT: 400180: 40 00 0f 3c lui $15, 64 +# PLT-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15) +# PLT-NEXT: 400188: 08 00 20 03 jr $25 +# PLT-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200 +# +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.plt { +# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# PLT-SYM: Name: T1@ (1) +# PLT-SYM-NEXT: Value: 0x400180 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 8 +# PLT-SYM-NEXT: Section: Undefined (0x0) + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T1 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 +... diff --git a/test/old-elf/Mips/rel-dynamic-04-micro.test b/test/old-elf/Mips/rel-dynamic-04-micro.test new file mode 100644 index 000000000000..de1131c67f43 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-04-micro.test @@ -0,0 +1,226 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# c) Relocations modify a writable section. +# d) The first symbol is referenced by R_MIPS32 relocation only +# e) The second symbol is referenced by R_MIPS_32 +# and R_MICROMIPS_26_S1 relocations. +# f) The third symbol is referenced by R_MICROMIPS_26_S1 +# and R_MIPS_32 relocations. +# Check: +# a) There should be the only R_MIPS_REL32 relocation. +# b) Linker creates a couple of PLT entry for both symbols referenced +# by the R_MICROMIPS_26_S1 branch relocation. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# PLT: Section { +# PLT: Index: 5 +# PLT-NEXT: Name: .rel.dyn (31) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4010A0 +# PLT-NEXT: Offset: 0x10A0 +# PLT-NEXT: Size: 8 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 6 +# PLT-NEXT: Name: .rel.plt (40) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4010A8 +# PLT-NEXT: Offset: 0x10A8 +# PLT-NEXT: Size: 16 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 7 +# PLT-NEXT: Name: .plt (49) +# PLT-NEXT: Type: SHT_PROGBITS (0x1) +# PLT-NEXT: Flags [ (0x6) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: SHF_EXECINSTR (0x4) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4010C0 +# PLT-NEXT: Offset: 0x10C0 +# PLT-NEXT: Size: 48 +# PLT-NEXT: Link: 0 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 16 +# PLT-NEXT: EntrySize: 0 +# PLT-NEXT: } + +# PLT: Relocations [ +# PLT-NEXT: Section (5) .rel.dyn { +# PLT-NEXT: 0x400120 R_MIPS_REL32 T1 0x0 +# PLT-NEXT: } +# PLT-NEXT: Section (6) .rel.plt { +# PLT-NEXT: 0x403008 R_MIPS_JUMP_SLOT T2 0x0 +# PLT-NEXT: 0x40300C R_MIPS_JUMP_SLOT T3 0x0 +# PLT-NEXT: } +# PLT-NEXT: ] + +# PLT: DynamicSymbols [ +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: @ (0) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Local (0x0) +# PLT-NEXT: Type: None (0x0) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T2@ (4) +# PLT-NEXT: Value: 0x4010D9 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T3@ (7) +# PLT-NEXT: Value: 0x4010E5 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T1@ (1) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x402008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x14 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + # There is no branch relocation for T1. + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ... + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + # ... but R_MICROMIPS_26_S1 creates PLT entry + # and makes R_MIPS_REL32 redundant. + - Offset: 0x08 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + # Create PLT entry for T3 symbol. + - Offset: 0x0c + Symbol: T3 + Type: R_MICROMIPS_26_S1 + # Take in account existing PLT entry and do not create R_MIPS_REL32. + - Offset: 0x10 + Symbol: T3 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x14 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC +... diff --git a/test/old-elf/Mips/rel-dynamic-04.test b/test/old-elf/Mips/rel-dynamic-04.test new file mode 100644 index 000000000000..df8c676af330 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-04.test @@ -0,0 +1,221 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# c) Relocations modify a writable section. +# d) The first symbol is referenced by R_MIPS32 relocation only +# e) The second symbol is referenced by R_MIPS_32 and R_MIPS26 relocations. +# f) The third symbol is referenced by R_MIPS26 and R_MIPS_32 relocations. +# Check: +# a) There should be the only R_MIPS_REL32 relocation. +# b) Linker creates a couple of PLT entry for both symbols referenced +# by the R_MIPS_26 branch relocation. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# PLT: Section { +# PLT: Index: 5 +# PLT-NEXT: Name: .rel.dyn (31) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x40109C +# PLT-NEXT: Offset: 0x109C +# PLT-NEXT: Size: 8 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 6 +# PLT-NEXT: Name: .rel.plt (40) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4010A4 +# PLT-NEXT: Offset: 0x10A4 +# PLT-NEXT: Size: 16 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 7 +# PLT-NEXT: Name: .plt (49) +# PLT-NEXT: Type: SHT_PROGBITS (0x1) +# PLT-NEXT: Flags [ (0x6) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: SHF_EXECINSTR (0x4) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4010C0 +# PLT-NEXT: Offset: 0x10C0 +# PLT-NEXT: Size: 64 +# PLT-NEXT: Link: 0 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 16 +# PLT-NEXT: EntrySize: 0 +# PLT-NEXT: } + +# PLT: Relocations [ +# PLT-NEXT: Section (5) .rel.dyn { +# PLT-NEXT: 0x400120 R_MIPS_REL32 T1 0x0 +# PLT-NEXT: } +# PLT-NEXT: Section (6) .rel.plt { +# PLT-NEXT: 0x403008 R_MIPS_JUMP_SLOT T2 0x0 +# PLT-NEXT: 0x40300C R_MIPS_JUMP_SLOT T3 0x0 +# PLT-NEXT: } +# PLT-NEXT: ] + +# PLT: DynamicSymbols [ +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: @ (0) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Local (0x0) +# PLT-NEXT: Type: None (0x0) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T2@ (4) +# PLT-NEXT: Value: 0x4010E0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T3@ (7) +# PLT-NEXT: Value: 0x4010F0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T1@ (1) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x402008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + # There is no branch relocation for T1. + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ... + - Offset: 0x00 + Symbol: T2 + Type: R_MIPS_32 + # ... but R_MIPS_26 creates PLT entry and makes R_MIPS_REL32 redundant. + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_26 + # Create PLT entry for T3 symbol. + - Offset: 0x00 + Symbol: T3 + Type: R_MIPS_26 + # Take in account existing PLT entry and do not create R_MIPS_REL32. + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC +... diff --git a/test/old-elf/Mips/rel-dynamic-05-micro.test b/test/old-elf/Mips/rel-dynamic-05-micro.test new file mode 100644 index 000000000000..16c6a9c6aad5 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-05-micro.test @@ -0,0 +1,192 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# c) Relocations modify a read-only section. +# d) The first symbol is referenced by R_MIPS32 relocation only +# e) The second symbol is referenced by R_MIPS_32 +# and R_MICROMIPS_26_S1 relocations. +# f) The third symbol is referenced by R_MICROMIPS_26_S1 +# and R_MIPS_32 relocations. +# Check: +# a) There should be no R_MIPS_REL32 relocations. +# b) Linker creates PLT entries for all three relocations. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s + +# PLT: Section { +# PLT: Index: 5 +# PLT-NEXT: Name: .rel.plt (31) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x400194 +# PLT-NEXT: Offset: 0x194 +# PLT-NEXT: Size: 24 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 6 +# PLT-NEXT: Name: .plt (40) +# PLT-NEXT: Type: SHT_PROGBITS (0x1) +# PLT-NEXT: Flags [ (0x6) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: SHF_EXECINSTR (0x4) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x4001B0 +# PLT-NEXT: Offset: 0x1B0 +# PLT-NEXT: Size: 60 +# PLT-NEXT: Link: 0 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 16 +# PLT-NEXT: EntrySize: 0 +# PLT-NEXT: } + +# PLT: Relocations [ +# PLT-NEXT: Section (5) .rel.plt { +# PLT-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0 +# PLT-NEXT: 0x40200C R_MIPS_JUMP_SLOT T2 0x0 +# PLT-NEXT: 0x402010 R_MIPS_JUMP_SLOT T3 0x0 +# PLT-NEXT: } +# PLT-NEXT: ] + +# PLT: DynamicSymbols [ +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: @ (0) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Local (0x0) +# PLT-NEXT: Type: None (0x0) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T1@ (1) +# PLT-NEXT: Value: 0x4001C9 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T2@ (4) +# PLT-NEXT: Value: 0x4001D5 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T3@ (7) +# PLT-NEXT: Value: 0x4001E1 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x14 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + # There is no branch relocation for T1. + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ... + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + # ... but R_MICROMIPS_26_S1 creates PLT entry and makes R_MIPS_REL32 redundant. + - Offset: 0x08 + Symbol: T2 + Type: R_MICROMIPS_26_S1 + # Create PLT entry for T3 symbol. + - Offset: 0x0C + Symbol: T3 + Type: R_MICROMIPS_26_S1 + # Take in account existing PLT entry and do not create R_MIPS_REL32. + - Offset: 0x10 + Symbol: T3 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 0x14 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC +... diff --git a/test/old-elf/Mips/rel-dynamic-05.test b/test/old-elf/Mips/rel-dynamic-05.test new file mode 100644 index 000000000000..8348bc511fbd --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-05.test @@ -0,0 +1,188 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# c) Relocations modify a read-only section. +# d) The first symbol is referenced by R_MIPS32 relocation only +# e) The second symbol is referenced by R_MIPS_32 and R_MIPS26 relocations. +# f) The third symbol is referenced by R_MIPS26 and R_MIPS_32 relocations. +# Check: +# a) There should be no R_MIPS_REL32 relocations. +# b) Linker creates PLT entries for all three relocations. +# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s + +# PLT: Section { +# PLT: Index: 5 +# PLT-NEXT: Name: .rel.plt (31) +# PLT-NEXT: Type: SHT_REL (0x9) +# PLT-NEXT: Flags [ (0x2) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x{{[0-9A-F]+}} +# PLT-NEXT: Offset: 0x{{[0-9A-F]+}} +# PLT-NEXT: Size: 24 +# PLT-NEXT: Link: 3 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 4 +# PLT-NEXT: EntrySize: 8 +# PLT-NEXT: } +# PLT-NEXT: Section { +# PLT-NEXT: Index: 6 +# PLT-NEXT: Name: .plt (40) +# PLT-NEXT: Type: SHT_PROGBITS (0x1) +# PLT-NEXT: Flags [ (0x6) +# PLT-NEXT: SHF_ALLOC (0x2) +# PLT-NEXT: SHF_EXECINSTR (0x4) +# PLT-NEXT: ] +# PLT-NEXT: Address: 0x{{[0-9A-F]+}} +# PLT-NEXT: Offset: 0x{{[0-9A-F]+}} +# PLT-NEXT: Size: 80 +# PLT-NEXT: Link: 0 +# PLT-NEXT: Info: 0 +# PLT-NEXT: AddressAlignment: 16 +# PLT-NEXT: EntrySize: 0 +# PLT-NEXT: } + +# PLT: Relocations [ +# PLT-NEXT: Section (5) .rel.plt { +# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T1 0x0 +# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T2 0x0 +# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T3 0x0 +# PLT-NEXT: } +# PLT-NEXT: ] + +# PLT: DynamicSymbols [ +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: @ (0) +# PLT-NEXT: Value: 0x0 +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Local (0x0) +# PLT-NEXT: Type: None (0x0) +# PLT-NEXT: Other: 0 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T1@ (1) +# PLT-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T2@ (4) +# PLT-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: Symbol { +# PLT-NEXT: Name: T3@ (7) +# PLT-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-NEXT: Size: 0 +# PLT-NEXT: Binding: Global (0x1) +# PLT-NEXT: Type: Function (0x2) +# PLT-NEXT: Other: 8 +# PLT-NEXT: Section: Undefined (0x0) +# PLT-NEXT: } +# PLT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + +# o.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + # There is no branch relocation for T1. + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ... + - Offset: 0x00 + Symbol: T2 + Type: R_MIPS_32 + # ... but R_MIPS_26 creates PLT entry and makes R_MIPS_REL32 redundant. + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_26 + # Create PLT entry for T3 symbol. + - Offset: 0x00 + Symbol: T3 + Type: R_MIPS_26 + # Take in account existing PLT entry and do not create R_MIPS_REL32. + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC +... diff --git a/test/old-elf/Mips/rel-dynamic-06-64.test b/test/old-elf/Mips/rel-dynamic-06-64.test new file mode 100644 index 000000000000..6b0d28993f94 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-06-64.test @@ -0,0 +1,114 @@ +# Conditions: +# a) Linking a shared library. +# b) The first relocation modifies a regular .text section. +# c) The second relocation modifies a .pdr section without SHF_ALLOC flag. +# Check: +# a) There should be no PLT entries. +# b) Linker creates a single R_MIPS_REL32 relocation. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-readobj -dt -r -s %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-readobj -mips-plt-got %t.so | FileCheck -check-prefix=GOT %s + +# SYM: Sections [ +# SYM: Section { +# SYM-NOT: Name: .plt ({{[0-9]+}}) + +# SYM: Relocations [ +# SYM-NEXT: Section (4) .rel.dyn { +# SYM-NEXT: 0x[[ADDR:[0-9A-Z]+]] R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T0 0x0 +# SYM-NEXT: } +# SYM-NEXT: ] + +# SYM: Symbol { +# SYM: Name: @ (0) +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Local (0x0) +# SYM-NEXT: Type: None (0x0) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Undefined (0x0) +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T1@ (4) +# SYM-NEXT: Value: 0x174 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T0@ (1) +# SYM-NEXT: Value: 0x[[ADDR]] +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) +# SYM-NEXT: } + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x170 +# GOT-NEXT: Value: 0x170 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: .text (0x5) +# GOT-NEXT: Name: T0@ (1) +# GOT-NEXT: } +# GOT-NEXT: ] + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_RELA + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MIPS_64 + +- Name: .pdr + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + +- Name: .rel.pdr + Type: SHT_RELA + Info: .pdr + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_64 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/rel-dynamic-06.test b/test/old-elf/Mips/rel-dynamic-06.test new file mode 100644 index 000000000000..ead7dfb08ddf --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-06.test @@ -0,0 +1,115 @@ +# Conditions: +# a) Linking a shared library. +# b) The first relocation modifies a regular .text section. +# c) The second relocation modifies a .pdr section without SHF_ALLOC flag. +# Check: +# a) There should be no PLT entries. +# b) Linker creates a single R_MIPS_REL32 relocation. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -dt -r -s %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-readobj -mips-plt-got %t.so | FileCheck -check-prefix=GOT %s + +# SYM: Sections [ +# SYM: Section { +# SYM-NOT: Name: .plt ({{[0-9]+}}) + +# SYM: Relocations [ +# SYM-NEXT: Section (4) .rel.dyn { +# SYM-NEXT: 0x[[ADDR:[0-9A-Z]+]] R_MIPS_REL32 T0 0x0 +# SYM-NEXT: } +# SYM-NEXT: ] + +# SYM: Symbol { +# SYM: Name: @ (0) +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Local (0x0) +# SYM-NEXT: Type: None (0x0) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Undefined (0x0) +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T1@ (4) +# SYM-NEXT: Value: 0x104 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) +# SYM-NEXT: } +# SYM: Symbol { +# SYM: Name: T0@ (1) +# SYM-NEXT: Value: 0x[[ADDR]] +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) +# SYM-NEXT: } + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x100 +# GOT-NEXT: Value: 0x100 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: .text (0x5) +# GOT-NEXT: Name: T0@ (1) +# GOT-NEXT: } +# GOT-NEXT: ] + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MIPS_32 + +- Name: .pdr + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [] + +- Name: .rel.pdr + Type: SHT_REL + Info: .pdr + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/rel-dynamic-07-64.test b/test/old-elf/Mips/rel-dynamic-07-64.test new file mode 100644 index 000000000000..823a66d521e2 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-07-64.test @@ -0,0 +1,348 @@ +# Conditions: +# a) Linking a shared library. +# b) There ars multiple R_MIPS_64 relocations with various targets. +# Check: +# a) Emitting of R_MIPS_REL32 relocations. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t1.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -shared --noinhibit-exec \ +# RUN: -o %t2.so %t-o.o %t1.so +# RUN: llvm-readobj -dt -r -sections %t2.so | FileCheck %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) + +# CHECK: Relocations [ +# CHECK-NEXT: Section (4) .rel.dyn { +# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T0 0x0 +# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T4 0x0 +# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D2 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T2 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D0 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D1 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D4 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE U1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T0@ (1) +# CHECK-NEXT: Value: 0x324 +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x5) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T4@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (25) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ (16) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ (19) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D0@ (4) +# CHECK-NEXT: Value: 0x2004 +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .data (0x8) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (22) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D4@ (10) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: U1@ (13) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x324 +# GOT-NEXT: Value: 0x324 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: .text (0x5) +# GOT-NEXT: Name: T0@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T4@ (7) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (25) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1028 +# GOT-NEXT: Access: -32712 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (16) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1030 +# GOT-NEXT: Access: -32704 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (19) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1038 +# GOT-NEXT: Access: -32696 +# GOT-NEXT: Initial: 0x2004 +# GOT-NEXT: Value: 0x2004 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: .data (0x8) +# GOT-NEXT: Name: D0@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1040 +# GOT-NEXT: Access: -32688 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D1@ (22) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1048 +# GOT-NEXT: Access: -32680 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D4@ (10) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1050 +# GOT-NEXT: Access: -32672 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: U1@ (13) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 # T0 is a defined function + Symbol: T0 + Type: R_MIPS_64 + - Offset: 0x04 # T1 is a function from shared lib + Symbol: T1 + Type: R_MIPS_64 + - Offset: 0x08 # T2 has unknown type and defined in shared lib + Symbol: T2 + Type: R_MIPS_64 + - Offset: 0x00 # T4 is an undefined function + Symbol: T4 + Type: R_MIPS_64 + - Offset: 0x04 # D0 is a defined data object + Symbol: D0 + Type: R_MIPS_64 + - Offset: 0x08 # D1 is a data object from shared lib + Symbol: D1 + Type: R_MIPS_64 + - Offset: 0x00 # D2 has unknown type and defined in shared lib + Symbol: D2 + Type: R_MIPS_64 + - Offset: 0x04 # D4 is an undefined data object + Symbol: D4 + Type: R_MIPS_64 + - Offset: 0x08 # U1 is undefined and has unknown type + Symbol: U1 + Type: R_MIPS_64 + +Symbols: + Local: + - Name: LT0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: LD0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 + + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + - Name: T4 + Type: STT_FUNC + + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D4 + Type: STT_OBJECT + - Name: U1 +... diff --git a/test/old-elf/Mips/rel-dynamic-07.test b/test/old-elf/Mips/rel-dynamic-07.test new file mode 100644 index 000000000000..41c31c66a5f3 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-07.test @@ -0,0 +1,363 @@ +# Conditions: +# a) Linking a shared library. +# b) There ars multiple R_MIPS_32 relocations with various targets. +# Check: +# a) Emitting of R_MIPS_REL32 relocations. +# b) There should be no R_MIPS_REL32 relocations for the _gp_disp symbol. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \ +# RUN: -o %t2.so %t-o.o %t1.so +# RUN: llvm-readobj -dt -r -sections %t2.so | FileCheck %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) + +# CHECK: Relocations [ +# CHECK-NEXT: Section (4) .rel.dyn { +# CHECK-NEXT: 0x2000 R_MIPS_REL32 T0 0x0 +# CHECK-NEXT: 0x2000 R_MIPS_REL32 T4 0x0 +# CHECK-NEXT: 0x2000 R_MIPS_REL32 D2 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32 T1 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32 T2 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32 D0 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32 D1 0x0 +# CHECK-NEXT: 0x2004 R_MIPS_REL32 D4 0x0 +# CHECK-NEXT: 0x2008 R_MIPS_REL32 U1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T0@ (1) +# CHECK-NEXT: Value: 0x214 +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x5) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T4@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (25) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ (16) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ (19) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D0@ (4) +# CHECK-NEXT: Value: 0x2004 +# CHECK-NEXT: Size: 8 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .data (0x8) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (22) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D4@ (10) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: U1@ (13) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x214 +# GOT-NEXT: Value: 0x214 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: .text (0x5) +# GOT-NEXT: Name: T0@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T4@ (7) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (25) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (16) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (19) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x101C +# GOT-NEXT: Access: -32724 +# GOT-NEXT: Initial: 0x2004 +# GOT-NEXT: Value: 0x2004 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: .data (0x8) +# GOT-NEXT: Name: D0@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D1@ (22) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1024 +# GOT-NEXT: Access: -32716 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D4@ (10) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1028 +# GOT-NEXT: Access: -32712 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: None (0x0) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: U1@ (13) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_LO16 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 # T0 is a defined function + Symbol: T0 + Type: R_MIPS_32 + - Offset: 0x04 # T1 is a function from shared lib + Symbol: T1 + Type: R_MIPS_32 + - Offset: 0x08 # T2 has unknown type and defined in shared lib + Symbol: T2 + Type: R_MIPS_32 + - Offset: 0x00 # T4 is an undefined function + Symbol: T4 + Type: R_MIPS_32 + - Offset: 0x04 # D0 is a defined data object + Symbol: D0 + Type: R_MIPS_32 + - Offset: 0x08 # D1 is a data object from shared lib + Symbol: D1 + Type: R_MIPS_32 + - Offset: 0x00 # D2 has unknown type and defined in shared lib + Symbol: D2 + Type: R_MIPS_32 + - Offset: 0x04 # D4 is an undefined data object + Symbol: D4 + Type: R_MIPS_32 + - Offset: 0x08 # U1 is undefined and has unknown type + Symbol: U1 + Type: R_MIPS_32 + +Symbols: + Local: + - Name: LT0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: LD0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + + Global: + - Name: _gp_disp + Type: STT_OBJECT + + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + - Name: T4 + Type: STT_FUNC + + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D4 + Type: STT_OBJECT + - Name: U1 diff --git a/test/old-elf/Mips/rel-dynamic-08-64.test b/test/old-elf/Mips/rel-dynamic-08-64.test new file mode 100644 index 000000000000..019b8e5161a8 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-08-64.test @@ -0,0 +1,275 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) There ars multiple R_MIPS_64/R_MIPS_HI16/R_MIPS_LO16 relocations +# with various targets. +# Check: +# a) Emitting of R_MIPS_REL32 relocations. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 --noinhibit-exec \ +# RUN: -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x120002000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D2 0x0 +# CHECK-NEXT: 0x120002004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0 +# CHECK-NEXT: 0x120002008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T2 0x0 +# CHECK-NEXT: 0x120002008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (10) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ (1) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ (4) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (10) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001018 +# GOT-NEXT: Access: -32728 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001020 +# GOT-NEXT: Access: -32720 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x120001028 +# GOT-NEXT: Access: -32712 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D1@ (7) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_RELA + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_LO16 + +- Name: .rel.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 # LT0 is a locally defined function + Symbol: LT0 + Type: R_MIPS_64 + - Offset: 0x00 # LD0 is a locally defined data object + Symbol: LD0 + Type: R_MIPS_64 + - Offset: 0x00 # T0 is a defined function + Symbol: T0 + Type: R_MIPS_64 + - Offset: 0x04 # T1 is a function from shared lib + Symbol: T1 + Type: R_MIPS_64 + - Offset: 0x08 # T2 has unknown type and defined in shared lib + Symbol: T2 + Type: R_MIPS_64 + - Offset: 0x00 # T4 is an undefined function + Symbol: T4 + Type: R_MIPS_64 + - Offset: 0x04 # D0 is a defined data object + Symbol: D0 + Type: R_MIPS_64 + - Offset: 0x08 # D1 is a data object from shared lib + Symbol: D1 + Type: R_MIPS_64 + - Offset: 0x00 # D2 has unknown type and defined in shared lib + Symbol: D2 + Type: R_MIPS_64 + - Offset: 0x04 # D4 is an undefined data object + Symbol: D4 + Type: R_MIPS_64 + - Offset: 0x08 # U1 is undefined and has unknown type + Symbol: U1 + Type: R_MIPS_64 + +Symbols: + Local: + - Name: LT0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: LD0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 + + Global: + - Name: _gp_disp + Type: STT_OBJECT + + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + - Name: T4 + Type: STT_FUNC + + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D4 + Type: STT_OBJECT + - Name: U1 +... diff --git a/test/old-elf/Mips/rel-dynamic-08-micro.test b/test/old-elf/Mips/rel-dynamic-08-micro.test new file mode 100644 index 000000000000..2d25b504ee28 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-08-micro.test @@ -0,0 +1,278 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) There ars multiple R_MIPS_32/R_MICROMIPS_HI16/R_MICROMIPS_LO16 +# relocations with various targets. +# Check: +# a) Emitting of R_MIPS_REL32 relocations. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 --noinhibit-exec \ +# RUN: -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x402000 R_MIPS_REL32 D2 0x0 +# CHECK-NEXT: 0x402004 R_MIPS_REL32 T1 0x0 +# CHECK-NEXT: 0x402008 R_MIPS_REL32 T2 0x0 +# CHECK-NEXT: 0x402008 R_MIPS_REL32 D1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (10) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ (1) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ (4) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (10) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D1@ (7) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MICROMIPS_LO16 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 # LT0 is a locally defined function + Symbol: LT0 + Type: R_MIPS_32 + - Offset: 0x00 # LD0 is a locally defined data object + Symbol: LD0 + Type: R_MIPS_32 + - Offset: 0x00 # T0 is a defined function + Symbol: T0 + Type: R_MIPS_32 + - Offset: 0x04 # T1 is a function from shared lib + Symbol: T1 + Type: R_MIPS_32 + - Offset: 0x08 # T2 has unknown type and defined in shared lib + Symbol: T2 + Type: R_MIPS_32 + - Offset: 0x00 # T4 is an undefined function + Symbol: T4 + Type: R_MIPS_32 + - Offset: 0x04 # D0 is a defined data object + Symbol: D0 + Type: R_MIPS_32 + - Offset: 0x08 # D1 is a data object from shared lib + Symbol: D1 + Type: R_MIPS_32 + - Offset: 0x00 # D2 has unknown type and defined in shared lib + Symbol: D2 + Type: R_MIPS_32 + - Offset: 0x04 # D4 is an undefined data object + Symbol: D4 + Type: R_MIPS_32 + - Offset: 0x08 # U1 is undefined and has unknown type + Symbol: U1 + Type: R_MIPS_32 + +Symbols: + Local: + - Name: LT0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: LD0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + + Global: + - Name: _gp_disp + Type: STT_OBJECT + + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T2 + - Name: T4 + Type: STT_FUNC + + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D4 + Type: STT_OBJECT + - Name: U1 +... diff --git a/test/old-elf/Mips/rel-dynamic-08.test b/test/old-elf/Mips/rel-dynamic-08.test new file mode 100644 index 000000000000..a89e6ecf480e --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-08.test @@ -0,0 +1,275 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) There ars multiple R_MIPS_32/R_MIPS_HI16/R_MIPS_LO16 relocations +# with various targets. +# Check: +# a) Emitting of R_MIPS_REL32 relocations. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 --noinhibit-exec \ +# RUN: -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# CHECK: Sections [ +# CHECK: Section { +# CHECK-NOT: Name: .plt ({{[0-9]+}}) + +# CHECK: Relocations [ +# CHECK-NEXT: Section (5) .rel.dyn { +# CHECK-NEXT: 0x402000 R_MIPS_REL32 D2 0x0 +# CHECK-NEXT: 0x402004 R_MIPS_REL32 T1 0x0 +# CHECK-NEXT: 0x402008 R_MIPS_REL32 T2 0x0 +# CHECK-NEXT: 0x402008 R_MIPS_REL32 D1 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: @ (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D2@ (10) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T1@ (1) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: T2@ (4) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Function (0x2) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: D1@ (7) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global (0x1) +# CHECK-NEXT: Type: Object (0x1) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } +# CHECK-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (10) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T1@ (1) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D1@ (7) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: _gp_disp + Type: R_MIPS_LO16 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 # LT0 is a locally defined function + Symbol: LT0 + Type: R_MIPS_32 + - Offset: 0x00 # LD0 is a locally defined data object + Symbol: LD0 + Type: R_MIPS_32 + - Offset: 0x00 # T0 is a defined function + Symbol: T0 + Type: R_MIPS_32 + - Offset: 0x04 # T1 is a function from shared lib + Symbol: T1 + Type: R_MIPS_32 + - Offset: 0x08 # T2 has unknown type and defined in shared lib + Symbol: T2 + Type: R_MIPS_32 + - Offset: 0x00 # T4 is an undefined function + Symbol: T4 + Type: R_MIPS_32 + - Offset: 0x04 # D0 is a defined data object + Symbol: D0 + Type: R_MIPS_32 + - Offset: 0x08 # D1 is a data object from shared lib + Symbol: D1 + Type: R_MIPS_32 + - Offset: 0x00 # D2 has unknown type and defined in shared lib + Symbol: D2 + Type: R_MIPS_32 + - Offset: 0x04 # D4 is an undefined data object + Symbol: D4 + Type: R_MIPS_32 + - Offset: 0x08 # U1 is undefined and has unknown type + Symbol: U1 + Type: R_MIPS_32 + +Symbols: + Local: + - Name: LT0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: LD0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + + Global: + - Name: _gp_disp + Type: STT_OBJECT + + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + - Name: T4 + Type: STT_FUNC + + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + - Name: D4 + Type: STT_OBJECT + - Name: U1 +... diff --git a/test/old-elf/Mips/rel-dynamic-09-micro.test b/test/old-elf/Mips/rel-dynamic-09-micro.test new file mode 100644 index 000000000000..2011ae079645 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-09-micro.test @@ -0,0 +1,109 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are undefined symbols. +# Check: +# a) There should be no dynamic relocations. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -e T0 -o %t2-exe %t-obj +# RUN: llvm-readobj -dt -r -s %t2-exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Sections [ +# PLT-SYM: Section { +# PLT-SYM-NOT: Name: .plt ({{[0-9]+}}) + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MICROMIPS_26_S1 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_LO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT diff --git a/test/old-elf/Mips/rel-dynamic-09.test b/test/old-elf/Mips/rel-dynamic-09.test new file mode 100644 index 000000000000..9b02ec1b5707 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-09.test @@ -0,0 +1,107 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are undefined symbols. +# Check: +# a) There should be no dynamic relocations. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -e T0 -o %t2-exe %t-obj +# RUN: llvm-readobj -dt -r -s %t2-exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Sections [ +# PLT-SYM: Section { +# PLT-SYM-NOT: Name: .plt ({{[0-9]+}}) + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Content: "0000000000000000" + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT diff --git a/test/old-elf/Mips/rel-dynamic-10-micro.test b/test/old-elf/Mips/rel-dynamic-10-micro.test new file mode 100644 index 000000000000..4600af85c27c --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-10-micro.test @@ -0,0 +1,166 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the other object. +# Check: +# a) There should be no dynamic relocations. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Sections [ +# PLT-SYM: Section { +# PLT-SYM-NOT: Name: .plt ({{[0-9]+}}) + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o2.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MICROMIPS_26_S1 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_LO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MICROMIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-dynamic-10.test b/test/old-elf/Mips/rel-dynamic-10.test new file mode 100644 index 000000000000..68a311df73e4 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-10.test @@ -0,0 +1,160 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the other object. +# Check: +# a) There should be no dynamic relocations. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o +# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Sections [ +# PLT-SYM: Section { +# PLT-SYM-NOT: Name: .plt ({{[0-9]+}}) + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o2.o +--- +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_HI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_HI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_LO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-dynamic-11.test b/test/old-elf/Mips/rel-dynamic-11.test new file mode 100644 index 000000000000..01edbd64812f --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-11.test @@ -0,0 +1,110 @@ +# Conditions: +# a) Linking a shared library. +# b) Relocations' targets are symbols defined in the other shared object. +# Check: +# a) Emitting R_MIPS_REL32 relocations for both symbols. +# b) There should be no PLT entries. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-o.o %t1.so +# RUN: llvm-readobj -dt -r -s %t2.so | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Sections [ +# PLT-SYM: Section { +# PLT-SYM-NOT: Name: .plt ({{[0-9]+}}) +# +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (4) .rel.dyn { +# PLT-SYM-NEXT: 0x150 R_MIPS_REL32 T1 0x0 +# PLT-SYM-NEXT: 0x2000 R_MIPS_REL32 T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] +# +# PLT-SYM: Name: T1@ (7) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T1 + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 +... diff --git a/test/old-elf/Mips/rel-dynamic-12.test b/test/old-elf/Mips/rel-dynamic-12.test new file mode 100644 index 000000000000..c684df3f2628 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-12.test @@ -0,0 +1,237 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# c) Relocations are R_MIPS_PCHI16 / R_MIPS_PCLO16. +# Check: +# a) Emitting R_MIPS_REL32, R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations. +# b) STO_MIPS_PLT flag in the dynamic symbol table for symbols require +# a pointer equality. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.dyn { +# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 T2 0x0 +# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 D2 0x0 +# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Section (6) .rel.plt { +# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0 +# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0 +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: @ (0) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Local (0x0) +# PLT-SYM-NEXT: Type: None (0x0) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: D1@ (1) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 4 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Object (0x1) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: .bss +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T1@ (4) +# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 8 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T3@ (10) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: T2@ (7) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 0 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Function (0x2) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: Symbol { +# PLT-SYM-NEXT: Name: D2@ (13) +# PLT-SYM-NEXT: Value: 0x0 +# PLT-SYM-NEXT: Size: 4 +# PLT-SYM-NEXT: Binding: Global (0x1) +# PLT-SYM-NEXT: Type: Object (0x1) +# PLT-SYM-NEXT: Other: 0 +# PLT-SYM-NEXT: Section: Undefined (0x0) +# PLT-SYM-NEXT: } +# PLT-SYM-NEXT: ] + +# GOT: Local entries [ +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x{{[0-9A-F]+}} +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (7) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x{{[0-9A-F]+}} +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Object (0x1) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: D2@ (13) +# GOT-NEXT: } +# GOT-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x0C + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0x4 + Size: 4 + - Name: T3 + Section: .text + Type: STT_FUNC + Value: 0x8 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 4 + - Name: D2 + Section: .data + Type: STT_OBJECT + Value: 0x4 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0x04 + Symbol: T3 + Type: R_MIPS_26 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_PCHI16 + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_PCLO16 + - Offset: 0x04 + Symbol: T2 + Type: R_MIPS_32 + + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_PCHI16 + - Offset: 0x04 + Symbol: D1 + Type: R_MIPS_PCLO16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_32 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: T3 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT + - Name: D2 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-dynamic-13.test b/test/old-elf/Mips/rel-dynamic-13.test new file mode 100644 index 000000000000..2bf014e51025 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-13.test @@ -0,0 +1,94 @@ +# Conditions: +# a) Linking a non-shared 32-bit executable file. +# b) Relocations' targets are symbols defined in the shared object. +# Check: +# a) Emitting R_MIPS_REL32 relocation. +# b) Applying addendum from the original relocation. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s + +# RAW: Contents of section .data: +# RAW-NEXT: 402000 01000000 + +# REL: Relocations [ +# REL-NEXT: Section (5) .rel.dyn { +# REL-NEXT: 0x402000 R_MIPS_REL32 T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_32 + Addend: 1 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-dynamic-14.test b/test/old-elf/Mips/rel-dynamic-14.test new file mode 100644 index 000000000000..33197ae92b81 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-14.test @@ -0,0 +1,94 @@ +# Conditions: +# a) Linking a non-shared 64-bit executable file. +# b) Relocations' targets are symbols defined in the shared object. +# Check: +# a) Emitting R_MIPS_REL32/R_MIPS_64 relocation. +# b) Applying addendum from the original relocation. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s + +# RAW: Contents of section .data: +# RAW-NEXT: 120002000 04000000 00000000 + +# REL: Relocations [ +# REL-NEXT: Section (5) .rel.dyn { +# REL-NEXT: 0x120002000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +# so.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_64 + Addend: 4 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-dynamic-15.test b/test/old-elf/Mips/rel-dynamic-15.test new file mode 100644 index 000000000000..13e2083bfc02 --- /dev/null +++ b/test/old-elf/Mips/rel-dynamic-15.test @@ -0,0 +1,81 @@ +# Check that LLD generates dynamic relocation R_MIPS_REL32 for local +# symbols if the symbols referenced by R_MIPS_32 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s + +# RAW: Contents of section .text: +# RAW-NEXT: 0120 00000000 00000000 +# RAW: Contents of section .data.rel.local: +# RAW-NEXT: 2000 20010000 00000000 + +# REL: Relocations [ +# REL-NEXT: Section (4) .rel.dyn { +# REL-NEXT: 0x2000 R_MIPS_REL32 - 0x0 +# REL-NEXT: 0x2004 R_MIPS_REL32 T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + + - Name: .data.rel.local + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 4 + Size: 8 + + - Name: .rel.data.rel.local + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .data.rel.local + Relocations: + - Offset: 0 + Symbol: .text + Type: R_MIPS_32 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_32 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + - Name: .data.rel.local + Type: STT_SECTION + Section: .data.rel.local + + Global: + - Name: D0 + Type: STT_OBJECT + Section: .data.rel.local + Value: 0 + Size: 8 + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 4 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-eh-01.test b/test/old-elf/Mips/rel-eh-01.test new file mode 100644 index 000000000000..08e5d78683a8 --- /dev/null +++ b/test/old-elf/Mips/rel-eh-01.test @@ -0,0 +1,186 @@ +# Check R_MIPS_EH relocation handling: writing result of a relocation +# calculation, adding GOT entries etc. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 3 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t1.o %t2.o %t.so +# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s + +# RAW: Contents of section .gnu_extab: +# RAW-NEXT: 400178 001880ff ff000000 1c80ffff 2080ffff +# ^ T1 GOT entry = 0xffff8018 = -32744 +# ^ L1 GOT entry = 0xffff801c = -32740 +# E1 GOT entry = 0xffff8020 = -32736 ^ +# RAW: Contents of section .got: +# RAW-NEXT: 401000 00000000 00000080 60014000 00204000 +# RAW-NEXT: 401010 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 00402000 l .data 00000004 L1 +# RAW: 00400160 g F .text 00000004 T1 + +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x400160 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x40100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x402000 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x401010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: E1@ (1) +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Number of TLS and multi-GOT entries: 0 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: E1 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 16 + Size: 8 + + - Name: .data + Type: SHT_PROGBITS + Flags: [SHF_WRITE, SHF_ALLOC] + AddressAlign: 16 + Size: 4 + + - Name: .gnu_extab + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + AddressAlign: 4 + Size: 16 + + - Name: .rel.gnu_extab + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .gnu_extab + Relocations: + - Offset: 1 + Symbol: T1 + Type: R_MIPS_EH + - Offset: 8 + Symbol: L1 + Type: R_MIPS_EH + - Offset: 12 + Symbol: E1 + Type: R_MIPS_EH + + - Name: .eh_frame_entry + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + AddressAlign: 4 + Content: "0000000100000001" + + - Name: .rel.eh_frame_entry + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .eh_frame_entry + Relocations: + - Offset: 0 + Symbol: .text + Type: R_MIPS_PC32 + - Offset: 4 + Symbol: .gnu_extab + Type: R_MIPS_PC32 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .gnu_extab + Type: STT_SECTION + Section: .gnu_extab + - Name: L1 + Type: STT_OBJECT + Section: .data + Value: 0 + Size: 4 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 8 + - Name: E1 + - Name: T1 +... diff --git a/test/old-elf/Mips/rel-eh-02.test b/test/old-elf/Mips/rel-eh-02.test new file mode 100644 index 000000000000..e78c967ed301 --- /dev/null +++ b/test/old-elf/Mips/rel-eh-02.test @@ -0,0 +1,130 @@ +# Conditions: +# a) Linking a non-shared executable file. +# b) Relocations' targets are symbols defined in the shared object. +# Check: +# a) The R_MIPS_REL32 relocation is not created for any symbols. +# b) The R_MIPS_COPY relocation is created for the D1 symbol. +# c) No entries in the dynamic symbols table has the STO_MIPS_PLT flag. +# +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so +# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s + +# PLT-SYM: Relocations [ +# PLT-SYM-NEXT: Section (5) .rel.dyn { +# PLT-SYM-NEXT: 0x{{[0-9A-F]+}} R_MIPS_COPY D1 0x0 +# PLT-SYM-NEXT: } + +# PLT-SYM: DynamicSymbols [ +# PLT-SYM-NOT: Other: 8 + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 4 + Flags: [SHF_WRITE, SHF_ALLOC] + +Symbols: + Global: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + - Name: D1 + Section: .data + Type: STT_OBJECT + Value: 0 + Size: 4 + +# o.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_EXECINSTR, SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_WRITE, SHF_ALLOC] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 4 + Symbol: D1 + Type: R_MIPS_PC32 + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_EH + - Offset: 4 + Symbol: T2 + Type: R_MIPS_EH + - Offset: 8 + Symbol: D1 + Type: R_MIPS_EH + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 8 + - Name: T1 + Type: STT_FUNC + - Name: T2 + Type: STT_FUNC + - Name: D0 + Section: .data + Type: STT_OBJECT + Value: 0x0 + Size: 8 + - Name: D1 + Type: STT_OBJECT +... diff --git a/test/old-elf/Mips/rel-eh-03.test b/test/old-elf/Mips/rel-eh-03.test new file mode 100644 index 000000000000..63ed74cd56f8 --- /dev/null +++ b/test/old-elf/Mips/rel-eh-03.test @@ -0,0 +1,128 @@ +# Check R_MIPS_EH relocation handling in case of -pcrel-eh-reloc option. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 \ +# RUN: -pcrel-eh-reloc -o %t.exe %t1.o %t2.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s + +# RAW: Contents of section .gnu_extab: +# RAW-NEXT: 400148 00e7ffff ff000000 b01e0000 00000000 +# ^ 0x400130 + 0 - 0x400149 = 0xffffffe7 +# ^ 0x402000 + 0 - 0x400150 = 0x1eb0 +# E1 GOT entry = 0xffff8020 = -32736 ^ +# RAW: Contents of section .got: +# RAW-NEXT: 401000 00000000 00000080 + +# RAW: SYMBOL TABLE: +# RAW: 00402000 l .data 00000004 L1 +# RAW: 00400130 g F .text 00000004 T1 + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + AddressAlign: 16 + Size: 8 + + - Name: .data + Type: SHT_PROGBITS + Flags: [SHF_WRITE, SHF_ALLOC] + AddressAlign: 16 + Size: 4 + + - Name: .gnu_extab + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + AddressAlign: 4 + Size: 16 + + - Name: .rel.gnu_extab + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .gnu_extab + Relocations: + - Offset: 1 + Symbol: T1 + Type: R_MIPS_EH + - Offset: 8 + Symbol: L1 + Type: R_MIPS_EH + + - Name: .eh_frame_entry + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + AddressAlign: 4 + Content: "0000000100000001" + + - Name: .rel.eh_frame_entry + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .eh_frame_entry + Relocations: + - Offset: 0 + Symbol: .text + Type: R_MIPS_PC32 + - Offset: 4 + Symbol: .gnu_extab + Type: R_MIPS_PC32 + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .gnu_extab + Type: STT_SECTION + Section: .gnu_extab + - Name: L1 + Type: STT_OBJECT + Section: .data + Value: 0 + Size: 4 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 8 + - Name: T1 +... diff --git a/test/old-elf/Mips/rel-got-hilo-01.test b/test/old-elf/Mips/rel-got-hilo-01.test new file mode 100644 index 000000000000..c73d8765cbd5 --- /dev/null +++ b/test/old-elf/Mips/rel-got-hilo-01.test @@ -0,0 +1,109 @@ +# Check handling of R_MIPS_GOT_HI16 / R_MIPS_GOT_LO16 relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so +# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# RAW: Contents of section .text: +# RAW-NEXT: 0110 00000000 18800000 00000000 1c800000 +# ^ -32744 ^ -32740 +# RAW-NEXT: 0120 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 00000120 l F .text 00000004 T1 + +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x120 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: ] + +# t1.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 4 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + +# t2.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 20 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_GOT_HI16 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_GOT_LO16 + - Offset: 8 + Symbol: T2 + Type: R_MIPS_GOT_HI16 + - Offset: 12 + Symbol: T2 + Type: R_MIPS_GOT_LO16 + +Symbols: + Local: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 16 + Size: 4 + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 16 + - Name: T2 +... diff --git a/test/old-elf/Mips/rel-got-hilo-micro.test b/test/old-elf/Mips/rel-got-hilo-micro.test new file mode 100644 index 000000000000..39dd1848f92e --- /dev/null +++ b/test/old-elf/Mips/rel-got-hilo-micro.test @@ -0,0 +1,154 @@ +# Check handling of R_MICROMIPS_GOT_HI16 / R_MICROMIPS_GOT_LO16 relocations. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so +# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s +# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s + +# RAW: Contents of section .text: +# RAW-NEXT: 0130 00000000 00001880 00000000 00002080 +# ^ -32744 ^ -32736 +# RAW-NEXT: 0140 00000000 00001c80 00000000 00002480 +# ^ -32740 ^ -32732 +# RAW-NEXT: 0150 00000000 00000000 + +# RAW: SYMBOL TABLE: +# RAW: 00000150 l F .text 00000004 T1 +# RAW: 00000154 l F .text 00000004 M1 + +# GOT: Local entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1008 +# GOT-NEXT: Access: -32744 +# GOT-NEXT: Initial: 0x150 +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x100C +# GOT-NEXT: Access: -32740 +# GOT-NEXT: Initial: 0x155 +# GOT-NEXT: } +# GOT-NEXT: ] +# GOT-NEXT: Global entries [ +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1010 +# GOT-NEXT: Access: -32736 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: T2@ (4) +# GOT-NEXT: } +# GOT-NEXT: Entry { +# GOT-NEXT: Address: 0x1014 +# GOT-NEXT: Access: -32732 +# GOT-NEXT: Initial: 0x0 +# GOT-NEXT: Value: 0x0 +# GOT-NEXT: Type: Function (0x2) +# GOT-NEXT: Section: Undefined (0x0) +# GOT-NEXT: Name: M2@ (7) +# GOT-NEXT: } +# GOT-NEXT: ] + +# t1.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +Symbols: + Global: + - Name: T2 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: M2 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + +# t2.so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 40 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_EXECINSTR] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_GOT_HI16 + - Offset: 4 + Symbol: T1 + Type: R_MICROMIPS_GOT_LO16 + - Offset: 8 + Symbol: T2 + Type: R_MICROMIPS_GOT_HI16 + - Offset: 12 + Symbol: T2 + Type: R_MICROMIPS_GOT_LO16 + - Offset: 16 + Symbol: M1 + Type: R_MICROMIPS_GOT_HI16 + - Offset: 20 + Symbol: M1 + Type: R_MICROMIPS_GOT_LO16 + - Offset: 24 + Symbol: M2 + Type: R_MICROMIPS_GOT_HI16 + - Offset: 28 + Symbol: M2 + Type: R_MICROMIPS_GOT_LO16 + +Symbols: + Local: + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 32 + Size: 4 + - Name: M1 + Section: .text + Type: STT_FUNC + Value: 36 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 32 + Other: [STO_MIPS_MICROMIPS] + - Name: T2 + - Name: M2 +... diff --git a/test/old-elf/Mips/rel-gprel16-micro-overflow.test b/test/old-elf/Mips/rel-gprel16-micro-overflow.test new file mode 100644 index 000000000000..7b023aecba41 --- /dev/null +++ b/test/old-elf/Mips/rel-gprel16-micro-overflow.test @@ -0,0 +1,57 @@ +# Check R_MICROMIPS_GPREL16 relocation overflow handling. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from +0 to L0+0 of type 136 (R_MICROMIPS_GPREL16) +# CHECK: Relocation out of range in file {{.*}} reference from +4 to G0+0 of type 136 (R_MICROMIPS_GPREL16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Type: SHT_PROGBITS + Name: .text + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + +- Type: SHT_PROGBITS + Name: .rodata + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Size: 8 + +- Type: SHT_REL + Name: .rel.rodata + Link: .symtab + Info: .rodata + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: L0 + Type: R_MICROMIPS_GPREL16 + - Offset: 4 + Symbol: G0 + Type: R_MICROMIPS_GPREL16 + +Symbols: + Local: + - Name: L0 + Section: .text + Value: 0 + Size: 4 + - Name: .rodata + Type: STT_SECTION + Section: .rodata + Global: + - Name: G0 + Section: .text + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/rel-gprel16-micro.test b/test/old-elf/Mips/rel-gprel16-micro.test new file mode 100644 index 000000000000..c0119a51e484 --- /dev/null +++ b/test/old-elf/Mips/rel-gprel16-micro.test @@ -0,0 +1,78 @@ +# Check R_MICROMIPS_GPREL16 relocation handling. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s + +# SYM: Name: L0 +# SYM-NEXT: Value: 0x104 +# SYM-NEXT: Size: 4 + +# SYM: Name: G0 +# SYM-NEXT: Value: 0x108 +# SYM-NEXT: Size: 4 + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x8FF0 +# SYM-NEXT: Size: 0 + +# SEC: Contents of section .rodata: +# SEC-NEXT: 010c 00001071 000017f1 +# ^ 0x104 (L0) + 0x10000 (GP0) - 0x8ff0 (_gp) - 4 = 0x7110 +# ^ 0x108 (G0) - 0x8ff0 (_gp) + 0x7fff = 0xf117 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Type: SHT_PROGBITS + Name: .text + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + +- Type: SHT_PROGBITS + Name: .rodata + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: 0000fcff0000ff7f + +- Type: SHT_REL + Name: .rel.rodata + Link: .symtab + Info: .rodata + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: L0 + Type: R_MICROMIPS_GPREL16 + - Offset: 4 + Symbol: G0 + Type: R_MICROMIPS_GPREL16 + +- Type: SHT_MIPS_REGINFO + Name: .reginfo + Flags: [ SHF_ALLOC ] + AddressAlign: 1 + Content: 000000000000000000000000000000000000000000000100 + +Symbols: + Local: + - Name: L0 + Section: .text + Value: 0 + Size: 4 + - Name: .rodata + Type: STT_SECTION + Section: .rodata + Global: + - Name: G0 + Section: .text + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/rel-gprel16-overflow.test b/test/old-elf/Mips/rel-gprel16-overflow.test new file mode 100644 index 000000000000..2943b5d200f4 --- /dev/null +++ b/test/old-elf/Mips/rel-gprel16-overflow.test @@ -0,0 +1,48 @@ +# Check R_MIPS_GPREL16 relocation overflow handling. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from +0 to T1+-32768 of type 7 (R_MIPS_GPREL16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Type: SHT_PROGBITS + Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 4 + +- Type: SHT_PROGBITS + Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: 00800000 + +- Type: SHT_REL + Name: .rel.rodata + Type: SHT_REL + Link: .symtab + Info: .rodata + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_GPREL16 + +Symbols: + Global: + - Name: T1 + Section: .text + Value: 0 + Size: 4 diff --git a/test/old-elf/Mips/rel-gprel16.test b/test/old-elf/Mips/rel-gprel16.test new file mode 100644 index 000000000000..d7e8a1a92598 --- /dev/null +++ b/test/old-elf/Mips/rel-gprel16.test @@ -0,0 +1,104 @@ +# Check R_MIPS_GPREL16 relocation handling. +# +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -e G1 -shared -o %t.so %t-obj +# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s + +# SYM: Name: L1 +# SYM-NEXT: Value: 0x104 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Local (0x0) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) + +# SYM: Name: G1 +# SYM-NEXT: Value: 0x108 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x5) + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x8FF0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Object (0x1) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Absolute (0xFFF1) + +# 0x6110 == 0xfffc (addend) + 0x0104 (L1) + 0xf000 (GP0) - 0x8ff0 (_gp) +# SEC: Contents of section .rodata: +# SEC-NEXT: 010c 10610008 00000000 00000000 00000000 + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: +- Type: SHT_PROGBITS + Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + +- Type: SHT_REL + Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: .rodata + Type: R_MIPS_GOT16 + - Offset: 4 + Symbol: .rodata + Type: R_MIPS_LO16 + +- Type: SHT_PROGBITS + Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x04 + Content: fcff0008000000000000000000000000 + +- Type: SHT_REL + Name: .rel.rodata + Type: SHT_REL + Link: .symtab + Info: .rodata + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: L1 + Type: R_MIPS_GPREL16 + +- Type: SHT_MIPS_REGINFO + Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 0x01 + Content: 000000000000000000000000000000000000000000f00000 + +Symbols: + Local: + - Name: L1 + Section: .text + Value: 0x00 + Size: 0x04 + - Name: .rodata + Type: STT_SECTION + Section: .rodata + Global: + - Name: G1 + Section: .text + Value: 0x04 + Size: 0x04 diff --git a/test/old-elf/Mips/rel-gprel32-64.test b/test/old-elf/Mips/rel-gprel32-64.test new file mode 100644 index 000000000000..15498a693e4d --- /dev/null +++ b/test/old-elf/Mips/rel-gprel32-64.test @@ -0,0 +1,84 @@ +# Check R_MIPS_GPREL32/R_MIPS_64 relocations handling. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -r %t.exe | FileCheck --check-prefix=REL-EXE %s +# RUN: llvm-objdump -s %t.exe | FileCheck %s +# RUN: llvm-nm %t.exe | FileCheck --check-prefix=SYM %s + +# REL-EXE: Relocations [ +# REL-EXE-NEXT: ] + +# CHECK: Contents of section .text: +# CHECK-NEXT: 1200001d0 f871ffff ffffffff f871ffff f871ffff +# CHECK-NEXT: 1200001e0 f871ffff ffffffff 00000000 00000000 + +# SYM: 00000001200001e8 t LT1 +# SYM: 0000000120001000 N _GLOBAL_OFFSET_TABLE_ + +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o +# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=REL-SO %s + +# REL-SO: Relocations [ +# REL-SO-NEXT: ] + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 32 + + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 8 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: LT1 + Type: R_MIPS_GPREL16 + Type2: R_MIPS_64 + Type3: R_MIPS_NONE + - Offset: 0x08 + Symbol: LT1 + Type: R_MIPS_GPREL16 + Type2: R_MIPS_64 + Type3: R_MIPS_NONE + - Offset: 0x0C + Symbol: LT1 + Type: R_MIPS_GPREL32 + Type2: R_MIPS_64 + Type3: R_MIPS_NONE + - Offset: 0x10 + Symbol: LT1 + Type: R_MIPS_GPREL32 + Type2: R_MIPS_64 + Type3: R_MIPS_NONE + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: LT1 + Type: STT_FUNC + Section: .text + Value: 0x18 + Size: 0x8 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0x0 + Size: 0x18 +... diff --git a/test/old-elf/Mips/rel-gprel32.test b/test/old-elf/Mips/rel-gprel32.test new file mode 100644 index 000000000000..14ec8cebcabd --- /dev/null +++ b/test/old-elf/Mips/rel-gprel32.test @@ -0,0 +1,84 @@ +# Check R_MIPS_GPREL32 relocation handling. +# +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj +# RUN: llvm-readobj -symbols %t-exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t-exe | FileCheck -check-prefix=SEC %s + +# SYM: Name: $L1 +# SYM-NEXT: Value: 0x400160 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Local (0x0) +# SYM-NEXT: Type: Function (0x2) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .text (0x6) +# +# SYM: Name: _gp +# SYM-NEXT: Value: 0x408FF0 +# SYM-NEXT: Size: 0 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: Object (0x1) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: Absolute (0xFFF1) + +# 0x08ff7153 == 0x8000001 (addend) + 0x400140 ($L1) + +# 0x1000002 (GP0) - 0x408FF0 (_gp) +# SEC: Contents of section .rodata: +# SEC-NEXT: 400170 7371ff08 00000000 00000000 00000000 + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: +- Type: SHT_PROGBITS + Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: 00000000000000000000000000000000 + +- Type: SHT_PROGBITS + Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x04 + Content: 01000008000000000000000000000000 + +- Type: SHT_REL + Name: .rel.rodata + Type: SHT_REL + Link: .symtab + Info: .rodata + AddressAlign: 0x04 + Relocations: + - Offset: 0 + Symbol: $L1 + Type: R_MIPS_GPREL32 + +- Type: SHT_MIPS_REGINFO + Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 0x01 + Content: 000000000000000000000000000000000000000002000001 + +Symbols: + Local: + - Name: $L1 + Section: .text + Value: 0x00 + - Name: .rodata + Type: STT_SECTION + Section: .rodata + Global: + - Name: __start + Section: .text + Type: STT_FUNC + Value: 0x04 + Size: 12 + - Name: _gp_disp diff --git a/test/old-elf/Mips/rel-gprel7-micro-overflow.test b/test/old-elf/Mips/rel-gprel7-micro-overflow.test new file mode 100644 index 000000000000..5609786aa04a --- /dev/null +++ b/test/old-elf/Mips/rel-gprel7-micro-overflow.test @@ -0,0 +1,48 @@ +# Check R_MICROMIPS_GPREL7_S2 relocation overflow handling. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from +0 to L0+-4 of type 172 (R_MICROMIPS_GPREL7_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Type: SHT_PROGBITS + Name: .text + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 4 + +- Type: SHT_PROGBITS + Name: .rodata + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: 7f000000 + +- Type: SHT_REL + Name: .rel.rodata + Link: .symtab + Info: .rodata + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: L0 + Type: R_MICROMIPS_GPREL7_S2 + +Symbols: + Local: + - Name: L0 + Section: .text + Value: 0 + Size: 4 + - Name: .rodata + Type: STT_SECTION + Section: .rodata diff --git a/test/old-elf/Mips/rel-gprel7-micro.test b/test/old-elf/Mips/rel-gprel7-micro.test new file mode 100644 index 000000000000..b7790d9d169c --- /dev/null +++ b/test/old-elf/Mips/rel-gprel7-micro.test @@ -0,0 +1,65 @@ +# Check R_MICROMIPS_GPREL7_S2 relocation handling. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s + +# SYM: Name: L0 +# SYM-NEXT: Value: 0xF0 +# SYM-NEXT: Size: 4 + +# SYM: Name: _gp +# SYM-NEXT: Value: 0x8FF0 +# SYM-NEXT: Size: 0 + +# SEC: Contents of section .rodata: +# SEC-NEXT: 0f4 3b000000 +# ^ 0xf0 (L0) + 0x8ff0 (GP0) - 0x8ff0 (_gp) - 4 = 0xec >> 2 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: +- Type: SHT_PROGBITS + Name: .text + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 4 + +- Type: SHT_PROGBITS + Name: .rodata + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: 7f000000 + +- Type: SHT_REL + Name: .rel.rodata + Link: .symtab + Info: .rodata + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: L0 + Type: R_MICROMIPS_GPREL7_S2 + +- Type: SHT_MIPS_REGINFO + Name: .reginfo + Flags: [ SHF_ALLOC ] + AddressAlign: 1 + Content: 0000000000000000000000000000000000000000f08f0000 + +Symbols: + Local: + - Name: L0 + Section: .text + Value: 0 + Size: 4 + - Name: .rodata + Type: STT_SECTION + Section: .rodata diff --git a/test/old-elf/Mips/rel-hi0-lo16-micro.test b/test/old-elf/Mips/rel-hi0-lo16-micro.test new file mode 100644 index 000000000000..82f62954b992 --- /dev/null +++ b/test/old-elf/Mips/rel-hi0-lo16-micro.test @@ -0,0 +1,58 @@ +# Check handling of R_MICROMIPS_HI0_LO16 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 00000420 +# ^ 0x402000 + 0x4 = 0x402004 + +# CHECK: 00402000 g .data 00000004 D0 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "00000400" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: D0 + Type: R_MICROMIPS_HI0_LO16 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE ] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + - Name: D0 + Type: STT_OBJECT + Section: .data + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-high-01.test b/test/old-elf/Mips/rel-high-01.test new file mode 100644 index 000000000000..613fedbe31db --- /dev/null +++ b/test/old-elf/Mips/rel-high-01.test @@ -0,0 +1,25 @@ +# REQUIRES: mips + +# Check handling R_MIPS_HIGHER / R_MIPS_HIGHEST relocations. + +# RUN: llvm-mc -arch=mips64el -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: T0: +# CHECK-NEXT: 120000250: 01 00 62 64 daddiu $2, $3, 1 +# CHECK-NEXT: 120000254: 00 00 62 64 daddiu $2, $3, 0 +# +# CHECK: T1: +# CHECK-NEXT: 120000258: 00 00 00 00 nop + + .text + .globl T0 +T0: + daddiu $2, $3, %higher(T1) + daddiu $2, $3, %highest(T1) + + .globl T1 +T1: + nop diff --git a/test/old-elf/Mips/rel-high-02.test b/test/old-elf/Mips/rel-high-02.test new file mode 100644 index 000000000000..7a40a617a680 --- /dev/null +++ b/test/old-elf/Mips/rel-high-02.test @@ -0,0 +1,25 @@ +# REQUIRES: mips + +# Check handling R_MICROMIPS_HIGHER / R_MICROMIPS_HIGHEST relocations. + +# RUN: llvm-mc -arch=mips64el -filetype=obj -o=%t.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK-NEXT: T0: +# CHECK-NEXT: 120000250: 01 00 62 64 daddiu $2, $3, 1 +# CHECK-NEXT: 120000254: 00 00 62 64 daddiu $2, $3, 0 +# +# CHECK: T1: +# CHECK-NEXT: 120000258: 00 00 00 00 nop + + .text + .globl T0 +T0: + daddiu $2, $3, %higher(T1+0x0000800100000000) + daddiu $2, $3, %highest(T1+0x4001000000000000) + + .globl T1 +T1: + nop diff --git a/test/old-elf/Mips/rel-jalr-01.test b/test/old-elf/Mips/rel-jalr-01.test new file mode 100644 index 000000000000..3c519056e1a9 --- /dev/null +++ b/test/old-elf/Mips/rel-jalr-01.test @@ -0,0 +1,101 @@ +# REQUIRES: mips + +# Check handling of the R_MIPS_JALR relocation. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t2.o %t.so +# RUN: llvm-objdump -d %t.exe | FileCheck %s + +# CHECK: __start: +# CHECK-NEXT: {{[0-9a-f]+}}: 05 00 11 04 bal 24 +# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop +# CHECK-NEXT: {{[0-9a-f]+}}: 04 00 00 10 b 20 +# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop +# CHECK-NEXT: {{[0-9a-f]+}}: 09 f8 20 03 jalr $25 +# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T3 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "09f8200300000000080020030000000009f82003000000000000000000000000" +# ^ jalr T1 ^ j T2 ^ jalr T3 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_JALR + - Offset: 8 + Symbol: T2 + Type: R_MIPS_JALR + - Offset: 16 + Symbol: T3 + Type: R_MIPS_JALR + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 16 + Size: 0 + +Symbols: + Local: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 24 + Size: 4 + Global: + - Name: __start + Type: STT_FUNC + Section: .text + Value: 0 + Size: 24 + - Name: T2 + Type: STT_FUNC + Section: .text + Value: 28 + Size: 4 + - Name: T3 +... diff --git a/test/old-elf/Mips/rel-jalr-02.test b/test/old-elf/Mips/rel-jalr-02.test new file mode 100644 index 000000000000..e9c74c4c3300 --- /dev/null +++ b/test/old-elf/Mips/rel-jalr-02.test @@ -0,0 +1,68 @@ +# REQUIRES: mips + +# Check R_MIPS_JALR relocations do not affect the code +# in case of relocatable targets. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o +# RUN: llvm-objdump -d %t.so | FileCheck %s + +# CHECK: __start: +# CHECK-NEXT: {{[0-9a-f]+}}: 09 f8 20 03 jalr $25 +# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop +# CHECK-NEXT: {{[0-9a-f]+}}: 08 00 20 03 jr $25 +# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "09f820030000000008002003000000000000000000000000" +# ^ jalr ^ jr ^ T1 ^ T2 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_JALR + - Offset: 8 + Symbol: T2 + Type: R_MIPS_JALR + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 16 + Size: 0 + +Symbols: + Global: + - Name: __start + Type: STT_FUNC + Section: .text + Value: 0 + Size: 16 + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 16 + Size: 4 + - Name: T2 + Type: STT_FUNC + Section: .text + Value: 20 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-lit-micro.test b/test/old-elf/Mips/rel-lit-micro.test new file mode 100644 index 000000000000..783b24f83813 --- /dev/null +++ b/test/old-elf/Mips/rel-lit-micro.test @@ -0,0 +1,59 @@ +# Check handling of R_MICROMIPS_LITERAL relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 00000f10 +# ^ 0x402000 + 0x7fff - 0x408ff0 = 0x100f + +# CHECK: 00402000 g .data 00000004 D0 +# CHECK: 00408ff0 g *ABS* 00000000 _gp_disp + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, + EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "0000ff7f" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: D0 + Type: R_MICROMIPS_LITERAL + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE ] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + Other: [STO_MIPS_MICROMIPS] + - Name: D0 + Type: STT_OBJECT + Section: .data + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-lit.test b/test/old-elf/Mips/rel-lit.test new file mode 100644 index 000000000000..19aa68721691 --- /dev/null +++ b/test/old-elf/Mips/rel-lit.test @@ -0,0 +1,57 @@ +# Check handling of R_MIPS_LITERAL relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 400130 0f100000 +# ^ 0x402000 + 0x7fff - 0x408ff0 = 0x100f + +# CHECK: 00402000 g .data 00000004 D0 +# CHECK: 00408ff0 g *ABS* 00000000 _gp_disp + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Content: "ff7f0000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: D0 + Type: R_MIPS_LITERAL + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE ] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + - Name: D0 + Type: STT_OBJECT + Section: .data + Value: 0 + Size: 4 +... diff --git a/test/old-elf/Mips/rel-pc-hilo.test b/test/old-elf/Mips/rel-pc-hilo.test new file mode 100644 index 000000000000..6791926762b2 --- /dev/null +++ b/test/old-elf/Mips/rel-pc-hilo.test @@ -0,0 +1,70 @@ +# Check handling of R_MIPS_PCHI16 / R_MIPS_PCLO16 relocations. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 01000000 02000000 03000000 00000000 +# ^ +# A = 0x10000 - 1 == 0xffff +# V = (T1 + 0xffff - T0) >> 16 => +# V => 0x1000b >> 16 = 1 +# ^ +# A = 0x20000 - 1 == 0x1ffff +# V = (T1 + 0x1ffff - T0 - 4) >> 16 => +# V => 0x20007 >> 16 = 2 +# ^ +# A = 0xffff == -1 +# V = T1 - 1 - T0 - 8 = 3 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9a-f]+}} g F .text 0000000c T0 +# CHECK: {{[0-9a-f]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0100000002000000ffff000000000000" +# ^ T0 +# ^ A := 0x1 == 0x10000 +# ^ A := 0x2 == 0x20000 +# ^ A := 0xffff == -1 +# ^ T1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PCHI16 + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PCHI16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_PCLO16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 12 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 12 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc16-align.test b/test/old-elf/Mips/rel-pc16-align.test new file mode 100644 index 000000000000..6366a4d67e92 --- /dev/null +++ b/test/old-elf/Mips/rel-pc16-align.test @@ -0,0 +1,43 @@ +# Check incorrect alignment handling for R_MIPS_PC16 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 10 (R_MIPS_PC16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 6 + Size: 2 diff --git a/test/old-elf/Mips/rel-pc16-overflow.test b/test/old-elf/Mips/rel-pc16-overflow.test new file mode 100644 index 000000000000..910482ee6154 --- /dev/null +++ b/test/old-elf/Mips/rel-pc16-overflow.test @@ -0,0 +1,45 @@ +# Check R_MIPS_PC16 relocation overflow handling. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+131068 of type 10 (R_MIPS_PC16) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ff7f00000000000000000000" +# ^ T1 +# ^ T0 A := 0x7fff << 2 = 0x1fffc + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc16.test b/test/old-elf/Mips/rel-pc16.test new file mode 100644 index 000000000000..f298afd81cd6 --- /dev/null +++ b/test/old-elf/Mips/rel-pc16.test @@ -0,0 +1,53 @@ +# Check handling of R_MIPS_PC16 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} feff0000 00000000 00000000 +# ^ V +# A = -16 => +# V = (T1 - 16 - T0) >> 2 = -2 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "fcff00000000000000000000" +# ^ T1 +# ^ T0 A := 0xfffc << 2 = -16 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC16 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc18-s3-align.test b/test/old-elf/Mips/rel-pc18-s3-align.test new file mode 100644 index 000000000000..ca2fa18ecaa0 --- /dev/null +++ b/test/old-elf/Mips/rel-pc18-s3-align.test @@ -0,0 +1,44 @@ +# Check incorrect alignment handling for R_MIPS_PC18_S3 relocation target. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation not aligned in file {{.*}} reference from T1+0 to T1+0 of type 62 (R_MIPS_PC18_S3) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" +# ^ T0 ^ T1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC18_S3 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 4 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc18-s3-micro.test b/test/old-elf/Mips/rel-pc18-s3-micro.test new file mode 100644 index 000000000000..fc143a75e569 --- /dev/null +++ b/test/old-elf/Mips/rel-pc18-s3-micro.test @@ -0,0 +1,56 @@ +# Check handling of R_MICROMIPS_PC18_S3 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000000 00000100 00000000 00000000 +# ^ V +# A = -1 << 3 = -8 => +# V = (T1 - 8 - (T0|7)^7) >> 3 => +# V => 8 >> 3 = 1 (shuffled) + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000010 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "000000000300ffff000000000000000000000000" +# ^ T1 +# ^ T0 ^ A := 0x3ffff == -1 (shuffled) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: T1 + Type: R_MICROMIPS_PC18_S3 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 16 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 16 + Size: 4 + Other: [STO_MIPS_MICROMIPS] diff --git a/test/old-elf/Mips/rel-pc18-s3.test b/test/old-elf/Mips/rel-pc18-s3.test new file mode 100644 index 000000000000..d61427448d53 --- /dev/null +++ b/test/old-elf/Mips/rel-pc18-s3.test @@ -0,0 +1,54 @@ +# Check handling of R_MIPS_PC18_S3 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000000 01000000 00000000 00000000 +# ^ V +# A = -1 << 3 = -8 => +# V = (T1 - 8 - (T0|7)^7) >> 3 => +# V => 8 >> 3 = 1 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000010 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000ffff0300000000000000000000000000" +# ^ T1 +# ^ T0 ^ A := 0x3ffff == -1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: T1 + Type: R_MIPS_PC18_S3 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 16 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 16 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc19-s2-align.test b/test/old-elf/Mips/rel-pc19-s2-align.test new file mode 100644 index 000000000000..19010a445578 --- /dev/null +++ b/test/old-elf/Mips/rel-pc19-s2-align.test @@ -0,0 +1,44 @@ +# Check incorrect alignment handling for R_MIPS_PC19_S2 relocation target. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 63 (R_MIPS_PC19_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" +# ^ T0 ^ T1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC19_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 6 + Size: 2 diff --git a/test/old-elf/Mips/rel-pc19-s2-micro.test b/test/old-elf/Mips/rel-pc19-s2-micro.test new file mode 100644 index 000000000000..d9a930e41d88 --- /dev/null +++ b/test/old-elf/Mips/rel-pc19-s2-micro.test @@ -0,0 +1,56 @@ +# Check handling of R_MICROMIPS_PC19_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 (shuffled) + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0700ffff0000000000000000" +# ^ T1 +# ^ T0 A := 0x7ffff == -1 (shuffled) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_PC19_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 + Other: [STO_MIPS_MICROMIPS] diff --git a/test/old-elf/Mips/rel-pc19-s2.test b/test/old-elf/Mips/rel-pc19-s2.test new file mode 100644 index 000000000000..da21864a1214 --- /dev/null +++ b/test/old-elf/Mips/rel-pc19-s2.test @@ -0,0 +1,54 @@ +# Check handling of R_MIPS_PC19_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ffff07000000000000000000" +# ^ T1 +# ^ T0 A := 0x7ffff == -1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC19_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc21-s2-align.test b/test/old-elf/Mips/rel-pc21-s2-align.test new file mode 100644 index 000000000000..a79e1e2a46e0 --- /dev/null +++ b/test/old-elf/Mips/rel-pc21-s2-align.test @@ -0,0 +1,44 @@ +# Check incorrect alignment handling for R_MIPS_PC21_S2 relocation target. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 60 (R_MIPS_PC21_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" +# ^ T0 ^ T1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC21_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 6 + Size: 2 diff --git a/test/old-elf/Mips/rel-pc21-s2-micro.test b/test/old-elf/Mips/rel-pc21-s2-micro.test new file mode 100644 index 000000000000..4aa0a7de9489 --- /dev/null +++ b/test/old-elf/Mips/rel-pc21-s2-micro.test @@ -0,0 +1,56 @@ +# Check handling of R_MICROMIPS_PC21_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 (shuffled) + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "1f00ffff0000000000000000" +# ^ T1 +# ^ T0 A := 0x1fffff (shuffled) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_PC21_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 + Other: [STO_MIPS_MICROMIPS] diff --git a/test/old-elf/Mips/rel-pc21-s2-overflow.test b/test/old-elf/Mips/rel-pc21-s2-overflow.test new file mode 100644 index 000000000000..ad88e0c14b44 --- /dev/null +++ b/test/old-elf/Mips/rel-pc21-s2-overflow.test @@ -0,0 +1,45 @@ +# Check R_MIPS_PC21_S2 relocation overflow handling. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+4194300 of type 60 (R_MIPS_PC21_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ffff0f000000000000000000" +# ^ T1 +# ^ T0 A := 0xfffff + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC21_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc21-s2.test b/test/old-elf/Mips/rel-pc21-s2.test new file mode 100644 index 000000000000..c2b58c859af9 --- /dev/null +++ b/test/old-elf/Mips/rel-pc21-s2.test @@ -0,0 +1,54 @@ +# Check handling of R_MIPS_PC21_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ffff1f000000000000000000" +# ^ T1 +# ^ T0 A := 0x1fffff + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC21_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc26-s2-align.test b/test/old-elf/Mips/rel-pc26-s2-align.test new file mode 100644 index 000000000000..23e660848365 --- /dev/null +++ b/test/old-elf/Mips/rel-pc26-s2-align.test @@ -0,0 +1,44 @@ +# Check incorrect alignment handling for R_MIPS_PC26_S2 relocation target. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 61 (R_MIPS_PC26_S2) + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "0000000000000000" +# ^ T0 ^ T1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 6 + Size: 2 diff --git a/test/old-elf/Mips/rel-pc26-s2-micro.test b/test/old-elf/Mips/rel-pc26-s2-micro.test new file mode 100644 index 000000000000..193c328be687 --- /dev/null +++ b/test/old-elf/Mips/rel-pc26-s2-micro.test @@ -0,0 +1,56 @@ +# Check handling of R_MICROMIPS_PC26_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 (shuffled) + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ff03ffff0000000000000000" +# ^ T1 +# ^ T0 A := 0x3ffffff == -1 (shuffled) + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MICROMIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + Other: [STO_MIPS_MICROMIPS] + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 + Other: [STO_MIPS_MICROMIPS] diff --git a/test/old-elf/Mips/rel-pc26-s2.test b/test/old-elf/Mips/rel-pc26-s2.test new file mode 100644 index 000000000000..c500f00cb860 --- /dev/null +++ b/test/old-elf/Mips/rel-pc26-s2.test @@ -0,0 +1,54 @@ +# Check handling of R_MIPS_PC26_S2 relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000 +# ^ V +# A = -1 << 2 = -4 => +# V = (T1 - 4 - T0) >> 2 => +# V => 4 >> 2 = 1 + +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0 +# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1 + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "ffffff030000000000000000" +# ^ T1 +# ^ T0 A := 0x3ffffff == -1 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_PC26_S2 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 8 + - Name: T1 + Section: .text + Type: STT_FUNC + Value: 8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc32.test b/test/old-elf/Mips/rel-pc32.test new file mode 100644 index 000000000000..9faa32efec7b --- /dev/null +++ b/test/old-elf/Mips/rel-pc32.test @@ -0,0 +1,59 @@ +# Check handling of R_MIPS_PC32 relocation. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: {{[0-9A-F]+}} 00000000 05000080 fdffff7f +# ^^ data2 + 0x80000001 - data1 +# ^^ data1 + 0x80000001 - data2 +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9A-F]+}} g .data 00000004 data1 +# CHECK: {{[0-9A-F]+}} g .data 00000004 data2 + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "00000000" + AddressAlign: 16 + Flags: [SHF_ALLOC] +- Name: .data + Type: SHT_PROGBITS + Content: "000000000100008001000080" + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rel.data + Type: SHT_REL + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x4 + Symbol: data2 + Type: R_MIPS_PC32 + - Offset: 0x8 + Symbol: data1 + Type: R_MIPS_PC32 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0x0 + Size: 4 + - Name: data1 + Section: .data + Value: 0x4 + Size: 4 + - Name: data2 + Section: .data + Value: 0x8 + Size: 4 diff --git a/test/old-elf/Mips/rel-pc7-10-16-23.test b/test/old-elf/Mips/rel-pc7-10-16-23.test new file mode 100644 index 000000000000..51c4c3a670f1 --- /dev/null +++ b/test/old-elf/Mips/rel-pc7-10-16-23.test @@ -0,0 +1,86 @@ +# Check handling of R_MICROMIPS_PC7_S1, R_MICROMIPS_PC10_S1, +# R_MICROMIPS_PC16_S1, and R_MICROMIPS_PC23_S2 relocations. + +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj +# RUN: llvm-objdump -s -t %t-exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: {{[0-9A-F]+}} 00000000 80780500 a240fcff 000c03cc +# ^^ addiu s1,$pc,20 +# ^^ bnezc v0,400114 <__start+0x4> +# ^^ b 400126 <L1> +# CHECK-NEXT: {{[0-9A-F]+}} 000c03ad 00000000 00000000 00000000 +# ^^ bnez v0,40012a <L2> +# CHECK: SYMBOL TABLE: +# CHECK: {{[0-9a-f]+}} l F .text 00000002 L0 +# CHECK: {{[0-9a-f]+}} l F .text 00000004 L1 +# CHECK: {{[0-9a-f]+}} l F .text 00000004 L2 +# CHECK: {{[0-9a-f]+}} l F .text 00000002 L3 +# CHECK: {{[0-9a-f]+}} g F .text 00000014 __start + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, + EF_MIPS_MICROMIPS ] + +Sections: +- Name: .text + Type: SHT_PROGBITS +# v nop v nop v L0 + Content: "0000000080780100a240f5ff000cfdcf000c7dad000000000000000000000000" +# ^ PC23 ^ PC16 ^ PC10 ^ PC7 ^ L1 ^ L2 ^ L3 +# 7d << 1 = -6 => L3 + 2 - 6 = L2 +# 3fd << 1 = -6 => L2 + 2 - 6 = L1 +# fff5 << 1 = -22 => L1 + 2 - 22 = __start +# 1 << 2 = 4 => L0 + 4 - 4 = L0 + AddressAlign: 16 + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + +- Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 4 + Symbol: L0 + Type: R_MICROMIPS_PC23_S2 + - Offset: 8 + Symbol: L1 + Type: R_MICROMIPS_PC16_S1 + - Offset: 14 + Symbol: L2 + Type: R_MICROMIPS_PC10_S1 + - Offset: 18 + Symbol: L3 + Type: R_MICROMIPS_PC7_S1 + +Symbols: + Local: + - Name: L0 + Section: .text + Value: 20 + Other: [ STO_MIPS_MICROMIPS ] + - Name: L1 + Section: .text + Value: 22 + Other: [ STO_MIPS_MICROMIPS ] + - Name: L2 + Section: .text + Value: 26 + Other: [ STO_MIPS_MICROMIPS ] + - Name: L3 + Section: .text + Value: 30 + Other: [ STO_MIPS_MICROMIPS ] + Global: + - Name: __start + Section: .text + Type: STT_FUNC + Value: 0x0 + Size: 32 + Other: [ STO_MIPS_MICROMIPS ] diff --git a/test/old-elf/Mips/rel-sub-micro.test b/test/old-elf/Mips/rel-sub-micro.test new file mode 100644 index 000000000000..831a020ce2f9 --- /dev/null +++ b/test/old-elf/Mips/rel-sub-micro.test @@ -0,0 +1,62 @@ +# Check handling of R_MICROMIPS_SUB relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 120002000 0020cc01 01000000 0020d001 0100ffff +# ^^ __start - 4 = 0x1200001cc +# ^^ __start - 0x1000000000000 +# = 0xffff0001200001d0 +# CHECK: SYMBOL TABLE: +# CHECK: 00000001200001d0 g .rodata 00000008 __start + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_MICROMIPS] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 8 + AddressAlign: 16 + Flags: [SHF_ALLOC] + +- Name: .data + Type: SHT_PROGBITS + Size: 16 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: __start + Type: R_MICROMIPS_SUB + Addend: 4 + - Offset: 8 + Symbol: __start + Type: R_MICROMIPS_SUB + Addend: 0x1000000000000 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0 + Size: 8 + - Name: D1 + Section: .data + Value: 0 + Size: 8 + - Name: D2 + Section: .data + Value: 8 + Size: 8 diff --git a/test/old-elf/Mips/rel-sub.test b/test/old-elf/Mips/rel-sub.test new file mode 100644 index 000000000000..5100406fd5d5 --- /dev/null +++ b/test/old-elf/Mips/rel-sub.test @@ -0,0 +1,61 @@ +# Check handling of R_MIPS_SUB relocation. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .data: +# CHECK-NEXT: 120002000 cf010020 01000000 d0010020 0100ffff ... ....... .... +# ^^ __start - 1 = 0x1200001cf +# ^^ __start - 0x1000000000000 +# = 0Xffff0001200001d0 +# CHECK: SYMBOL TABLE: +# CHECK: 00000001200001d0 g .rodata 00000008 __start + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Size: 0x08 + AddressAlign: 16 + Flags: [SHF_ALLOC] +- Name: .data + Type: SHT_PROGBITS + Size: 0x10 + AddressAlign: 16 + Flags: [SHF_ALLOC, SHF_WRITE] + +- Name: .rela.data + Type: SHT_RELA + Info: .data + AddressAlign: 4 + Relocations: + - Offset: 0x0 + Symbol: __start + Type: R_MIPS_SUB + Addend: 1 + - Offset: 0x8 + Symbol: __start + Type: R_MIPS_SUB + Addend: 0x1000000000000 + +Symbols: + Global: + - Name: __start + Section: .text + Value: 0x0 + Size: 8 + - Name: data1 + Section: .data + Value: 0x0 + Size: 8 + - Name: data2 + Section: .data + Value: 0x8 + Size: 8 diff --git a/test/old-elf/Mips/rld_map.test b/test/old-elf/Mips/rld_map.test new file mode 100644 index 000000000000..ee063be1d7fc --- /dev/null +++ b/test/old-elf/Mips/rld_map.test @@ -0,0 +1,42 @@ +# REQUIRES: mips + +# Check definition of DT_MIPS_RLD_MAP and DT_MIPS_RLD_MAP_REL dynamic tags, +# .rld_map section, and __RLD_MAP symbol. + +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o +# RUN: lld -flavor old-gnu -target mips %t.o -o %t.exe +# RUN: llvm-readobj -dynamic-table -s -st %t.exe \ +# RUN: | FileCheck -check-prefix=EXE-DYN %s + +# EXE-DYN: Name: .rld_map +# EXE-DYN-NEXT: Type: SHT_PROGBITS +# EXE-DYN-NEXT: Flags [ +# EXE-DYN-NEXT: SHF_ALLOC +# EXE-DYN-NEXT: SHF_WRITE +# EXE-DYN-NEXT: ] +# EXE-DYN-NEXT: Address: 0x[[ADDR:[0-9A-F]+]] +# EXE-DYN: Size: 4 +# EXE-DYN: AddressAlignment: 4 +# EXE-DYN: Symbols [ +# EXE-DYN-NEXT: Symbol { +# EXE-DYN-NEXT: Name: __RLD_MAP +# EXE-DYN-NEXT: Value: 0x[[ADDR]] +# EXE-DYN-NEXT: Size: 4 +# EXE-DYN-NEXT: Binding: Global +# EXE-DYN-NEXT: Type: Object +# +# EXE-DYN: 0x70000016 MIPS_RLD_MAP 0x[[ADDR]] +# EXE-DYN: 0x70000035 MIPS_RLD_MAP_REL 0x1E48 + +# RUN: lld -flavor old-gnu -target mips -static %t.o -o %t.exe +# RUN: llvm-nm -just-symbol-name %t.exe | FileCheck -check-prefix=EXE-STATIC %s + +# EXE-STATIC-NOT: __RLD_MAP + +# RUN: lld -flavor old-gnu -target mips -shared %t.o -o %t.so +# RUN: llvm-nm -just-symbol-name %t.so | FileCheck -check-prefix=DYNLIB %s + +# DYNLIB-NOT: __RLD_MAP + + .globl __start; +__start: diff --git a/test/old-elf/Mips/sign-rela.test b/test/old-elf/Mips/sign-rela.test new file mode 100644 index 000000000000..3e5341f2c230 --- /dev/null +++ b/test/old-elf/Mips/sign-rela.test @@ -0,0 +1,54 @@ +# Check that relocation addend read from RELA record is not sign-extended. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: {{[0-9a-f]+}} 01000000 00000000 ........ + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 0x20008 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0x20000 + Symbol: __start + Type: R_MIPS_PC16 + Addend: 0x20000 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 16 + Size: 0 + +Symbols: + Local: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + Global: + - Name: __start + Type: STT_FUNC + Section: .text + Value: 4 + Size: 0x20004 +... diff --git a/test/old-elf/Mips/st-other.test b/test/old-elf/Mips/st-other.test new file mode 100644 index 000000000000..2bb1f8b96e07 --- /dev/null +++ b/test/old-elf/Mips/st-other.test @@ -0,0 +1,90 @@ +# Check STO_MICROMIPS flag handling. microMIPS symbol records in a dynamic +# symbol table should not have STO_MICROMIPS flag but their value field +# must be odd. microMIPS symbol records in a regular symbol table should +# have the STO_MICROMIPS flag. + +# RUN: yaml2obj -format=elf %s > %t-micro.o + +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-micro.o +# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck -check-prefix=SO %s + +# RUN: lld -flavor old-gnu -target mipsel -e S0 -o %t.exe %t-micro.o +# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=EXE-SYM %s +# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=EXE-DSYM %s + +# SO: Symbol { +# SO: Name: S0@ (1) +# SO-NEXT: Value: 0x{{[0-9A-F]+}} +# SO-NEXT: Size: 4 +# SO-NEXT: Binding: Global (0x1) +# SO-NEXT: Type: Function (0x2) +# SO-NEXT: Other: 0 +# SO-NEXT: Section: .text (0x4) +# SO-NEXT: } + +# SO: Symbol { +# SO: Name: S1@ (4) +# SO-NEXT: Value: 0x{{[0-9A-F]+}} +# SO-NEXT: Size: 4 +# SO-NEXT: Binding: Global (0x1) +# SO-NEXT: Type: Function (0x2) +# SO-NEXT: Other: 0 +# SO-NEXT: Section: .text (0x4) +# SO-NEXT: } + +# EXE-SYM: Symbol { +# EXE-SYM: Name: S0 (1) +# EXE-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# EXE-SYM-NEXT: Size: 4 +# EXE-SYM-NEXT: Binding: Global (0x1) +# EXE-SYM-NEXT: Type: Function (0x2) +# EXE-SYM-NEXT: Other: 0 +# EXE-SYM-NEXT: Section: .text (0x5) +# EXE-SYM-NEXT: } + +# EXE-SYM: Symbol { +# EXE-SYM: Name: S1 (4) +# EXE-SYM-NEXT: Value: 0x{{[0-9A-F]+}} +# EXE-SYM-NEXT: Size: 4 +# EXE-SYM-NEXT: Binding: Global (0x1) +# EXE-SYM-NEXT: Type: Function (0x2) +# EXE-SYM-NEXT: Other: 128 +# EXE-SYM-NEXT: Section: .text (0x5) +# EXE-SYM-NEXT: } + +# EXE-DSYM-NOT: Name: S1 (4) + +# micro.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + +Symbols: + Global: + - Name: S0 + Type: STT_FUNC + Section: .text + Size: 0x04 + Value: 0x00 + Visibility: STV_DEFAULT + Other: [ ] + + - Name: S1 + Type: STT_FUNC + Section: .text + Size: 0x04 + Value: 0x04 + Visibility: STV_DEFAULT + Other: [ STO_MIPS_MICROMIPS ] +... diff --git a/test/old-elf/Mips/static-01.test b/test/old-elf/Mips/static-01.test new file mode 100644 index 000000000000..77a33469df3f --- /dev/null +++ b/test/old-elf/Mips/static-01.test @@ -0,0 +1,119 @@ +# Check handling relocations against _gp/__gnu_local_gp symbols +# in case of "-static" linking. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t1.o %t2.o +# RUN: llvm-nm %t.exe | FileCheck %s + +# CHECK: 00401000 N _GLOBAL_OFFSET_TABLE_ +# CHECK: 00408ff0 A __gnu_local_gp +# CHECK: 00408ff0 A _gp +# CHECK: 00408ff0 A _gp_disp + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 28 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: .data + Type: R_MIPS_HI16 + - Offset: 4 + Symbol: .data + Type: R_MIPS_LO16 + - Offset: 8 + Symbol: T1 + Type: R_MIPS_26 + - Offset: 12 + Symbol: _gp + Type: R_MIPS_HI16 + - Offset: 16 + Symbol: _gp + Type: R_MIPS_LO16 + - Offset: 20 + Symbol: __gnu_local_gp + Type: R_MIPS_HI16 + - Offset: 24 + Symbol: __gnu_local_gp + Type: R_MIPS_LO16 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 16 + Size: 4 + + - Name: .pdr + Type: SHT_PROGBITS + AddressAlign: 4 + Size: 4 + + - Name: .rel.pdr + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .pdr + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MIPS_32 + +Symbols: + Local: + - Type: STT_SECTION + Section: .text + - Type: STT_SECTION + Section: .data + - Type: STT_SECTION + Section: .pdr + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 28 + - Name: T1 + - Name: _gp + - Name: __gnu_local_gp + +# o2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 4 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 20 +... diff --git a/test/old-elf/Mips/tls-1-micro.test b/test/old-elf/Mips/tls-1-micro.test new file mode 100644 index 000000000000..f47592a5ab7d --- /dev/null +++ b/test/old-elf/Mips/tls-1-micro.test @@ -0,0 +1,65 @@ +# Check handling of R_MICROMIPS_TLS_TPREL_HI16 / R_MICROMIPS_TLS_TPREL_LO16 +# relocations. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e L0 -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: {{[0-9A-F]+}} 00000000 00000100 00000380 00000480 + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Content: '00000100000002000000030000000400' + - Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: L1 + Type: R_MICROMIPS_TLS_TPREL_HI16 + - Offset: 0x04 + Symbol: L2 + Type: R_MICROMIPS_TLS_TPREL_HI16 + - Offset: 0x08 + Symbol: L2 + Type: R_MICROMIPS_TLS_TPREL_LO16 + - Offset: 0x0C + Symbol: L1 + Type: R_MICROMIPS_TLS_TPREL_LO16 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Address: 0x1000 + Size: 0x20000 + +Symbols: + Global: + - Name: L0 + Type: STT_FUNC + Section: .text + Size: 0x58 + Other: [ STO_MIPS_MICROMIPS ] + - Name: L1 + Type: STT_TLS + Section: .tdata + Value: 0x00 + Size: 0x04 + - Name: L2 + Type: STT_TLS + Section: .tdata + Value: 0x10000 + Size: 0x04 diff --git a/test/old-elf/Mips/tls-1.test b/test/old-elf/Mips/tls-1.test new file mode 100644 index 000000000000..c25a06c1dee9 --- /dev/null +++ b/test/old-elf/Mips/tls-1.test @@ -0,0 +1,63 @@ +# Check handling of R_MIPS_TLS_TPREL_HI16 / R_MIPS_TLS_TPREL_LO16 relocations. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e L0 -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK: {{[0-9A-F]+}} 00000000 01000000 03800000 04800000 + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Content: '01000000020000000300000004000000' + - Name: .rel.text + Type: SHT_REL + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: L1 + Type: R_MIPS_TLS_TPREL_HI16 + - Offset: 0x04 + Symbol: L2 + Type: R_MIPS_TLS_TPREL_HI16 + - Offset: 0x08 + Symbol: L2 + Type: R_MIPS_TLS_TPREL_LO16 + - Offset: 0x0C + Symbol: L1 + Type: R_MIPS_TLS_TPREL_LO16 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Address: 0x1000 + Size: 0x20000 + +Symbols: + Global: + - Name: L0 + Type: STT_FUNC + Section: .text + Size: 0x58 + - Name: L1 + Type: STT_TLS + Section: .tdata + Value: 0x00 + Size: 0x04 + - Name: L2 + Type: STT_TLS + Section: .tdata + Value: 0x10000 + Size: 0x04 diff --git a/test/old-elf/Mips/tls-2-64-static.test b/test/old-elf/Mips/tls-2-64-static.test new file mode 100644 index 000000000000..c8c30ea06c60 --- /dev/null +++ b/test/old-elf/Mips/tls-2-64-static.test @@ -0,0 +1,71 @@ +# Check handling of R_MIPS_TLS_GD relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 120000120 20800000 30800000 +# ^ -32736 ^ -32720 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 120001000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080 +# CHECK-NEXT: 120002010 01000000 00000000 0480ffff ffffffff +# CHECK-NEXT: 120002020 01000000 00000000 0c80ffff ffffffff +# D1 0x120001000 + 4 - (0x120001000 + 0x8000) = 0xffff8004 => 0480ffff +# D2 0x120001040 + 8 - (0x120001000 + 0x8000) = 0xffff800c => 0c80ffff + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_TLS_GD + Addend: 4 + - Offset: 4 + Symbol: D2 + Type: R_MIPS_TLS_GD + Addend: 8 + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 + - Name: D1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: D2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 +... diff --git a/test/old-elf/Mips/tls-2-64.test b/test/old-elf/Mips/tls-2-64.test new file mode 100644 index 000000000000..3a6f6b3bedea --- /dev/null +++ b/test/old-elf/Mips/tls-2-64.test @@ -0,0 +1,69 @@ +# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations +# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL64, +# R_MIPS_TLS_DTPMOD64 and R_MIPS_TLS_DTPREL64 in case of shared library. + +# Create a shared library with thread symbol D1. +# RUN: yaml2obj -format=elf -o %t-so.o %s +# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o + +# Check dynamic relocations and GOT in the shared library. +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s + +# REL: Section (4) .rel.dyn { +# REL-NEXT: 0x2010 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE D1 0x0 +# REL-NEXT: 0x2018 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE D1 0x0 +# REL-NEXT: } + +# DYN: 0x000000007000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x0000000070000013 MIPS_GOTSYM 0x3 + +# SYM: Name: T1@ (1) +# SYM: Name: D1@ (4) + +# GOT: Contents of section .got: +# GOT-NEXT: 2000 00000000 00000000 00000000 00000080 ................ +# GOT-NEXT: 2010 00000000 00000000 00000000 00000000 ................ + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 4 + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 4 + - Name: D1 + Type: STT_TLS + Section: .tdata + Size: 8 +... diff --git a/test/old-elf/Mips/tls-2-micro.test b/test/old-elf/Mips/tls-2-micro.test new file mode 100644 index 000000000000..88d8797cd06a --- /dev/null +++ b/test/old-elf/Mips/tls-2-micro.test @@ -0,0 +1,70 @@ +# Check handling of R_MICROMIPS_TLS_GOTTPREL and R_MICROMIPS_TLS_GD relocations +# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32, +# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of shared library. + +# Create a shared library with thread symbol D1. +# RUN: yaml2obj -format=elf -o %t-so.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Check dynamic relocations and GOT in the shared library. +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s + +# REL: Section (4) .rel.dyn { +# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 D1 0x0 +# REL-NEXT: 0x200C R_MIPS_TLS_DTPREL32 D1 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x3 + +# SYM: Name: T1@ (1) +# SYM: Name: D1@ (4) + +# GOT: Contents of section .got: +# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................ + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MICROMIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D1 + Type: STT_TLS + Section: .tdata + Size: 0x04 +... diff --git a/test/old-elf/Mips/tls-2-static.test b/test/old-elf/Mips/tls-2-static.test new file mode 100644 index 000000000000..3ac2122628d6 --- /dev/null +++ b/test/old-elf/Mips/tls-2-static.test @@ -0,0 +1,125 @@ +# Check handling of R_MIPS_TLS_GD relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -docnum 1 -o %t1.o %s +# RUN: yaml2obj -format=elf -docnum 2 -o %t2.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t1.o %t2.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 4000b4 18800000 20800000 28800000 30800000 +# ^ -32744 ^ -32736 ^ -32728 ^ -32720 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 401000 00000000 00000000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 402000 00000000 00000080 01000000 0480ffff +# CHECK-NEXT: 402010 01000000 0c80ffff 01000000 0c80ffff +# CHECK-NEXT: 402020 01000000 1480ffff +# D1 0x401000 + 4 - (0x401000 + 0x8000) = 0xffff8004 => 0480ffff +# D2 0x401004 + 8 - (0x401000 + 0x8000) = 0xffff800c => 0c80ffff +# D3 0x401008 + 4 - (0x401000 + 0x8000) = 0xffff800c => 0c80ffff +# D4 0x40100c + 8 - (0x401000 + 0x8000) = 0xffff8014 => 1480ffff + +# t1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Content: "0400000008000000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_TLS_GD + - Offset: 4 + Symbol: D2 + Type: R_MIPS_TLS_GD + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 + - Name: D1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: D2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 + +# t2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Content: "0400000008000000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D3 + Type: R_MIPS_TLS_GD + - Offset: 4 + Symbol: D4 + Type: R_MIPS_TLS_GD + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 8 + - Name: D3 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: D4 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 +... diff --git a/test/old-elf/Mips/tls-2.test b/test/old-elf/Mips/tls-2.test new file mode 100644 index 000000000000..de8fc2a70861 --- /dev/null +++ b/test/old-elf/Mips/tls-2.test @@ -0,0 +1,69 @@ +# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations +# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32, +# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of shared library. + +# Create a shared library with thread symbol D1. +# RUN: yaml2obj -format=elf -o %t-so.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Check dynamic relocations and GOT in the shared library. +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s + +# REL: Section (4) .rel.dyn { +# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 D1 0x0 +# REL-NEXT: 0x200C R_MIPS_TLS_DTPREL32 D1 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x3 + +# SYM: Name: T1@ (1) +# SYM: Name: D1@ (4) + +# GOT: Contents of section .got: +# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................ + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x04 + - Name: D1 + Type: STT_TLS + Section: .tdata + Size: 0x04 +... diff --git a/test/old-elf/Mips/tls-3-64-static.test b/test/old-elf/Mips/tls-3-64-static.test new file mode 100644 index 000000000000..2183d1fd6833 --- /dev/null +++ b/test/old-elf/Mips/tls-3-64-static.test @@ -0,0 +1,70 @@ +# Check handling of R_MIPS_TLS_GOTTPREL relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 120000120 20800000 28800000 +# ^ -32736 ^ -32728 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 120001000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080 +# CHECK-NEXT: 120002010 0490ffff ffffffff 0c90ffff ffffffff +# D1 0x120001000 + 4 - (0x120001000 + 0x7000) = 0xffff9004 => 0490ffff +# D2 0x120001004 + 8 - (0x120001000 + 0x7000) = 0xffff900c => 0c90ffff + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_TLS_GOTTPREL + Addend: 4 + - Offset: 4 + Symbol: D2 + Type: R_MIPS_TLS_GOTTPREL + Addend: 8 + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: D1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: D2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 +... diff --git a/test/old-elf/Mips/tls-3-micro.test b/test/old-elf/Mips/tls-3-micro.test new file mode 100644 index 000000000000..347332e6633e --- /dev/null +++ b/test/old-elf/Mips/tls-3-micro.test @@ -0,0 +1,183 @@ +# Check handling of R_MICROMIPS_TLS_GOTTPREL and R_MICROMIPS_TLS_GD relocations +# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32, +# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of executable linking. + +# Create a shared library with thread symbol D1. +# RUN: yaml2obj -format=elf -docnum 1 -o %t-so.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Create executable file linked using two object files and the shared library. +# The object files defines thread symbols D0 and D2. +# RUN: yaml2obj -format=elf -docnum 2 -o %t-o1.o %s +# RUN: yaml2obj -format=elf -docnum 3 -o %t-o2.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o %t.so + +# Check dynamic relocations and GOT in the executable file. +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=GOT %s + +# REL: Section (5) .rel.dyn { +# REL-NEXT: 0x402008 R_MIPS_TLS_TPREL32 D1 0x0 +# REL-NEXT: 0x40200C R_MIPS_TLS_TPREL32 D2 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x3 + +# SYM: Name: D2@ (1) +# SYM: Name: D1@ (4) + +# GOT: Contents of section .got: +# GOT-NEXT: 402000 00000000 00000080 00000000 00000000 ................ + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MICROMIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D1 + Type: STT_TLS + Section: .tdata + Size: 0x04 + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D2 + Type: R_MICROMIPS_TLS_TPREL_HI16 + - Offset: 0x04 + Symbol: D2 + Type: R_MICROMIPS_TLS_TPREL_LO16 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T2 + Type: STT_FUNC + Section: .text + Size: 0x08 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D2 + Type: STT_TLS + Section: .tdata + Size: 0x04 + +# o2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x10 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MICROMIPS_TLS_GOTTPREL + Addend: 0 + - Offset: 0x04 + Symbol: D0 + Type: R_MICROMIPS_TLS_TPREL_HI16 + Addend: 0 + - Offset: 0x08 + Symbol: D0 + Type: R_MICROMIPS_TLS_TPREL_LO16 + Addend: 0 + - Offset: 0x0C + Symbol: D2 + Type: R_MICROMIPS_TLS_GOTTPREL + Addend: 0 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: D0 + Type: STT_TLS + Section: .tdata + Size: 0x04 + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x10 + Other: [ STO_MIPS_MICROMIPS ] + - Name: D1 + Type: STT_TLS + - Name: D2 + Type: STT_TLS +... diff --git a/test/old-elf/Mips/tls-3-static.test b/test/old-elf/Mips/tls-3-static.test new file mode 100644 index 000000000000..5d3a7b8bfd6a --- /dev/null +++ b/test/old-elf/Mips/tls-3-static.test @@ -0,0 +1,67 @@ +# Check handling of R_MIPS_TLS_GOTTPREL relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 4000b4 18800000 1c800000 +# ^ -32744 ^ -32740 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 401000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 402000 00000000 00000080 0490ffff 0c90ffff +# D1 0x401000 + 4 - (0x401000 + 0x7000) = 0xffff9004 => 0490ffff +# D2 0x401004 + 8 - (0x401000 + 0x7000) = 0xffff900c => 0c90ffff + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Content: "0400000008000000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 4 + Relocations: + - Offset: 0 + Symbol: D1 + Type: R_MIPS_TLS_GOTTPREL + - Offset: 4 + Symbol: D2 + Type: R_MIPS_TLS_GOTTPREL + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: D1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: D2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 +... diff --git a/test/old-elf/Mips/tls-3.test b/test/old-elf/Mips/tls-3.test new file mode 100644 index 000000000000..eb9750fee28d --- /dev/null +++ b/test/old-elf/Mips/tls-3.test @@ -0,0 +1,180 @@ +# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations +# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32, +# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of executable linking. + +# Create a shared library with thread symbol D1. +# RUN: yaml2obj -format=elf -docnum 1 -o %t-so.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o + +# Create executable file linked using two object files and the shared library. +# The object files defines thread symbols D0 and D2. +# RUN: yaml2obj -format=elf -docnum 2 -o %t-o1.o %s +# RUN: yaml2obj -format=elf -docnum 3 -o %t-o2.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o %t.so + +# Check dynamic relocations and GOT in the executable file. +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=GOT %s + +# REL: Section (5) .rel.dyn { +# REL-NEXT: 0x402008 R_MIPS_TLS_TPREL32 D1 0x0 +# REL-NEXT: 0x40200C R_MIPS_TLS_TPREL32 D2 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x3 + +# SYM: Name: D2@ (1) +# SYM: Name: D1@ (4) + +# GOT: Contents of section .got: +# GOT-NEXT: 402000 00000000 00000080 00000000 00000000 ................ + +# so.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 0x04 + - Name: D1 + Type: STT_TLS + Section: .tdata + Size: 0x04 + +# o1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D2 + Type: R_MIPS_TLS_TPREL_HI16 + - Offset: 0x04 + Symbol: D2 + Type: R_MIPS_TLS_TPREL_LO16 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T2 + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: D2 + Type: STT_TLS + Section: .tdata + Size: 0x04 + +# o2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x10 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + AddressAlign: 0x04 + Relocations: + - Offset: 0x00 + Symbol: D1 + Type: R_MIPS_TLS_GOTTPREL + Addend: 0 + - Offset: 0x04 + Symbol: D0 + Type: R_MIPS_TLS_TPREL_HI16 + Addend: 0 + - Offset: 0x08 + Symbol: D0 + Type: R_MIPS_TLS_TPREL_LO16 + Addend: 0 + - Offset: 0x0C + Symbol: D2 + Type: R_MIPS_TLS_GOTTPREL + Addend: 0 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: D0 + Type: STT_TLS + Section: .tdata + Size: 0x04 + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x10 + - Name: D1 + Type: STT_TLS + - Name: D2 + Type: STT_TLS +... diff --git a/test/old-elf/Mips/tls-4-64-static.test b/test/old-elf/Mips/tls-4-64-static.test new file mode 100644 index 000000000000..3aa37046d36b --- /dev/null +++ b/test/old-elf/Mips/tls-4-64-static.test @@ -0,0 +1,71 @@ +# Check handling of R_MIPS_TLS_LDM relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 120000120 20800000 20800000 +# ^ -32736 ^ -32736 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 120001000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080 +# CHECK-NEXT: 120002010 01000000 00000000 00000000 00000000 +# ^ R_MIPS_TLS_DTPMOD64 + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 8 + + - Name: .rel.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: L1 + Type: R_MIPS_TLS_LDM + Addend: 4 + - Offset: 4 + Symbol: L2 + Type: R_MIPS_TLS_LDM + Addend: 8 + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Local: + - Name: L1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: L2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 +... diff --git a/test/old-elf/Mips/tls-4-micro.test b/test/old-elf/Mips/tls-4-micro.test new file mode 100644 index 000000000000..23d8e0a1de31 --- /dev/null +++ b/test/old-elf/Mips/tls-4-micro.test @@ -0,0 +1,126 @@ +# Check handling of R_MICROMIPS_TLS_LDM relocation and generation +# of corresponding dynamic relocation R_MICROMIPS_TLS_DTPMOD32. + +# RUN: yaml2obj -format=elf -docnum 1 -o %t-so1.o %s +# RUN: yaml2obj -format=elf -docnum 2 -o %t-so2.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so1.o %t-so2.o + +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s + +# REL: Section (4) .rel.dyn { +# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 - 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x4 + +# SYM: Name: @ (0) +# SYM: Name: T1@ (1) +# SYM: Name: T2@ (4) +# SYM: Name: T3@ (7) + +# GOT: Contents of section .got: +# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................ +# Two LDM entries --^--------^ + +# so1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: L01 + Type: R_MICROMIPS_TLS_LDM + - Offset: 0x04 + Symbol: L01 + Type: R_MICROMIPS_TLS_LDM + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Local: + - Name: L01 + Type: STT_TLS + Section: .tdata + Size: 0x04 + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0x00 + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T2 + Type: STT_FUNC + Section: .text + Value: 0x04 + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] + +# so2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: L02 + Type: R_MICROMIPS_TLS_LDM + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Local: + - Name: L02 + Type: STT_TLS + Section: .tdata + Size: 0x04 + Global: + - Name: T3 + Type: STT_FUNC + Section: .text + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] +... diff --git a/test/old-elf/Mips/tls-4-static.test b/test/old-elf/Mips/tls-4-static.test new file mode 100644 index 000000000000..5fdb11df874b --- /dev/null +++ b/test/old-elf/Mips/tls-4-static.test @@ -0,0 +1,68 @@ +# Check handling of R_MIPS_TLS_LDM relocation in case of -static linking. + +# RUN: yaml2obj -format=elf -o %t.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t.o +# RUN: llvm-objdump -s %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 4000b4 18800000 18800000 +# ^ -32744 ^ -32744 +# CHECK-NEXT: Contents of section .tdata: +# CHECK-NEXT: 401000 00000000 00000000 +# CHECK-NEXT: Contents of section .got: +# CHECK-NEXT: 402000 00000000 00000080 01000000 00000000 +# ^ R_MIPS_TLS_DTPMOD32 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Content: "0400000008000000" + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: L1 + Type: R_MIPS_TLS_LDM + - Offset: 4 + Symbol: L2 + Type: R_MIPS_TLS_LDM + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Local: + - Name: L1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 4 + - Name: L2 + Type: STT_TLS + Section: .tdata + Value: 4 + Size: 4 + + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 +... diff --git a/test/old-elf/Mips/tls-4.test b/test/old-elf/Mips/tls-4.test new file mode 100644 index 000000000000..95df6d67151f --- /dev/null +++ b/test/old-elf/Mips/tls-4.test @@ -0,0 +1,123 @@ +# Check handling of R_MIPS_TLS_LDM relocation and generation of corresponding +# dynamic relocation R_MIPS_TLS_DTPMOD32. + +# RUN: yaml2obj -format=elf -docnum 1 -o %t-so1.o %s +# RUN: yaml2obj -format=elf -docnum 2 -o %t-so2.o %s +# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so1.o %t-so2.o + +# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s +# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s +# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s + +# REL: Section (4) .rel.dyn { +# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 - 0x0 +# REL-NEXT: } + +# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2 +# DYN: 0x70000013 MIPS_GOTSYM 0x4 + +# SYM: Name: @ (0) +# SYM: Name: T1@ (1) +# SYM: Name: T2@ (4) +# SYM: Name: T3@ (7) + +# GOT: Contents of section .got: +# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................ +# Two LDM entries --^--------^ + +# so1.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: L01 + Type: R_MIPS_TLS_LDM + - Offset: 0x04 + Symbol: L01 + Type: R_MIPS_TLS_LDM + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Local: + - Name: L01 + Type: STT_TLS + Section: .tdata + Size: 0x04 + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 0x00 + Size: 0x04 + - Name: T2 + Type: STT_FUNC + Section: .text + Value: 0x04 + Size: 0x04 + +# so2.o +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: L02 + Type: R_MIPS_TLS_LDM + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Local: + - Name: L02 + Type: STT_TLS + Section: .tdata + Size: 0x04 + Global: + - Name: T3 + Type: STT_FUNC + Section: .text + Size: 0x04 +... diff --git a/test/old-elf/Mips/tls-5-64.test b/test/old-elf/Mips/tls-5-64.test new file mode 100644 index 000000000000..43e6e6c1cf30 --- /dev/null +++ b/test/old-elf/Mips/tls-5-64.test @@ -0,0 +1,71 @@ +# Check that in case of an executable file linking symbol referred +# by the R_MIPS_TLS_GD relocation gets an entry in the dynamic symbol table. + +# RUN: yaml2obj -format=elf -o %t-o.o %s +# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o + +# Check dynamic relocations: +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s +# Check dynamic symbol table: +# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s + +# REL: Relocations [ +# REL-NEXT: Section (5) .rel.dyn { +# REL-NEXT: 0x120002010 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE T1 0x0 +# REL-NEXT: 0x120002018 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +# SYM: Symbol { +# SYM: Name: T1@ (1) +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 8 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: TLS (0x6) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .tdata (0x7) +# SYM-NEXT: } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 8 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_TLS_GD + + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 4 + Size: 8 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 + - Name: T1 + Type: STT_TLS + Section: .tdata + Value: 0 + Size: 8 +... diff --git a/test/old-elf/Mips/tls-5-micro.test b/test/old-elf/Mips/tls-5-micro.test new file mode 100644 index 000000000000..412456417826 --- /dev/null +++ b/test/old-elf/Mips/tls-5-micro.test @@ -0,0 +1,70 @@ +# Check that in case of an executable file linking symbol referred by +# the R_MICROMIPS_TLS_GD relocation gets an entry in the dynamic symbol table. + +# RUN: yaml2obj -format=elf -o %t-o.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o + +# Check dynamic relocations: +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s +# Check dynamic symbol table: +# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s + +# REL: Relocations [ +# REL-NEXT: Section (5) .rel.dyn { +# REL-NEXT: 0x402008 R_MIPS_TLS_DTPMOD32 T1 0x0 +# REL-NEXT: 0x40200C R_MIPS_TLS_DTPREL32 T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +# SYM: Symbol { +# SYM: Name: T1@ (1) +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: TLS (0x6) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .tdata (0x7) +# SYM-NEXT: } + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MICROMIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x04 + Other: [ STO_MIPS_MICROMIPS ] + - Name: T1 + Type: STT_TLS + Section: .tdata + Value: 0x00 + Size: 0x04 +... diff --git a/test/old-elf/Mips/tls-5.test b/test/old-elf/Mips/tls-5.test new file mode 100644 index 000000000000..cb71e3ac5f9e --- /dev/null +++ b/test/old-elf/Mips/tls-5.test @@ -0,0 +1,69 @@ +# Check that in case of an executable file linking symbol referred +# by the R_MIPS_TLS_GD relocation gets an entry in the dynamic symbol table. + +# RUN: yaml2obj -format=elf -o %t-o.o %s +# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o + +# Check dynamic relocations: +# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s +# Check dynamic symbol table: +# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s + +# REL: Relocations [ +# REL-NEXT: Section (5) .rel.dyn { +# REL-NEXT: 0x402008 R_MIPS_TLS_DTPMOD32 T1 0x0 +# REL-NEXT: 0x40200C R_MIPS_TLS_DTPREL32 T1 0x0 +# REL-NEXT: } +# REL-NEXT: ] + +# SYM: Symbol { +# SYM: Name: T1@ (1) +# SYM-NEXT: Value: 0x0 +# SYM-NEXT: Size: 4 +# SYM-NEXT: Binding: Global (0x1) +# SYM-NEXT: Type: TLS (0x6) +# SYM-NEXT: Other: 0 +# SYM-NEXT: Section: .tdata (0x7) +# SYM-NEXT: } + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, + EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 0x04 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: T1 + Type: R_MIPS_TLS_GD + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 0x04 + - Name: T1 + Type: STT_TLS + Section: .tdata + Value: 0x00 + Size: 0x04 +... diff --git a/test/old-elf/Mips/validate-rel-01.test b/test/old-elf/Mips/validate-rel-01.test new file mode 100644 index 000000000000..0b8734c5429e --- /dev/null +++ b/test/old-elf/Mips/validate-rel-01.test @@ -0,0 +1,82 @@ +# Check that the linker does not accept position-dependent relocations +# in case of shared library linking. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-hi.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t-hi.o 2>&1 \ +# RUN: | FileCheck -check-prefix=RHI %s + +# RHI: R_MIPS_HI16 (5) relocation cannot be used when making a shared object, recompile {{.*}}validate-rel-01.test.tmp-hi.o with -fPIC + +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-26.o +# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t-26.o 2>&1 \ +# RUN: | FileCheck -check-prefix=R26 %s + +# R26: R_MIPS_26 (4) relocation cannot be used when making a shared object, recompile {{.*}}validate-rel-01.test.tmp-26.o with -fPIC + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 4 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T0 + Type: R_MIPS_HI16 + - Offset: 0 + Symbol: T0 + Type: R_MIPS_LO16 + +Symbols: + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 4 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 4 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: T1 + Type: R_MIPS_26 + +Symbols: + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 4 +... diff --git a/test/old-elf/Mips/validate-rel-03.test b/test/old-elf/Mips/validate-rel-03.test new file mode 100644 index 000000000000..baf8516c63b0 --- /dev/null +++ b/test/old-elf/Mips/validate-rel-03.test @@ -0,0 +1,56 @@ +# Check that the linker does not accept R_MIPS_CALL16 relocation +# against local symbol. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.o +# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \ +# RUN: | FileCheck %s + +# CHECK: R_MIPS_CALL16 (11) relocation cannot be used against local symbol L0 in file {{.*}}validate-rel-03.test.tmp.o + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 16 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 8 + Symbol: T0 + Type: R_MIPS_CALL16 + - Offset: 4 + Symbol: L0 + Type: R_MIPS_CALL16 + +Symbols: + Local: + - Name: L0 + Type: STT_FUNC + Section: .text + Value: 0 + Size: 4 + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Value: 4 + Size: 4 + - Name: T1 + Type: STT_FUNC + Section: .text + Value: 8 + Size: 8 +... diff --git a/test/old-elf/X86_64/ExampleTarget/triple.test b/test/old-elf/X86_64/ExampleTarget/triple.test new file mode 100644 index 000000000000..aec09eae3a30 --- /dev/null +++ b/test/old-elf/X86_64/ExampleTarget/triple.test @@ -0,0 +1,32 @@ +# Check that the Example Target is actually used. + +# RUN: yaml2obj -format=elf %s -o %t.o +# RUN: lld -flavor old-gnu -target x86_64-example-freebsd9 %t.o -o %t.exe +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s +# +# CHECK: Type: 0xFF00 + +# object + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Size: 0x0000000000000000 diff --git a/test/old-elf/X86_64/Inputs/constint.c b/test/old-elf/X86_64/Inputs/constint.c new file mode 100644 index 000000000000..9fc0ebcf6591 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/constint.c @@ -0,0 +1 @@ +const int b = 20; diff --git a/test/old-elf/X86_64/Inputs/constint.o b/test/old-elf/X86_64/Inputs/constint.o Binary files differnew file mode 100644 index 000000000000..8324b73014d0 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/constint.o diff --git a/test/old-elf/X86_64/Inputs/debug0.c b/test/old-elf/X86_64/Inputs/debug0.c new file mode 100644 index 000000000000..1ebe50087383 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/debug0.c @@ -0,0 +1,5 @@ +int adena(); + +int main() { +return adena(); +} diff --git a/test/old-elf/X86_64/Inputs/debug0.x86-64 b/test/old-elf/X86_64/Inputs/debug0.x86-64 Binary files differnew file mode 100644 index 000000000000..914f5224b9a2 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/debug0.x86-64 diff --git a/test/old-elf/X86_64/Inputs/debug1.c b/test/old-elf/X86_64/Inputs/debug1.c new file mode 100644 index 000000000000..281b8a361dbb --- /dev/null +++ b/test/old-elf/X86_64/Inputs/debug1.c @@ -0,0 +1,3 @@ +int adena() { +return 0; +} diff --git a/test/old-elf/X86_64/Inputs/debug1.x86-64 b/test/old-elf/X86_64/Inputs/debug1.x86-64 Binary files differnew file mode 100644 index 000000000000..bfc81458a034 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/debug1.x86-64 diff --git a/test/old-elf/X86_64/Inputs/externtls.c b/test/old-elf/X86_64/Inputs/externtls.c new file mode 100644 index 000000000000..499a645a9217 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/externtls.c @@ -0,0 +1,6 @@ +extern __thread int extern_tls; + +int main() { + extern_tls = 1; + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/externtls.x86-64 b/test/old-elf/X86_64/Inputs/externtls.x86-64 Binary files differnew file mode 100644 index 000000000000..3019aa0ca27c --- /dev/null +++ b/test/old-elf/X86_64/Inputs/externtls.x86-64 diff --git a/test/old-elf/X86_64/Inputs/fn.c b/test/old-elf/X86_64/Inputs/fn.c new file mode 100644 index 000000000000..54939a2426b2 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/fn.c @@ -0,0 +1,4 @@ +int fn() +{ + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/fn.o b/test/old-elf/X86_64/Inputs/fn.o Binary files differnew file mode 100644 index 000000000000..4b67d459dfdb --- /dev/null +++ b/test/old-elf/X86_64/Inputs/fn.o diff --git a/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml b/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml new file mode 100644 index 000000000000..53a7fb6435e9 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml @@ -0,0 +1,67 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E566488D3D00000000666648E8000000008B005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: mynumber + Type: R_X86_64_TLSGD + Addend: -4 + - Offset: 0x0000000000000010 + Symbol: __tls_get_addr + Type: R_X86_64_PLT32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: '21000000' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .tdata + Type: STT_SECTION + Section: .tdata + Global: + - Name: getnumber + Type: STT_FUNC + Section: .text + Size: 0x0000000000000018 + - Name: mynumber + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: _GLOBAL_OFFSET_TABLE_ + - Name: __tls_get_addr +... diff --git a/test/old-elf/X86_64/Inputs/group/1.c b/test/old-elf/X86_64/Inputs/group/1.c new file mode 100644 index 000000000000..f5e618bc4a85 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/1.c @@ -0,0 +1,8 @@ +int _start() { + return 0; +} + +int main() { +fn(); +return 0; +} diff --git a/test/old-elf/X86_64/Inputs/group/1.o b/test/old-elf/X86_64/Inputs/group/1.o Binary files differnew file mode 100644 index 000000000000..743518eb0fa3 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/1.o diff --git a/test/old-elf/X86_64/Inputs/group/fn.c b/test/old-elf/X86_64/Inputs/group/fn.c new file mode 100644 index 000000000000..e443c73a1ee0 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn.c @@ -0,0 +1,4 @@ +int fn() { +fn1(); +return 0; +} diff --git a/test/old-elf/X86_64/Inputs/group/fn.o b/test/old-elf/X86_64/Inputs/group/fn.o Binary files differnew file mode 100644 index 000000000000..1134432449cd --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn.o diff --git a/test/old-elf/X86_64/Inputs/group/fn1.c b/test/old-elf/X86_64/Inputs/group/fn1.c new file mode 100644 index 000000000000..cca0df7fd277 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn1.c @@ -0,0 +1,3 @@ +int fn1() { +fn2(); +} diff --git a/test/old-elf/X86_64/Inputs/group/fn1.o b/test/old-elf/X86_64/Inputs/group/fn1.o Binary files differnew file mode 100644 index 000000000000..2b02310003db --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn1.o diff --git a/test/old-elf/X86_64/Inputs/group/fn2.c b/test/old-elf/X86_64/Inputs/group/fn2.c new file mode 100644 index 000000000000..a60370ed1e6b --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn2.c @@ -0,0 +1,3 @@ +int fn2() { +return 0; +} diff --git a/test/old-elf/X86_64/Inputs/group/fn2.o b/test/old-elf/X86_64/Inputs/group/fn2.o Binary files differnew file mode 100644 index 000000000000..fabec849a775 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/fn2.o diff --git a/test/old-elf/X86_64/Inputs/group/group.sh b/test/old-elf/X86_64/Inputs/group/group.sh new file mode 100755 index 000000000000..2eba1030160b --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/group.sh @@ -0,0 +1,38 @@ +cat > 1.c << \! +int _start() { + return 0; +} + +int main() { +fn(); +return 0; +} +! + +cat > fn.c << \! +int fn() { +fn1(); +return 0; +} +! + +cat > fn2.c << \! +int fn2() { +return 0; +} +! + +cat > fn1.c << \! +int fn1() { +fn2(); +} +! + +gcc -c 1.c fn.c fn2.c fn1.c +ar cr libfn.a fn.o fn2.o +ar cr libfn1.a fn1.o +lld -flavor gnu -target x86_64 -shared -o libfn2.so fn2.o +lld -flavor gnu -target x86_64 1.o libfn.a libfn1.a -o x +lld -flavor gnu -target x86_64 1.o --start-group libfn.a libfn1.a --end-group -o x +lld -flavor gnu -target x86_64 1.o --start-group fn.o fn2.o fn1.o --end-group -o x +lld -flavor gnu -target x86_64 1.o --start-group --whole-archive libfn.a --no-whole-archive libfn1.a --end-group -o x diff --git a/test/old-elf/X86_64/Inputs/group/libfn.a b/test/old-elf/X86_64/Inputs/group/libfn.a Binary files differnew file mode 100644 index 000000000000..c157c3babed9 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/libfn.a diff --git a/test/old-elf/X86_64/Inputs/group/libfn.so b/test/old-elf/X86_64/Inputs/group/libfn.so Binary files differnew file mode 100755 index 000000000000..fcbd11fe5519 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/libfn.so diff --git a/test/old-elf/X86_64/Inputs/group/libfn1.a b/test/old-elf/X86_64/Inputs/group/libfn1.a Binary files differnew file mode 100644 index 000000000000..69b9c75b5d16 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/libfn1.a diff --git a/test/old-elf/X86_64/Inputs/group/libfn2.so b/test/old-elf/X86_64/Inputs/group/libfn2.so Binary files differnew file mode 100755 index 000000000000..7ce867373910 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/group/libfn2.so diff --git a/test/old-elf/X86_64/Inputs/initfini-option.c b/test/old-elf/X86_64/Inputs/initfini-option.c new file mode 100644 index 000000000000..e9a6c08c12ac --- /dev/null +++ b/test/old-elf/X86_64/Inputs/initfini-option.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +void init() { + printf("%s\n", __FUNCTION__); +} + +void fini() { + printf("%s\n", __FUNCTION__); +} + +int main() { +} + diff --git a/test/old-elf/X86_64/Inputs/initfini-option.o b/test/old-elf/X86_64/Inputs/initfini-option.o Binary files differnew file mode 100644 index 000000000000..b1ba0557353c --- /dev/null +++ b/test/old-elf/X86_64/Inputs/initfini-option.o diff --git a/test/old-elf/X86_64/Inputs/initfini.c b/test/old-elf/X86_64/Inputs/initfini.c new file mode 100644 index 000000000000..9427a86b6c9b --- /dev/null +++ b/test/old-elf/X86_64/Inputs/initfini.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +void __attribute__ ((constructor)) constructor() { + printf("%s\n", __FUNCTION__); +} + +void __attribute__ ((destructor)) destructor() { + printf("%s\n", __FUNCTION__); +} + +int main() { + return 0; +} + diff --git a/test/old-elf/X86_64/Inputs/initfini.o b/test/old-elf/X86_64/Inputs/initfini.o Binary files differnew file mode 100644 index 000000000000..f0e55a90b8b6 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/initfini.o diff --git a/test/old-elf/X86_64/Inputs/largebss.c b/test/old-elf/X86_64/Inputs/largebss.c new file mode 100644 index 000000000000..157d01755b6a --- /dev/null +++ b/test/old-elf/X86_64/Inputs/largebss.c @@ -0,0 +1,3 @@ +int largebss[1000] = { 0 }; +int largecommon[1000]; +__thread int largetbss[1000] = { 0 }; diff --git a/test/old-elf/X86_64/Inputs/largebss.o b/test/old-elf/X86_64/Inputs/largebss.o Binary files differnew file mode 100644 index 000000000000..377370ec2db2 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/largebss.o diff --git a/test/old-elf/X86_64/Inputs/layoutpass/1.c b/test/old-elf/X86_64/Inputs/layoutpass/1.c new file mode 100644 index 000000000000..fec984503214 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/1.c @@ -0,0 +1,8 @@ +int main() { + a(); + return 0; +} + +int b() { + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/layoutpass/1.o b/test/old-elf/X86_64/Inputs/layoutpass/1.o Binary files differnew file mode 100644 index 000000000000..848a5b3321ac --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/1.o diff --git a/test/old-elf/X86_64/Inputs/layoutpass/2.c b/test/old-elf/X86_64/Inputs/layoutpass/2.c new file mode 100644 index 000000000000..fb9dbcc28aa6 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/2.c @@ -0,0 +1,7 @@ +int a() { + return 0; +} + +int c() { + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/layoutpass/2.o b/test/old-elf/X86_64/Inputs/layoutpass/2.o Binary files differnew file mode 100644 index 000000000000..4c5ef8679581 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/2.o diff --git a/test/old-elf/X86_64/Inputs/layoutpass/3.c b/test/old-elf/X86_64/Inputs/layoutpass/3.c new file mode 100644 index 000000000000..054029fe5cfe --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/3.c @@ -0,0 +1,3 @@ +int d() { + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/layoutpass/3.o b/test/old-elf/X86_64/Inputs/layoutpass/3.o Binary files differnew file mode 100644 index 000000000000..76ef76e97901 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/3.o diff --git a/test/old-elf/X86_64/Inputs/layoutpass/lib2.a b/test/old-elf/X86_64/Inputs/layoutpass/lib2.a Binary files differnew file mode 100644 index 000000000000..5f076c869817 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/layoutpass/lib2.a diff --git a/test/old-elf/X86_64/Inputs/libfn.a b/test/old-elf/X86_64/Inputs/libfn.a Binary files differnew file mode 100644 index 000000000000..380844b0838d --- /dev/null +++ b/test/old-elf/X86_64/Inputs/libfn.a diff --git a/test/old-elf/X86_64/Inputs/libfn.so b/test/old-elf/X86_64/Inputs/libfn.so Binary files differnew file mode 100755 index 000000000000..dc02480aa690 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/libfn.so diff --git a/test/old-elf/X86_64/Inputs/main.c b/test/old-elf/X86_64/Inputs/main.c new file mode 100644 index 000000000000..0280c9127076 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/main.c @@ -0,0 +1,4 @@ +int main() { + fn(); + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/main.o b/test/old-elf/X86_64/Inputs/main.o Binary files differnew file mode 100644 index 000000000000..ec8929f4b51d --- /dev/null +++ b/test/old-elf/X86_64/Inputs/main.o diff --git a/test/old-elf/X86_64/Inputs/multi-ovrd.c b/test/old-elf/X86_64/Inputs/multi-ovrd.c new file mode 100644 index 000000000000..cf6c0b6ac361 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/multi-ovrd.c @@ -0,0 +1,10 @@ +#include <stdio.h> +void f(void) +{ + printf("overridden f!\n"); +} + +void g(void) +{ + printf("overridden g!\n"); +} diff --git a/test/old-elf/X86_64/Inputs/multi-ovrd.o b/test/old-elf/X86_64/Inputs/multi-ovrd.o Binary files differnew file mode 100644 index 000000000000..e4c4d6037fdd --- /dev/null +++ b/test/old-elf/X86_64/Inputs/multi-ovrd.o diff --git a/test/old-elf/X86_64/Inputs/multi-weak.c b/test/old-elf/X86_64/Inputs/multi-weak.c new file mode 100644 index 000000000000..10b9160352d9 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/multi-weak.c @@ -0,0 +1,20 @@ +int fn() +{ + return 0; +} + +void __attribute__((weak)) f() +{ + printf("original f..\n"); +} + +void __attribute__((weak)) g() +{ + printf("original f..\n"); +} + +int main(void) +{ + f(); + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/multi-weak.o b/test/old-elf/X86_64/Inputs/multi-weak.o Binary files differnew file mode 100644 index 000000000000..d5677b699ac4 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/multi-weak.o diff --git a/test/old-elf/X86_64/Inputs/multiweaksyms.o b/test/old-elf/X86_64/Inputs/multiweaksyms.o Binary files differnew file mode 100644 index 000000000000..5e2e54d66b0d --- /dev/null +++ b/test/old-elf/X86_64/Inputs/multiweaksyms.o diff --git a/test/old-elf/X86_64/Inputs/nmagic.c b/test/old-elf/X86_64/Inputs/nmagic.c new file mode 100644 index 000000000000..3ad15f0c4971 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/nmagic.c @@ -0,0 +1,8 @@ +int a = 10; +__thread int b = 20; +__thread int c; +__thread int d; + +int main() { + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/nmagic.o b/test/old-elf/X86_64/Inputs/nmagic.o Binary files differnew file mode 100644 index 000000000000..af28e0ada8b3 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/nmagic.o diff --git a/test/old-elf/X86_64/Inputs/no-interp-section.c b/test/old-elf/X86_64/Inputs/no-interp-section.c new file mode 100644 index 000000000000..3981c038ed33 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/no-interp-section.c @@ -0,0 +1 @@ +int c = 10; diff --git a/test/old-elf/X86_64/Inputs/no-interp-section.o b/test/old-elf/X86_64/Inputs/no-interp-section.o Binary files differnew file mode 100644 index 000000000000..063eb3244f22 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/no-interp-section.o diff --git a/test/old-elf/X86_64/Inputs/note.o b/test/old-elf/X86_64/Inputs/note.o Binary files differnew file mode 100644 index 000000000000..d86b0cf85d19 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/note.o diff --git a/test/old-elf/X86_64/Inputs/note.s b/test/old-elf/X86_64/Inputs/note.s new file mode 100644 index 000000000000..0a0b03da6bb7 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/note.s @@ -0,0 +1,11 @@ + .section ".note.ident", "a" + .p2align 2 + .long 1f - 0f # name size (not including padding) + .long 3f - 2f # desc size (not including padding) + .long 0x01234567 # type +0: .asciz "NaMe" # name +1: .p2align 2 +2: .long 0x76543210 # desc + .long 0x89abcdef +3: .p2align 2 + diff --git a/test/old-elf/X86_64/Inputs/note_ro_rw.o b/test/old-elf/X86_64/Inputs/note_ro_rw.o Binary files differnew file mode 100644 index 000000000000..76f2486d2736 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/note_ro_rw.o diff --git a/test/old-elf/X86_64/Inputs/note_ro_rw.s b/test/old-elf/X86_64/Inputs/note_ro_rw.s new file mode 100644 index 000000000000..2a0eff5dfb2b --- /dev/null +++ b/test/old-elf/X86_64/Inputs/note_ro_rw.s @@ -0,0 +1,21 @@ + .section ".note.ro", "a" + .p2align 2 + .long 1f - 0f # name size (not including padding) + .long 3f - 2f # desc size (not including padding) + .long 0x01234567 # type +0: .asciz "NaMe" # name +1: .p2align 2 +2: .long 0x76543210 # desc + .long 0x89abcdef +3: .p2align 2 + .section ".note.rw", "aw" + .p2align 2 + .long 1f - 0f # name size (not including padding) + .long 3f - 2f # desc size (not including padding) + .long 0x01234567 # type +0: .asciz "NaMe" # name +1: .p2align 2 +2: .long 0x76543210 # desc + .long 0x89abcdef +3: .p2align 2 + diff --git a/test/old-elf/X86_64/Inputs/ovrd.c b/test/old-elf/X86_64/Inputs/ovrd.c new file mode 100644 index 000000000000..a3d721dac2aa --- /dev/null +++ b/test/old-elf/X86_64/Inputs/ovrd.c @@ -0,0 +1,6 @@ +#include <stdio.h> +void f(void) +{ + printf("overridden f!\n"); +} + diff --git a/test/old-elf/X86_64/Inputs/ovrd.o b/test/old-elf/X86_64/Inputs/ovrd.o Binary files differnew file mode 100644 index 000000000000..ea7353d94ed9 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/ovrd.o diff --git a/test/old-elf/X86_64/Inputs/rodata.c b/test/old-elf/X86_64/Inputs/rodata.c new file mode 100644 index 000000000000..01489fe550c8 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/rodata.c @@ -0,0 +1,3 @@ +const char _nl_default_default_domain[] __attribute__ ((visibility ("hidden"))) = "messages"; +const char *_nl_current_default_domain __attribute__ ((visibility ("hidden"))) = _nl_default_default_domain; +const char _nl_default_default_dirname[] = "/usr/local"; diff --git a/test/old-elf/X86_64/Inputs/rodata.o b/test/old-elf/X86_64/Inputs/rodata.o Binary files differnew file mode 100644 index 000000000000..660606cdc9c0 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/rodata.o diff --git a/test/old-elf/X86_64/Inputs/rodata.s b/test/old-elf/X86_64/Inputs/rodata.s new file mode 100644 index 000000000000..e1a2eb702736 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/rodata.s @@ -0,0 +1,24 @@ + .file "x.c" + .hidden _nl_default_default_domain + .globl _nl_default_default_domain + .section .rodata._nl_default_default_domain,"ams",@progbits,1 + .type _nl_default_default_domain, @object + .size _nl_default_default_domain, 9 +_nl_default_default_domain: + .string "messages" + .hidden _nl_current_default_domain + .globl _nl_current_default_domain + .section .data._nl_current_default_domain,"aw",@progbits + .align 8 + .type _nl_current_default_domain, @object + .size _nl_current_default_domain, 8 +_nl_current_default_domain: + .quad _nl_default_default_domain + .globl _nl_default_default_dirname + .section .rodata._nl_default_default_dirname,"ams",@progbits,1 + .type _nl_default_default_dirname, @object + .size _nl_default_default_dirname, 11 +_nl_default_default_dirname: + .string "/usr/local" + .ident "GCC: (Ubuntu 4.8.1-2ubuntu1~10.04.1) 4.8.1" + .section .note.GNU-stack,"",@progbits diff --git a/test/old-elf/X86_64/Inputs/rwint.c b/test/old-elf/X86_64/Inputs/rwint.c new file mode 100644 index 000000000000..d1cf7d62c801 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/rwint.c @@ -0,0 +1 @@ +int a = 10; diff --git a/test/old-elf/X86_64/Inputs/rwint.o b/test/old-elf/X86_64/Inputs/rwint.o Binary files differnew file mode 100644 index 000000000000..9fba51f07add --- /dev/null +++ b/test/old-elf/X86_64/Inputs/rwint.o diff --git a/test/old-elf/X86_64/Inputs/sectionmap.c b/test/old-elf/X86_64/Inputs/sectionmap.c new file mode 100644 index 000000000000..c4f530148949 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/sectionmap.c @@ -0,0 +1,4 @@ +int foo __attribute__((section(".gcc_except_table.foo"))) = 4; +const int bar __attribute__((section(".data.rel.local"))) = 2; +const int baz __attribute__((section(".data.rel.ro"))) = 2; +const int bak __attribute__((section(".data.xyz"))) = 2; diff --git a/test/old-elf/X86_64/Inputs/sectionmap.o b/test/old-elf/X86_64/Inputs/sectionmap.o Binary files differnew file mode 100644 index 000000000000..599cf2cca563 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/sectionmap.o diff --git a/test/old-elf/X86_64/Inputs/undefcpp.c b/test/old-elf/X86_64/Inputs/undefcpp.c new file mode 100644 index 000000000000..ce84c2a592b6 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/undefcpp.c @@ -0,0 +1 @@ +int foo() { return _Z3fooPKc(); } diff --git a/test/old-elf/X86_64/Inputs/undefcpp.o b/test/old-elf/X86_64/Inputs/undefcpp.o Binary files differnew file mode 100644 index 000000000000..6b8ebf5b6ab0 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/undefcpp.o diff --git a/test/old-elf/X86_64/Inputs/weak-zero-sized.o b/test/old-elf/X86_64/Inputs/weak-zero-sized.o Binary files differnew file mode 100644 index 000000000000..7c10c6a509ed --- /dev/null +++ b/test/old-elf/X86_64/Inputs/weak-zero-sized.o diff --git a/test/old-elf/X86_64/Inputs/weak.c b/test/old-elf/X86_64/Inputs/weak.c new file mode 100644 index 000000000000..ae07ffc745d8 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/weak.c @@ -0,0 +1,14 @@ +int fn() +{ + return 0; +} + +void __attribute__((weak)) f() +{ + printf("original f..\n"); +} +int main(void) +{ + f(); + return 0; +} diff --git a/test/old-elf/X86_64/Inputs/weak.o b/test/old-elf/X86_64/Inputs/weak.o Binary files differnew file mode 100644 index 000000000000..41cc88a0c482 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/weak.o diff --git a/test/old-elf/X86_64/Inputs/weak.s b/test/old-elf/X86_64/Inputs/weak.s new file mode 100644 index 000000000000..64ce779553b6 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/weak.s @@ -0,0 +1,21 @@ + .file "weak.s" + .text + .p2align 4,,15 + .globl test + .type test, @function +test: + ret + .size test, .-test + .weak myfn2 + .data + .align 8 + .type myfn2, @object + .size myfn2, 8 +myfn2: + .quad test + .weak myfn1 + .align 8 + .type myfn1, @object + .size myfn1, 8 +myfn1: + .quad test diff --git a/test/old-elf/X86_64/Inputs/zerosizedsection.o b/test/old-elf/X86_64/Inputs/zerosizedsection.o Binary files differnew file mode 100644 index 000000000000..a0f2f13a307a --- /dev/null +++ b/test/old-elf/X86_64/Inputs/zerosizedsection.o diff --git a/test/old-elf/X86_64/Inputs/zerosizedsection.s b/test/old-elf/X86_64/Inputs/zerosizedsection.s new file mode 100644 index 000000000000..651ee3aab503 --- /dev/null +++ b/test/old-elf/X86_64/Inputs/zerosizedsection.s @@ -0,0 +1,3 @@ +.text +.data +.word .text diff --git a/test/old-elf/X86_64/alignoffset.test b/test/old-elf/X86_64/alignoffset.test new file mode 100644 index 000000000000..53e29211af67 --- /dev/null +++ b/test/old-elf/X86_64/alignoffset.test @@ -0,0 +1,118 @@ +# Checks that segments are aligned as per ELF spec. The segment virtual address +# modulo page alignment should be equal to offset modulo page alignment. + +# Build executable +# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --rosegment --noinhibit-exec +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s +# +#CHECK: Offset: 0x15C +#CHECK: VirtualAddress: 0x40015C +#CHECK: PhysicalAddress: 0x40015C +# +# +#const int a = 0; +#int main() { +# foo(); +# return 0; +#} +# +#int foo() { return 0; } + +# object +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E5B8000000005DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '00000000' + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 005562756E747520636C616E672076657273696F6E20332E352E302D73766E3231373330342D317E6578703120286272616E636865732F72656C656173655F33352920286261736564206F6E204C4C564D20332E352E302900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000B00000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 48 +Symbols: + Local: + - Name: 1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .rodata + Type: STT_SECTION + Section: .rodata + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: a + Type: STT_OBJECT + Section: .rodata + Size: 0x0000000000000004 + - Name: foo + Type: STT_FUNC + Section: .text + Value: 0x0000000000000030 + Size: 0x000000000000000B + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000024 +... diff --git a/test/old-elf/X86_64/debug.test b/test/old-elf/X86_64/debug.test new file mode 100644 index 000000000000..26ba367da574 --- /dev/null +++ b/test/old-elf/X86_64/debug.test @@ -0,0 +1,57 @@ +# Test that debug info is assigned typeNoAlloc and that the output sections have +# a virtual address of 0. +RUN: lld -flavor old-gnu -target x86_64 -e main --output-filetype=yaml \ +RUN: %p/Inputs/debug0.x86-64 %p/Inputs/debug1.x86-64 -o %t +RUN: FileCheck %s -check-prefix YAML < %t + +RUN: lld -flavor old-gnu -target x86_64 -e main %p/Inputs/debug0.x86-64 \ +RUN: %p/Inputs/debug1.x86-64 -o %t1 +RUN: llvm-readobj -sections %t1 | FileCheck %s -check-prefix ELF +# Verify that non SHF_ALLOC sections are relocated correctly. +RUN: llvm-objdump -s %t1 | FileCheck %s -check-prefix RELOC + +YAML: type: no-alloc + +ELF: Section { +ELF: Name: .debug_info +ELF: Type: SHT_PROGBITS (0x1) +ELF: Flags [ (0x0) +ELF: ] +ELF: Address: 0x0 +ELF: } +ELF: Section { +ELF: Name: .debug_abbrev +ELF: Type: SHT_PROGBITS (0x1) +ELF: Flags [ (0x0) +ELF: ] +ELF: Address: 0x0 +ELF: } +ELF: Section { +ELF: Name: .debug_aranges +ELF: Type: SHT_PROGBITS (0x1) +ELF: Flags [ (0x0) +ELF: ] +ELF: Address: 0x0 +ELF: } +ELF: Section { +ELF: Name: .debug_line +ELF: Type: SHT_PROGBITS (0x1) +ELF: Flags [ (0x0) +ELF: ] +ELF: Address: 0x0 +ELF: } +ELF: Section { +ELF: Name: .debug_str +ELF: Type: SHT_PROGBITS (0x1) +ELF: Flags [ (0x0) +ELF: ] +ELF: Address: 0x0 +ELF: } + +RELOC: Contents of section .debug_info: +RELOC: 0000 4e000000 04000000 00000801 3a000000 N...........:... +# ^^ Relocation: ._debug_str + 0x3a +RELOC: 0010 01780000 00000000 00dc0140 00000000 .x.........@.... +# ^^ Relocation: .debug_str + 0x78 +RELOC: 0020 00100000 00000000 00000000 00028100 ................ +# ^^ Relocation: .debug_str + 0x81 diff --git a/test/old-elf/X86_64/defsym.test b/test/old-elf/X86_64/defsym.test new file mode 100644 index 000000000000..d98abf39d428 --- /dev/null +++ b/test/old-elf/X86_64/defsym.test @@ -0,0 +1,22 @@ +RUN: lld -flavor old-gnu -target x86_64 --defsym=main=fn --noinhibit-exec \ +RUN: %p/Inputs/fn.o -o %t +RUN: llvm-readobj -symbols %t | FileCheck %s + +CHECK: Symbol { +CHECK: Name: main (1) +CHECK: Value: 0x4001E0 +CHECK: Size: 0 +CHECK: Binding: Global (0x1) +CHECK: Type: Function (0x2) +CHECK: Other: 0 +CHECK: Section: .text (0x5) +CHECK: } +CHECK: Symbol { +CHECK: Name: fn (6) +CHECK: Value: 0x4001E0 +CHECK: Size: 6 +CHECK: Binding: Global (0x1) +CHECK: Type: Function (0x2) +CHECK: Other: 0 +CHECK: Section: .text (0x5) +CHECK: } diff --git a/test/old-elf/X86_64/demangle.test b/test/old-elf/X86_64/demangle.test new file mode 100644 index 000000000000..caae8256d99a --- /dev/null +++ b/test/old-elf/X86_64/demangle.test @@ -0,0 +1,12 @@ +# XFAIL: win32 +# +# Check that the linker is able to demangle strings properly. +# Once there is a way to add undefined symbols using yaml2obj, the test will be +# changed. + +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec 2>&1 | FileCheck -check-prefix=DEMANGLE %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec --no-demangle 2>&1 | FileCheck -check-prefix=NODEMANGLE %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec --demangle 2>&1 | FileCheck -check-prefix=DEMANGLE %s + +#DEMANGLE: undefcpp.o: foo(char const*) +#NODEMANGLE: undefcpp.o: _Z3fooPKc diff --git a/test/old-elf/X86_64/dontignorezerosize-sections.test b/test/old-elf/X86_64/dontignorezerosize-sections.test new file mode 100644 index 000000000000..f3042b5508fd --- /dev/null +++ b/test/old-elf/X86_64/dontignorezerosize-sections.test @@ -0,0 +1,9 @@ +# This tests that lld is not ignoring zero sized sections +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/zerosizedsection.o \ +RUN: --noinhibit-exec --output-filetype=yaml -o %t +RUN: FileCheck %s < %t + +CHECK: references: +CHECK: - kind: R_X86_64_16 +CHECK: offset: 0 +CHECK: target: L000 diff --git a/test/old-elf/X86_64/dynamicvars.test b/test/old-elf/X86_64/dynamicvars.test new file mode 100644 index 000000000000..c6f679038320 --- /dev/null +++ b/test/old-elf/X86_64/dynamicvars.test @@ -0,0 +1,123 @@ +# Tests that the dynamic variables created by the linker are set to the right +# values. + +#RUN: yaml2obj --format elf -docnum 1 %s -o %t.o +#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -o %t1 --noinhibit-exec +#RUN: llvm-readobj -sections -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + + +#CHECKSYMS: Name: .dynamic +#CHECKSYMS: Type: SHT_DYNAMIC +#CHECKSYMS: Address: [[TARGETA:[0xa-fA-f0-9]+]] +#CHECKSYMS: Name: .got.plt +#CHECKSYMS: Type: SHT_PROGBITS +#CHECKSYMS: Address: [[TARGETB:[0xa-fA-f0-9]+]] +#CHECKSYMS: Name: _DYNAMIC +#CHECKSYMS: Value: [[TARGETA]] +#CHECKSYMS: Section: .dynamic +#CHECKSYMS: Name: _GLOBAL_OFFSET_TABLE_ +#CHECKSYMS: Value: [[TARGETB]] +#CHECKSYMS: Section: .got.plt + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10488B0500000000C745FC00000000C7000A000000E80000000031C98945F889C84883C4105DC36690554889E531C05DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x000000000000000B + Symbol: a + Type: R_X86_64_GOTPCREL + Addend: -4 + - Offset: 0x000000000000001D + Symbol: foo + Type: R_X86_64_PLT32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E362E302000 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002E00000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 48 +Symbols: + Local: + - Name: 1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: a + Type: STT_OBJECT + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: foo + Type: STT_FUNC + Section: .text + Value: 0x0000000000000030 + Size: 0x0000000000000008 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000002E + - Name: _GLOBAL_OFFSET_TABLE_ +... diff --git a/test/old-elf/X86_64/dynlib-nointerp-section.test b/test/old-elf/X86_64/dynlib-nointerp-section.test new file mode 100644 index 000000000000..c23d283d2a6d --- /dev/null +++ b/test/old-elf/X86_64/dynlib-nointerp-section.test @@ -0,0 +1,4 @@ +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/no-interp-section.o -o %t -shared +RUN: llvm-objdump -section-headers %t | FileCheck %s + +CHECK-NOT: .interp diff --git a/test/old-elf/X86_64/dynlib-search.test b/test/old-elf/X86_64/dynlib-search.test new file mode 100644 index 000000000000..efd7272fb145 --- /dev/null +++ b/test/old-elf/X86_64/dynlib-search.test @@ -0,0 +1,6 @@ +# This tests the functionality for finding the shared library libfn.so for ELF +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/main.o -L%p/Inputs/ -lfn -o %t \ +RUN: --noinhibit-exec -t 2> %t1 +RUN: FileCheck %s < %t1 + +CHECK: {{[\/0-9A-Za-z_]+}}libfn.so diff --git a/test/old-elf/X86_64/dynsym-weak.test b/test/old-elf/X86_64/dynsym-weak.test new file mode 100644 index 000000000000..8e1cc9fa8ec9 --- /dev/null +++ b/test/old-elf/X86_64/dynsym-weak.test @@ -0,0 +1,118 @@ +# Check that a symbol declared as a week in a shared library gets a dynamic +# symbol table record in an executable file if this executabe file declares the +# symbol as strong. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t.foo.o +# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.foo.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t.main.o +# +# Link executable file with strong symbol. Weak symbol is in the shared lib. +# RUN: lld -flavor old-gnu -target x86_64 -e main -o %t1.exe %t.main.o %t.so +# RUN: llvm-readobj -dyn-symbols %t1.exe | FileCheck -check-prefix=EXE %s +# +# Link executable file. Strong and weak symbol come from different object files. +# RUN: lld -flavor old-gnu -target x86_64 -e main -o %t2.exe %t.main.o %t.foo.o +# RUN: llvm-readobj -dyn-symbols %t2.exe | FileCheck -check-prefix=OBJ %s +# +# Link shared library. Weak symbol is in the another shared lib. +# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.res.so %t.main.o %t.so +# RUN: llvm-readobj -dyn-symbols %t.res.so | FileCheck -check-prefix=SO %s + +# EXE: Symbol { +# EXE: Name: flag@ ({{[0-9]+}}) +# EXE-NEXT: Value: 0x{{[0-9A-F]+}} +# EXE-NEXT: Size: 4 +# EXE-NEXT: Binding: Global (0x1) +# EXE-NEXT: Type: Object (0x1) +# EXE-NEXT: Other: 0 +# EXE-NEXT: Section: .data (0x{{[0-9A-F]+}}) +# EXE-NEXT: } + +# OBJ-NOT: Name: flag@ ({{[0-9]+}}) + +# SO: Symbol { +# SO: Name: flag@ ({{[0-9]+}}) +# SO-NEXT: Value: 0x{{[0-9A-F]+}} +# SO-NEXT: Size: 4 +# SO-NEXT: Binding: Global (0x1) +# SO-NEXT: Type: Object (0x1) +# SO-NEXT: Other: 0 +# SO-NEXT: Section: .data (0x{{[0-9A-F]+}}) +# SO-NEXT: } + +# foo.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x08 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: flag + Type: R_X86_64_GOTPCREL + Addend: -4 + +Symbols: + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Size: 0x08 + Weak: + - Name: flag + +# main.o +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x08 + Info: .text + Relocations: + - Offset: 0x00 + Symbol: foo + Type: R_X86_64_PLT32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x04 + Size: 0x04 + +Symbols: + Global: + - Name: flag + Type: STT_OBJECT + Section: .data + Size: 0x04 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: foo +... diff --git a/test/old-elf/X86_64/extern-tls.test b/test/old-elf/X86_64/extern-tls.test new file mode 100644 index 000000000000..d22b06057a9a --- /dev/null +++ b/test/old-elf/X86_64/extern-tls.test @@ -0,0 +1,16 @@ +# This tests verifies that TLS variables have correct offsets +# when variables the TLS variables are not defined in the program +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/externtls.x86-64 -static \ +RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s -check-prefix=CHECKGOT + +# Currently x86_64 relocation pass handles the R_X86_64_GOTTPOFF by +# creatng R_X86_64_TPOFF64 dynamic ones. For output yaml, this is +# not changed. + - name: __got_tls_extern_tls +CHECKGOT: alignment: 4 +CHECKGOT: section-name: .text +CHECKGOT: references: +CHECKGOT: - kind: R_X86_64_GOTTPOFF +CHECKGOT: offset: 7 +CHECKGOT: target: extern_tls +CHECKGOT: addend: -4 diff --git a/test/old-elf/X86_64/general-dynamic-tls.test b/test/old-elf/X86_64/general-dynamic-tls.test new file mode 100644 index 000000000000..12ad1071ae1e --- /dev/null +++ b/test/old-elf/X86_64/general-dynamic-tls.test @@ -0,0 +1,128 @@ +# This test exercises a simple general dynamic TLS access model in X86_64. +# +# It is composed of two parts: a program and a shared library. The shared +# library uses TLS, but the program does not. +# +# The shared library should import __tls_get_addr, since it uses the general +# dynamic TLS access mode (see www.akkadia.org/drepper/tls.pdf). Notice that +# once we support TLS strength reduction, this test should be updated, since +# this can be converted into a local dynamic TLS model. + +# Prepare inputs +#RUN: yaml2obj -format=elf %p/Inputs/generaltls-so.o.yaml -o=%t.o.so +#RUN: lld -flavor old-gnu -target x86_64 -shared %t.o.so -o %T/libgeneraltls.so +#RUN: yaml2obj -format=elf %s -o=%t.o + +# Link - (we supply --defsym=__tls_get_addr to avoid the need to link with +# system libraries) +#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -L%T -lgeneraltls -o %t1 \ +#RUN: --defsym=__tls_get_addr=0 + +# Check +#RUN: llvm-readobj -dyn-symbols %t1 | FileCheck -check-prefix CHECKPROG %s +#RUN: llvm-readobj -relocations -dyn-symbols %T/libgeneraltls.so | FileCheck \ +#RUN: -check-prefix CHECKDSO %s + +# Test case generated with the following code: +# +# DSO: (file %p/Inputs/generaltls-so.o.yaml) +# +# __thread int mynumber=33; +# +# int getnumber() { +# return mynumber; +# } +# +# Program: (this file). Note: The printf() relocation was removed to simplify +# this test and allow us to test this without libc. +# +# #include <stdio.h> +# int getnumber(); +# +# int main() { +# printf("getnumber() = %d\n", getnumber()); +# return 0; +# } +# +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10C745FC00000000B000E80000000048BF000000000000000089C6B000E80000000031F68945F889F04883C4105DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000012 + Symbol: getnumber + Type: R_X86_64_PC32 + Addend: -4 + - Offset: 0x0000000000000018 + Symbol: .rodata.str1.1 + Type: R_X86_64_64 + Addend: 0 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .rodata.str1.1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 6765746E756D6265722829203D2025640A00 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .rodata.str1.1 + Type: STT_SECTION + Section: .rodata.str1.1 + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000036 + - Name: getnumber + +# Program should import the function defined in the shared library +#CHECKPROG: getnumber@ +# Program should not import __tls_get_addr, since it does not directly use TLS +#CHECKPROG-NOT: __tls_get_addr@ + +# Check for the presence of X86_64 TLS relocations in the shared library +#CHECKDSO: R_X86_64_DTPMOD64 +#CHECKDSO: R_X86_64_DTPOFF64 +#CHECKDSO: R_X86_64_JUMP_SLOT + +# The shared library should import __tls_get_addr, since it uses the general +# dynamic TLS access mode. +#CHECKDSO: Name: __tls_get_addr@ +#CHECKDSO-NEXT: Value: 0x0 +#CHECKDSO-NEXT: Size: 0 +#CHECKDSO-NEXT: Binding: Global +#CHECKDSO-NEXT: Type: None +#CHECKDSO-NEXT: Other: 0 +#CHECKDSO-NEXT: Section: Undefined + diff --git a/test/old-elf/X86_64/imagebase.test b/test/old-elf/X86_64/imagebase.test new file mode 100644 index 000000000000..7b6f7318d72d --- /dev/null +++ b/test/old-elf/X86_64/imagebase.test @@ -0,0 +1,94 @@ +# Checks that segments start at the image address specified. + +# Build executable +# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec --image-base 0x600000 +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s +# +#CHECK: VirtualAddress: 0x600000 +#CHECK: PhysicalAddress: 0x600000 +#CHECK: VirtualAddress: 0x600178 +#CHECK: PhysicalAddress: 0x600178 + +# object +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '64000000' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + Size: 0x0000000000000008 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000012 + - Name: myval + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: val + Type: STT_OBJECT + Section: .rodata + Size: 0x0000000000000004 +... diff --git a/test/old-elf/X86_64/initfini-order.test b/test/old-elf/X86_64/initfini-order.test new file mode 100644 index 000000000000..e6afcf644346 --- /dev/null +++ b/test/old-elf/X86_64/initfini-order.test @@ -0,0 +1,10 @@ +# This tests the functionality that lld is able to emit +# init_array/fini_array sections in the right order. + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \ +RUN: --noinhibit-exec -o %t +RUN: llvm-objdump -t -section-headers %t | FileCheck %s + +CHECK: {{[0-9]+}} .eh_frame {{[0-9a-z]+}} {{[0-9a-z]+}} DATA +CHECK: {{[0-9]+}} .init_array {{[0-9a-z]+}} {{[0-9a-z]+}} DATA +CHECK: {{[0-9]+}} .fini_array {{[0-9a-z]+}} {{[0-9a-z]+}} DATA diff --git a/test/old-elf/X86_64/initfini.test b/test/old-elf/X86_64/initfini.test new file mode 100644 index 000000000000..09d2bc129c25 --- /dev/null +++ b/test/old-elf/X86_64/initfini.test @@ -0,0 +1,23 @@ +# This tests the functionality that lld is able to read +# init_array/fini_array sections in the input ELF. This +# corresponds to the the .init_array/.fini_array sections +# in the output ELF. + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \ +RUN: --noinhibit-exec --output-filetype=yaml -o %t +RUN: FileCheck %s < %t + +CHECK: - type: data +CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +CHECK: section-name: .init_array +CHECK: references: +CHECK: - kind: R_X86_64_64 +CHECK: offset: 0 +CHECK: target: constructor +CHECK: - type: data +CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +CHECK: section-name: .fini_array +CHECK: references: +CHECK: - kind: R_X86_64_64 +CHECK: offset: 0 +CHECK: target: destructor diff --git a/test/old-elf/X86_64/largebss.test b/test/old-elf/X86_64/largebss.test new file mode 100644 index 000000000000..722ec1c72bf9 --- /dev/null +++ b/test/old-elf/X86_64/largebss.test @@ -0,0 +1,20 @@ +# This tests the functionality of handling BSS symbols +# BSS symbols don't occupy file content and are associated with typeZeroFill +# Any typeZeroFill content wouldn't have space reserved in the file to store +# its content + +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/largebss.o --output-filetype=yaml --noinhibit-exec | FileCheck %s + +CHECK: - name: largecommon +CHECK: scope: global +CHECK: type: zero-fill +CHECK: size: 4000 +CHECK: merge: as-tentative +CHECK: - name: largebss +CHECK: scope: global +CHECK: type: zero-fill +CHECK: size: 4000 +CHECK: - name: largetbss +CHECK: scope: global +CHECK: type: thread-zero-fill +CHECK: size: 4000 diff --git a/test/old-elf/X86_64/layoutpass-order.test b/test/old-elf/X86_64/layoutpass-order.test new file mode 100644 index 000000000000..ec180c970e78 --- /dev/null +++ b/test/old-elf/X86_64/layoutpass-order.test @@ -0,0 +1,14 @@ +# This test checks that we follow the command line order of layouting +# symbols in the output file + +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/layoutpass/1.o \ +RUN: %p/Inputs/layoutpass/lib2.a %p/Inputs/layoutpass/3.o -o %t \ +RUN: --noinhibit-exec -static + +RUN: llvm-nm -n %t | FileCheck -check-prefix=SYMBOLSORDER %s + +SYMBOLSORDER: {{[A-Fa-f0-9]+}} T main +SYMBOLSORDER: {{[A-Fa-f0-9]+}} T b +SYMBOLSORDER: {{[A-Fa-f0-9]+}} T a +SYMBOLSORDER: {{[A-Fa-f0-9]+}} T c +SYMBOLSORDER: {{[A-Fa-f0-9]+}} T d diff --git a/test/old-elf/X86_64/maxpagesize.test b/test/old-elf/X86_64/maxpagesize.test new file mode 100644 index 000000000000..303bd86eec0b --- /dev/null +++ b/test/old-elf/X86_64/maxpagesize.test @@ -0,0 +1,113 @@ +# Checks that segments are aligned as per ELF spec when the user specifies +# max-page-size option, and the segment alignment is set to the page size +# specified by the user. + +# Build executable +# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o +# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0 +# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0xFF +# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x1010 +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t1.exe -static \ +# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x100000 +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x10000 +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s +# RUN: llvm-readobj -program-headers %t1.exe | FileCheck %s -check-prefix=CHECKLARGE +# +#CHECK: VirtualAddress: 0x400000 +#CHECK: PhysicalAddress: 0x400000 +#CHECK: Alignment: 65536 +#CHECK: VirtualAddress: 0x400178 +#CHECK: PhysicalAddress: 0x400178 +#CHECK: Alignment: 65536 +#CHECKLARGE: VirtualAddress: 0x400000 +#CHECKLARGE: PhysicalAddress: 0x400000 +#CHECKLARGE: Alignment: 1048576 +#CHECKLARGE: VirtualAddress: 0x400178 +#CHECKLARGE: PhysicalAddress: 0x400178 +#CHECKLARGE: Alignment: 1048576 + +# object +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '64000000' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + Size: 0x0000000000000008 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000012 + - Name: myval + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: val + Type: STT_OBJECT + Section: .rodata + Size: 0x0000000000000004 +... diff --git a/test/old-elf/X86_64/mergesimilarstrings.test b/test/old-elf/X86_64/mergesimilarstrings.test new file mode 100644 index 000000000000..2b9b08faa23f --- /dev/null +++ b/test/old-elf/X86_64/mergesimilarstrings.test @@ -0,0 +1,47 @@ +# Check that relocations to section that contains strings is properly handled +# when merging strings is enabled. +# +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target x86_64 %t.o --noinhibit-exec -o %t1.out +# RUN: llvm-readobj -sections %t1.out | FileCheck %s +# RUN: lld -flavor old-gnu -target x86_64 %t.o --noinhibit-exec -o %t2.out --output-filetype=yaml +# RUN: FileCheck %s -check-prefix=CHECKRELOCS < %t2.out + +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Content: 54889e5488d3d00000000e80000000088d3d00000000e800000000b8000000005dc3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x04 + Info: .text + Relocations: + - Offset: 0x07 + Symbol: .rodata + Type: R_X86_64_PC32 + Addend: -4 + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x01 + Content: 48656c6c6f20576f726c6400576f726c6400 +Symbols: + Global: + - Name: .rodata + Section: .rodata + +#CHECK: Name: .rodata +#CHECK: Size: 18 +#CHECKRELOCS: references: +#CHECKRELOCS: - kind: R_X86_64_PC32 +#CHECKRELOCS: offset: 7 +#CHECKRELOCS: target: .rodata +#CHECKRELOCS: addend: -4 diff --git a/test/old-elf/X86_64/multi-weak-layout.test b/test/old-elf/X86_64/multi-weak-layout.test new file mode 100644 index 000000000000..879b4b1b3052 --- /dev/null +++ b/test/old-elf/X86_64/multi-weak-layout.test @@ -0,0 +1,52 @@ +# Test that we are able to layout multiple weak symbols +# properly + +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multiweaksyms.o \ +RUN: --noinhibit-exec -static --output-filetype=yaml -o %t +RUN: FileCheck %s -check-prefix=WEAKSYMS < %t + +WEAKSYMS: - type: data +WEAKSYMS: alignment: 8 +WEAKSYMS: references: +WEAKSYMS: - kind: layout-after +WEAKSYMS: offset: 0 +WEAKSYMS: target: [[L001:[-a-zA-Z0-9_]+]] +WEAKSYMS: - name: myfn2 +WEAKSYMS: scope: global +WEAKSYMS: type: data +WEAKSYMS: merge: as-weak +WEAKSYMS: alignment: 8 +WEAKSYMS: references: +WEAKSYMS: - kind: layout-after +WEAKSYMS: offset: 0 +WEAKSYMS: target: [[L001]] +WEAKSYMS: - ref-name: [[L001]] +WEAKSYMS: scope: global +WEAKSYMS: type: data +WEAKSYMS: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +WEAKSYMS: alignment: 8 +WEAKSYMS: references: +WEAKSYMS: - kind: R_X86_64_64 +WEAKSYMS: offset: 0 +WEAKSYMS: target: test +WEAKSYMS: - kind: layout-after +WEAKSYMS: offset: 0 +WEAKSYMS: target: [[L003:[-a-zA-Z0-9_]+]] +WEAKSYMS: - name: myfn1 +WEAKSYMS: scope: global +WEAKSYMS: type: data +WEAKSYMS: merge: as-weak +WEAKSYMS: alignment: 8 +WEAKSYMS: references: +WEAKSYMS: - kind: layout-after +WEAKSYMS: offset: 0 +WEAKSYMS: target: [[L003]] +WEAKSYMS: - ref-name: [[L003]] +WEAKSYMS: scope: global +WEAKSYMS: type: data +WEAKSYMS: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +WEAKSYMS: alignment: 8 +WEAKSYMS: references: +WEAKSYMS: - kind: R_X86_64_64 +WEAKSYMS: offset: 0 +WEAKSYMS: target: test diff --git a/test/old-elf/X86_64/multi-weak-override.test b/test/old-elf/X86_64/multi-weak-override.test new file mode 100644 index 000000000000..75c86e7e405f --- /dev/null +++ b/test/old-elf/X86_64/multi-weak-override.test @@ -0,0 +1,16 @@ +# Test for weak symbol getting overridden +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o \ +RUN: %p/Inputs/multi-ovrd.o -o %t -e main --noinhibit-exec +RUN: llvm-nm -n %t | FileCheck -check-prefix=WEAKORDER %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o \ +RUN: %p/Inputs/multi-ovrd.o --output-filetype=yaml -o %t2 --noinhibit-exec +RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2 + +WEAKORDER: {{[0-9a-f]+}} T f +WEAKORDER: {{[0-9a-f]+}} T g + +WEAKATOMSORDER: - ref-name: {{[A-Z0-9]+}} +WEAKATOMSORDER: - ref-name: {{[A-Z0-9]+}} +WEAKATOMSORDER: - name: f +WEAKATOMSORDER: - name: g + diff --git a/test/old-elf/X86_64/multi-weak-syms-order.test b/test/old-elf/X86_64/multi-weak-syms-order.test new file mode 100644 index 000000000000..a8e21e13f870 --- /dev/null +++ b/test/old-elf/X86_64/multi-weak-syms-order.test @@ -0,0 +1,13 @@ +# Test for weak symbol getting overridden +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o -o %t --noinhibit-exec +RUN: llvm-nm -n %t | FileCheck -check-prefix=WEAKORDER %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o -o %t2 --output-filetype=yaml --noinhibit-exec +RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2 + +WEAKORDER: {{[0-9a-f]+}} T fn +WEAKORDER: {{[0-9a-f]+}} T f +WEAKORDER: {{[0-9a-f]+}} T g +WEAKORDER: {{[0-9a-f]+}} T main + +WEAKATOMSORDER: - name: f +WEAKATOMSORDER: - name: g diff --git a/test/old-elf/X86_64/nmagic.test b/test/old-elf/X86_64/nmagic.test new file mode 100644 index 000000000000..3ed9228fa787 --- /dev/null +++ b/test/old-elf/X86_64/nmagic.test @@ -0,0 +1,91 @@ +# This tests verifies functionality of NMAGIC that we create only two segments, +# PT_LOAD, PT_TLS +# The data segment should be aligned to a page boundary +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \ +RUN: --noinhibit-exec -o %t --nmagic -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NMAGICSECTIONS %s +RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NMAGICPROGRAMHEADERS %s + +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Index: 0 +NMAGICSECTIONS: Name: (0) +NMAGICSECTIONS: Type: SHT_NULL (0x0) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .text +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .eh_frame +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .tdata +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .tbss +NMAGICSECTIONS: Type: SHT_NOBITS (0x8) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .got.plt +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .data +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .bss +NMAGICSECTIONS: Type: SHT_NOBITS (0x8) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .comment +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .note.GNU-stack +NMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .shstrtab +NMAGICSECTIONS: Type: SHT_STRTAB (0x3) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .symtab +NMAGICSECTIONS: Type: SHT_SYMTAB (0x2) +NMAGICSECTIONS: } +NMAGICSECTIONS: Section { +NMAGICSECTIONS: Name: .strtab +NMAGICSECTIONS: Type: SHT_STRTAB (0x3) +NMAGICSECTIONS: } + +NMAGICPROGRAMHEADERS: ProgramHeaders [ +NMAGICPROGRAMHEADERS: ProgramHeader { +NMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1) +NMAGICPROGRAMHEADERS: Offset: 0x0 +NMAGICPROGRAMHEADERS: VirtualAddress: 0x400000 +NMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000 +NMAGICPROGRAMHEADERS: FileSize: 4108 +NMAGICPROGRAMHEADERS: MemSize: 4108 +NMAGICPROGRAMHEADERS: Flags [ (0x7) +NMAGICPROGRAMHEADERS: PF_R (0x4) +NMAGICPROGRAMHEADERS: PF_W (0x2) +NMAGICPROGRAMHEADERS: PF_X (0x1) +NMAGICPROGRAMHEADERS: ] +NMAGICPROGRAMHEADERS: Alignment: 8 +NMAGICPROGRAMHEADERS: } +NMAGICPROGRAMHEADERS: ProgramHeader { +NMAGICPROGRAMHEADERS: Type: PT_TLS (0x7) +NMAGICPROGRAMHEADERS: Offset: 0x1000 +NMAGICPROGRAMHEADERS: VirtualAddress: 0x401000 +NMAGICPROGRAMHEADERS: PhysicalAddress: 0x401000 +NMAGICPROGRAMHEADERS: FileSize: 4 +NMAGICPROGRAMHEADERS: MemSize: 12 +NMAGICPROGRAMHEADERS: Flags [ (0x6) +NMAGICPROGRAMHEADERS: PF_R (0x4) +NMAGICPROGRAMHEADERS: PF_W (0x2) +NMAGICPROGRAMHEADERS: ] +NMAGICPROGRAMHEADERS: Alignment: 4 +NMAGICPROGRAMHEADERS: } +NMAGICPROGRAMHEADERS: ] diff --git a/test/old-elf/X86_64/noalignsegments.test b/test/old-elf/X86_64/noalignsegments.test new file mode 100644 index 000000000000..4963575b674b --- /dev/null +++ b/test/old-elf/X86_64/noalignsegments.test @@ -0,0 +1,95 @@ +# Checks that segments are aligned as per ELF spec than aligning each +# segment fileoffset / virtual address to a page. + +# Build executable +# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \ +# RUN: --no-align-segments --noinhibit-exec +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s +# +#CHECK: VirtualAddress: 0x400000 +#CHECK: PhysicalAddress: 0x400000 +#CHECK: VirtualAddress: 0x400178 +#CHECK: PhysicalAddress: 0x400178 + +# object +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 + - Name: .rodata + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '64000000' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + Size: 0x0000000000000008 + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000012 + - Name: myval + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: val + Type: STT_OBJECT + Section: .rodata + Size: 0x0000000000000004 +... diff --git a/test/old-elf/X86_64/note-sections-ro_plus_rw.test b/test/old-elf/X86_64/note-sections-ro_plus_rw.test new file mode 100644 index 000000000000..b4eafaf277c4 --- /dev/null +++ b/test/old-elf/X86_64/note-sections-ro_plus_rw.test @@ -0,0 +1,42 @@ +# This tests the functionality that lld is able to recreate the note sections +# if they appear in the input, it looks like we need to differentiate RO note +# sections from RW note sections, and each creating a segment of its own + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/note_ro_rw.o \ +RUN: --noinhibit-exec -o %t -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NOTESECTIONS %s +RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NOTESEGMENT %s + +NOTESECTIONS: Section { +NOTESECTIONS: Name: .note.ro (1) +NOTESECTIONS: Type: SHT_NOTE (0x7) +NOTESECTIONS: Flags [ (0x2) +NOTESECTIONS: SHF_ALLOC (0x2) +NOTESECTIONS: ] +NOTESECTIONS: AddressAlignment: 4 +NOTESECTIONS: } +NOTESECTIONS: Section { +NOTESECTIONS: Name: .note.rw (31) +NOTESECTIONS: Type: SHT_NOTE (0x7) +NOTESECTIONS: Flags [ (0x3) +NOTESECTIONS: SHF_ALLOC (0x2) +NOTESECTIONS: SHF_WRITE (0x1) +NOTESECTIONS: ] +NOTESECTIONS: Size: 28 +NOTESECTIONS: AddressAlignment: 4 +NOTESECTIONS: } +NOTESEGMENT: ProgramHeader { +NOTESEGMENT: Type: PT_NOTE (0x4) +NOTESEGMENT: Flags [ (0x4) +NOTESEGMENT: PF_R (0x4) +NOTESEGMENT: ] +NOTESEGMENT: Alignment: 4 +NOTESEGMENT: } +NOTESEGMENT: ProgramHeader { +NOTESEGMENT: Type: PT_NOTE (0x4) +NOTESEGMENT: Flags [ (0x6) +NOTESEGMENT: PF_R (0x4) +NOTESEGMENT: PF_W (0x2) +NOTESEGMENT: ] +NOTESEGMENT: Alignment: 4 +NOTESEGMENT: } diff --git a/test/old-elf/X86_64/note-sections.test b/test/old-elf/X86_64/note-sections.test new file mode 100644 index 000000000000..b831e7e192b4 --- /dev/null +++ b/test/old-elf/X86_64/note-sections.test @@ -0,0 +1,23 @@ +# This tests the functionality that lld is able to recreate the note sections +# if they appear in the input + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/note.o \ +RUN: --noinhibit-exec -o %t -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NOTESECTIONS %s +RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NOTESEGMENT %s + + +NOTESECTIONS: Section { +NOTESECTIONS: Index: 1 +NOTESECTIONS: Name: .note.ident (1) +NOTESECTIONS: Type: SHT_NOTE (0x7) +NOTESECTIONS: Size: 28 +NOTESECTIONS: AddressAlignment: 4 +NOTESECTIONS: } + +NOTESEGMENT: ProgramHeader { +NOTESEGMENT: Type: PT_NOTE (0x4) +NOTESEGMENT: FileSize: 28 +NOTESEGMENT: MemSize: 28 +NOTESEGMENT: Alignment: 4 +NOTESEGMENT: } diff --git a/test/old-elf/X86_64/omagic.test b/test/old-elf/X86_64/omagic.test new file mode 100644 index 000000000000..fe2633e67a95 --- /dev/null +++ b/test/old-elf/X86_64/omagic.test @@ -0,0 +1,237 @@ +# This tests verifies functionality of omagic that we create only two segments, +# PT_LOAD, PT_TLS +# The data segment should not be aligned to a page boundary +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \ +RUN: --noinhibit-exec -o %t --omagic -static +RUN: llvm-readobj -sections %t | FileCheck -check-prefix=OMAGICSECTIONS %s +RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=OMAGICPROGRAMHEADERS %s + +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: (0) +OMAGICSECTIONS: Type: SHT_NULL (0x0) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x0 +OMAGICSECTIONS: Size: 0 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 0 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .text +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x6) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_EXECINSTR (0x4) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x4000E8 +OMAGICSECTIONS: Offset: 0xE8 +OMAGICSECTIONS: Size: 11 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 4 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .eh_frame +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x2) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x4000F8 +OMAGICSECTIONS: Offset: 0xF8 +OMAGICSECTIONS: Size: 56 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 8 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .eh_frame_hdr +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x2) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x400130 +OMAGICSECTIONS: Offset: 0x130 +OMAGICSECTIONS: Size: 8 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 8 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .tdata +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x403) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_TLS (0x400) +OMAGICSECTIONS: SHF_WRITE (0x1) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x400138 +OMAGICSECTIONS: Offset: 0x138 +OMAGICSECTIONS: Size: 4 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 4 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .tbss +OMAGICSECTIONS: Type: SHT_NOBITS (0x8) +OMAGICSECTIONS: Flags [ (0x403) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_TLS (0x400) +OMAGICSECTIONS: SHF_WRITE (0x1) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x40013C +OMAGICSECTIONS: Offset: 0x13C +OMAGICSECTIONS: Size: 8 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 4 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .got.plt +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x3) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_WRITE (0x1) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x400140 +OMAGICSECTIONS: Offset: 0x140 +OMAGICSECTIONS: Size: 0 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 8 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .data +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x3) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_WRITE (0x1) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x400140 +OMAGICSECTIONS: Offset: 0x140 +OMAGICSECTIONS: Size: 4 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 4 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .bss +OMAGICSECTIONS: Type: SHT_NOBITS (0x8) +OMAGICSECTIONS: Flags [ (0x3) +OMAGICSECTIONS: SHF_ALLOC (0x2) +OMAGICSECTIONS: SHF_WRITE (0x1) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x400144 +OMAGICSECTIONS: Offset: 0x144 +OMAGICSECTIONS: Size: 0 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 4 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .comment +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x144 +OMAGICSECTIONS: Size: 43 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 1 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .note.GNU-stack +OMAGICSECTIONS: Type: SHT_PROGBITS (0x1) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x16F +OMAGICSECTIONS: Size: 0 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 1 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .shstrtab +OMAGICSECTIONS: Type: SHT_STRTAB (0x3) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x16F +OMAGICSECTIONS: Size: 115 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 1 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .symtab +OMAGICSECTIONS: Type: SHT_SYMTAB (0x2) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x1E8 +OMAGICSECTIONS: Size: 504 +OMAGICSECTIONS: Link: 13 +OMAGICSECTIONS: Info: 8 +OMAGICSECTIONS: AddressAlignment: 8 +OMAGICSECTIONS: EntrySize: 24 +OMAGICSECTIONS: } +OMAGICSECTIONS: Section { +OMAGICSECTIONS: Name: .strtab +OMAGICSECTIONS: Type: SHT_STRTAB (0x3) +OMAGICSECTIONS: Flags [ (0x0) +OMAGICSECTIONS: ] +OMAGICSECTIONS: Address: 0x0 +OMAGICSECTIONS: Offset: 0x3E0 +OMAGICSECTIONS: Size: 231 +OMAGICSECTIONS: Link: 0 +OMAGICSECTIONS: Info: 0 +OMAGICSECTIONS: AddressAlignment: 1 +OMAGICSECTIONS: EntrySize: 0 +OMAGICSECTIONS: } +OMAGICSECTIONS: ] + +OMAGICPROGRAMHEADERS: ProgramHeaders [ +OMAGICPROGRAMHEADERS: ProgramHeader { +OMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1) +OMAGICPROGRAMHEADERS: Offset: 0x0 +OMAGICPROGRAMHEADERS: VirtualAddress: 0x400000 +OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000 +OMAGICPROGRAMHEADERS: FileSize: 324 +OMAGICPROGRAMHEADERS: MemSize: 324 +OMAGICPROGRAMHEADERS: Flags [ (0x7) +OMAGICPROGRAMHEADERS: PF_R (0x4) +OMAGICPROGRAMHEADERS: PF_W (0x2) +OMAGICPROGRAMHEADERS: PF_X (0x1) +OMAGICPROGRAMHEADERS: ] +OMAGICPROGRAMHEADERS: Alignment: 8 +OMAGICPROGRAMHEADERS: } +OMAGICPROGRAMHEADERS: ProgramHeader { +OMAGICPROGRAMHEADERS: Type: PT_TLS (0x7) +OMAGICPROGRAMHEADERS: Offset: 0x138 +OMAGICPROGRAMHEADERS: VirtualAddress: 0x400138 +OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400138 +OMAGICPROGRAMHEADERS: FileSize: 4 +OMAGICPROGRAMHEADERS: MemSize: 12 +OMAGICPROGRAMHEADERS: Flags [ (0x6) +OMAGICPROGRAMHEADERS: PF_R (0x4) +OMAGICPROGRAMHEADERS: PF_W (0x2) +OMAGICPROGRAMHEADERS: ] +OMAGICPROGRAMHEADERS: Alignment: 4 +OMAGICPROGRAMHEADERS: } +OMAGICPROGRAMHEADERS: ] diff --git a/test/old-elf/X86_64/outputsegments.test b/test/old-elf/X86_64/outputsegments.test new file mode 100644 index 000000000000..1c76b6eb855c --- /dev/null +++ b/test/old-elf/X86_64/outputsegments.test @@ -0,0 +1,188 @@ +# Tests that lld does not create separate segment if the input sections are part +# of the same output section + +# Build executable +# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t1.exe -static \ +# RUN: --no-align-segments --noinhibit-exec +# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t2.exe -static \ +# RUN: --noinhibit-exec +# RUN: llvm-readobj -program-headers %t1.exe | FileCheck %s -check-prefix=SEGMENTS +# RUN: llvm-readobj -program-headers %t2.exe | FileCheck %s -check-prefix=SEGMENTS +# +#SEGMENTS: VirtualAddress: 0x400000 +#SEGMENTS: PhysicalAddress: 0x400000 +#SEGMENTS: FileSize: 288 +#SEGMENTS: MemSize: 288 +#SEGMENTS: VirtualAddress: 0x404000 +#SEGMENTS: PhysicalAddress: 0x404000 +#SEGMENTS: FileSize: 16608 +#SEGMENTS: MemSize: 16608 +#SEGMENTS: Alignment: 16384 +# +# object +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .text.foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000002000 + Content: 554889E54883EC1048BF0000000000000000B000E800000000B9000000008945FC89C84883C4105DC3 + - Name: .rela.text.foo + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text.foo + Relocations: + - Offset: 0x000000000000000A + Symbol: .rodata.str1.1 + Type: R_X86_64_64 + Addend: 0 + - Offset: 0x0000000000000015 + Symbol: printf + Type: R_X86_64_PC32 + Addend: -4 + - Name: .text.bar + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000004000 + Content: 554889E54883EC1048BF0000000000000000B000E800000000B9000000008945FC89C84883C4105DC3 + - Name: .rela.text.bar + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text.bar + Relocations: + - Offset: 0x000000000000000A + Symbol: .rodata.str1.1 + Type: R_X86_64_64 + Addend: 7 + - Offset: 0x0000000000000015 + Symbol: printf + Type: R_X86_64_PC32 + Addend: -4 + - Name: .text.main + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10C745FC00000000E8000000008945F8E8000000008B4DF801C189C84883C4105DC3 + - Name: .rela.text.main + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text.main + Relocations: + - Offset: 0x0000000000000010 + Symbol: foo + Type: R_X86_64_PC32 + Addend: -4 + - Offset: 0x0000000000000018 + Symbol: bar + Type: R_X86_64_PC32 + Addend: -4 + - Name: .rodata.str1.1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 48656C6C6F0A00576F726C640A00 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 005562756E747520636C616E672076657273696F6E20332E352E302D73766E3231373330342D317E6578703120286272616E636865732F72656C656173655F33352920286261736564206F6E204C4C564D20332E352E302900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002900000000410E108602430D060000001800000038000000000000002900000000410E108602430D060000001C00000054000000000000002900000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text.foo + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x000000000000003C + Symbol: .text.bar + Type: R_X86_64_PC32 + Addend: 0 + - Offset: 0x0000000000000058 + Symbol: .text.main + Type: R_X86_64_PC32 + Addend: 0 +Symbols: + Local: + - Name: 1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .text.foo + Type: STT_SECTION + Section: .text.foo + - Name: .text.bar + Type: STT_SECTION + Section: .text.bar + - Name: .text.main + Type: STT_SECTION + Section: .text.main + - Name: .rodata.str1.1 + Type: STT_SECTION + Section: .rodata.str1.1 + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: bar + Type: STT_FUNC + Section: .text.bar + Size: 0x0000000000000029 + - Name: foo + Type: STT_FUNC + Section: .text.foo + Size: 0x0000000000000029 + - Name: main + Type: STT_FUNC + Section: .text.main + Size: 0x0000000000000029 + - Name: printf +... diff --git a/test/old-elf/X86_64/reloc_r_x86_64_16.test b/test/old-elf/X86_64/reloc_r_x86_64_16.test new file mode 100644 index 000000000000..093fbeb4f137 --- /dev/null +++ b/test/old-elf/X86_64/reloc_r_x86_64_16.test @@ -0,0 +1,59 @@ +# Tests that lld can handle relocations of type R_X86_64_16 +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o +#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static +#RUN: llvm-objdump -s %t2.out | FileCheck %s +#CHECK: Contents of section .data: +#CHECK: 401000 0210 +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: '0000' + - Name: .rela.data + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: foo + Type: R_X86_64_16 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: bar + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000008 + - Name: foo + Type: STT_OBJECT + Section: .data + Value: 0x0000000000000002 + Size: 0x0000000000000002 +... diff --git a/test/old-elf/X86_64/reloc_r_x86_64_pc16.test b/test/old-elf/X86_64/reloc_r_x86_64_pc16.test new file mode 100644 index 000000000000..c6e53ad636e8 --- /dev/null +++ b/test/old-elf/X86_64/reloc_r_x86_64_pc16.test @@ -0,0 +1,60 @@ +# Tests that lld can handle relocations of type R_X86_64_PC16 +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o +#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static +#RUN: llvm-objdump -s %t2.out | FileCheck %s +#CHECK: Contents of section .data: +#CHECK: 401000 0700 +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: '0000' + - Name: .rela.data + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: foo + Type: R_X86_64_PC16 + Addend: 5 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: bar + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000008 + - Name: foo + Type: STT_OBJECT + Section: .data + Value: 0x0000000000000002 + Size: 0x0000000000000002 +... diff --git a/test/old-elf/X86_64/reloc_r_x86_64_pc64.test b/test/old-elf/X86_64/reloc_r_x86_64_pc64.test new file mode 100644 index 000000000000..a7c5e88965c5 --- /dev/null +++ b/test/old-elf/X86_64/reloc_r_x86_64_pc64.test @@ -0,0 +1,60 @@ +# Tests that lld can handle relocations of type R_X86_64_PC64 +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o +#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static +#RUN: llvm-objdump -s %t2.out | FileCheck %s +#CHECK: Contents of section .data: +#CHECK: 401000 0a00 +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: '0000' + - Name: .rela.data + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .data + Relocations: + - Offset: 0x0000000000000000 + Symbol: foo + Type: R_X86_64_PC64 + Addend: 8 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: bar + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000008 + - Name: foo + Type: STT_OBJECT + Section: .data + Value: 0x0000000000000002 + Size: 0x0000000000000002 +... diff --git a/test/old-elf/X86_64/rodata.test b/test/old-elf/X86_64/rodata.test new file mode 100644 index 000000000000..6f85ac0423fd --- /dev/null +++ b/test/old-elf/X86_64/rodata.test @@ -0,0 +1,9 @@ +# This tests that the ordinals for all merge atoms and defined atoms have been +# set properly + +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o --noinhibit-exec \ +RUN: --merge-strings -static -o %t1 +RUN: llvm-nm -n %t1 | FileCheck %s + +CHECK: {{[0-9a-f]+}} R _nl_default_default_domain +CHECK: {{[0-9a-f]+}} R _nl_default_default_dirname diff --git a/test/old-elf/X86_64/sectionchoice.test b/test/old-elf/X86_64/sectionchoice.test new file mode 100644 index 000000000000..7ff838fed98d --- /dev/null +++ b/test/old-elf/X86_64/sectionchoice.test @@ -0,0 +1,7 @@ +# This tests that we are able to properly set the sectionChoice for DefinedAtoms +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/zerosizedsection.o \ +RUN: --noinhibit-exec -o %t --output-filetype=yaml +RUN: FileCheck %s < %t + +CHECK-NOT: section-choice: sectionCustomRequired + diff --git a/test/old-elf/X86_64/sectionmap.test b/test/old-elf/X86_64/sectionmap.test new file mode 100644 index 000000000000..5fa04bd87051 --- /dev/null +++ b/test/old-elf/X86_64/sectionmap.test @@ -0,0 +1,22 @@ +# This tests that we are able to merge the section .gcc_except_table, +# .data.rel.local, .data.rel.ro, any other sections that belong to .data +# into appropriate output sections +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/sectionmap.o \ +RUN: --noinhibit-exec -o %t +RUN: llvm-readobj -sections %t | FileCheck %s -check-prefix=VERIFYSECTIONHEADERS + +VERIFYSECTIONHEADERS: Section { +VERIFYSECTIONHEADERS: Name: .data +VERIFYSECTIONHEADERS: } +VERIFYSECTIONHEADERS: Section { +VERIFYSECTIONHEADERS: Name: .gcc_except_table +VERIFYSECTIONHEADERS: } +VERIFYSECTIONHEADERS: Section { +VERIFYSECTIONHEADERS: Name: .data.rel.local +VERIFYSECTIONHEADERS: } +VERIFYSECTIONHEADERS: Section { +VERIFYSECTIONHEADERS: Name: .data.rel.ro +VERIFYSECTIONHEADERS: } +VERIFYSECTIONHEADERS: Section { +VERIFYSECTIONHEADERS: Name: .bss +VERIFYSECTIONHEADERS: } diff --git a/test/old-elf/X86_64/startGroupEndGroup.test b/test/old-elf/X86_64/startGroupEndGroup.test new file mode 100644 index 000000000000..e79e436a6513 --- /dev/null +++ b/test/old-elf/X86_64/startGroupEndGroup.test @@ -0,0 +1,48 @@ +# This tests functionality of --start-group, --end-group + +# This link should fail with unresolve symbol +RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o \ +RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a -o x 2> %t.err + +# Test group +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \ +RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a --end-group -o %t1 + +# Mix object files in group +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \ +RUN: %p/Inputs/group/fn.o %p/Inputs/group/fn2.o \ +RUN: %p/Inputs/group/fn1.o --end-group -o %t2 + +# Mix Whole archive input, the group should not iterate the file libfn.a +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \ +RUN: --whole-archive %p/Inputs/group/libfn.a --no-whole-archive \ +RUN: %p/Inputs/group/libfn1.a --end-group -o %t3 + +# Defined symbols in a shared library. +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \ +RUN: %p/Inputs/group/libfn2.so %p/Inputs/group/fn1.o %p/Inputs/group/fn.o \ +RUN: --end-group -o %t4 + +# Test alias options too, as they are more widely used +# Test group +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \ +RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a '-)' -o %t1.alias + +# Mix object files in group +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \ +RUN: %p/Inputs/group/fn.o %p/Inputs/group/fn2.o \ +RUN: %p/Inputs/group/fn1.o '-)' -o %t2.alias + +# Mix Whole archive input, the group should not iterate the file libfn.a +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \ +RUN: --whole-archive %p/Inputs/group/libfn.a --no-whole-archive \ +RUN: %p/Inputs/group/libfn1.a '-)' -o %t3.alias + +RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s +RUN: llvm-nm %t2 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s +RUN: llvm-nm %t3 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s +RUN: llvm-nm %t1.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s +RUN: llvm-nm %t2.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s +RUN: llvm-nm %t3.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s + +RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2 diff --git a/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test b/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test new file mode 100644 index 000000000000..30bfe1530f8e --- /dev/null +++ b/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test @@ -0,0 +1,10 @@ +# This tests functionality of --start-group, --end-group with a dynamic library + +# Mix dynamic libraries/object files in group +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \ +RUN: %p/Inputs/group/libfn.so %p/Inputs/group/fn2.o \ +RUN: %p/Inputs/group/fn1.o --end-group -o %t1 + +RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s + +RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2 diff --git a/test/old-elf/X86_64/staticlib-search.test b/test/old-elf/X86_64/staticlib-search.test new file mode 100644 index 000000000000..b84bd299f385 --- /dev/null +++ b/test/old-elf/X86_64/staticlib-search.test @@ -0,0 +1,6 @@ +# This tests the functionality for finding the static library libfn.a for ELF +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/main.o -L%p/Inputs/ -lfn -o %t \ +RUN: --noinhibit-exec -static -t 2> %t1 +RUN: FileCheck %s < %t1 + +CHECK: {{[\/0-9A-Za-z_]+}}libfn.a diff --git a/test/old-elf/X86_64/undef.test b/test/old-elf/X86_64/undef.test new file mode 100644 index 000000000000..f948286a339b --- /dev/null +++ b/test/old-elf/X86_64/undef.test @@ -0,0 +1,18 @@ +# This tests the functionality that an undefined symbol thats defined in the +# commmand line pulls in the required object file from the archive library +# which is usually the usecase for it +RUN: lld -flavor old-gnu -target x86_64 -u fn %p/Inputs/libfn.a -o %t --noinhibit-exec +RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SYMFROMARCHIVE %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/libfn.a -o %t --noinhibit-exec +RUN: llvm-readobj -symbols %t | FileCheck %s + +SYMFROMARCHIVE: Symbol { +SYMFROMARCHIVE: Name: fn ({{[0-9]+}} +SYMFROMARCHIVE: Size: 11 +SYMFROMARCHIVE: Binding: Global (0x1) +SYMFROMARCHIVE: Type: Function (0x2) +SYMFROMARCHIVE: Other: 0 +SYMFROMARCHIVE: Section: .text +SYMFROMARCHIVE: } + +CHECK-NOT: Name: fn diff --git a/test/old-elf/X86_64/underscore-end.test b/test/old-elf/X86_64/underscore-end.test new file mode 100644 index 000000000000..4ca0c94013ea --- /dev/null +++ b/test/old-elf/X86_64/underscore-end.test @@ -0,0 +1,81 @@ +# This tests verifies that the value of _end symbol is point to the right value +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \ +RUN: --noinhibit-exec -o %t --nmagic +RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=NMAGICABSSYMBOLS %s +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \ +RUN: --noinhibit-exec -o %t --omagic +RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=OMAGICABSSYMBOLS %s + +NMAGICABSSYMBOLS: Symbol { +NMAGICABSSYMBOLS: Name: __bss_start ({{[0-9]+}} +NMAGICABSSYMBOLS: Value: 0x40100C +NMAGICABSSYMBOLS: Size: 0 +NMAGICABSSYMBOLS: Binding: Global (0x1) +NMAGICABSSYMBOLS: Type: Object (0x1) +NMAGICABSSYMBOLS: Other: 0 +NMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +NMAGICABSSYMBOLS: } +NMAGICABSSYMBOLS: Symbol { +NMAGICABSSYMBOLS: Name: __bss_end ({{[0-9]+}} +NMAGICABSSYMBOLS: Value: 0x40100C +NMAGICABSSYMBOLS: Size: 0 +NMAGICABSSYMBOLS: Binding: Global (0x1) +NMAGICABSSYMBOLS: Type: Object (0x1) +NMAGICABSSYMBOLS: Other: 0 +NMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +NMAGICABSSYMBOLS: } +NMAGICABSSYMBOLS: Symbol { +NMAGICABSSYMBOLS: Name: _end ({{[0-9]+}} +NMAGICABSSYMBOLS: Value: 0x40100C +NMAGICABSSYMBOLS: Size: 0 +NMAGICABSSYMBOLS: Binding: Global (0x1) +NMAGICABSSYMBOLS: Type: Object (0x1) +NMAGICABSSYMBOLS: Other: 0 +NMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +NMAGICABSSYMBOLS: } +NMAGICABSSYMBOLS: Symbol { +NMAGICABSSYMBOLS: Name: end ({{[0-9]+}} +NMAGICABSSYMBOLS: Value: 0x40100C +NMAGICABSSYMBOLS: Size: 0 +NMAGICABSSYMBOLS: Binding: Global (0x1) +NMAGICABSSYMBOLS: Type: Object (0x1) +NMAGICABSSYMBOLS: Other: 0 +NMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +NMAGICABSSYMBOLS: } + +OMAGICABSSYMBOLS: Symbol { +OMAGICABSSYMBOLS: Name: __bss_start ({{[0-9]+}}) +OMAGICABSSYMBOLS: Value: 0x400144 +OMAGICABSSYMBOLS: Size: 0 +OMAGICABSSYMBOLS: Binding: Global (0x1) +OMAGICABSSYMBOLS: Type: Object (0x1) +OMAGICABSSYMBOLS: Other: 0 +OMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +OMAGICABSSYMBOLS: } +OMAGICABSSYMBOLS: Symbol { +OMAGICABSSYMBOLS: Name: __bss_end ({{[0-9]+}} +OMAGICABSSYMBOLS: Value: 0x400144 +OMAGICABSSYMBOLS: Size: 0 +OMAGICABSSYMBOLS: Binding: Global (0x1) +OMAGICABSSYMBOLS: Type: Object (0x1) +OMAGICABSSYMBOLS: Other: 0 +OMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +OMAGICABSSYMBOLS: } +OMAGICABSSYMBOLS: Symbol { +OMAGICABSSYMBOLS: Name: _end ({{[0-9]+}} +OMAGICABSSYMBOLS: Value: 0x400144 +OMAGICABSSYMBOLS: Size: 0 +OMAGICABSSYMBOLS: Binding: Global (0x1) +OMAGICABSSYMBOLS: Type: Object (0x1) +OMAGICABSSYMBOLS: Other: 0 +OMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +OMAGICABSSYMBOLS: } +OMAGICABSSYMBOLS: Symbol { +OMAGICABSSYMBOLS: Name: end ({{[0-9]+}} +OMAGICABSSYMBOLS: Value: 0x400144 +OMAGICABSSYMBOLS: Size: 0 +OMAGICABSSYMBOLS: Binding: Global (0x1) +OMAGICABSSYMBOLS: Type: Object (0x1) +OMAGICABSSYMBOLS: Other: 0 +OMAGICABSSYMBOLS: Section: Absolute (0xFFF1) +OMAGICABSSYMBOLS: } diff --git a/test/old-elf/X86_64/weak-override.test b/test/old-elf/X86_64/weak-override.test new file mode 100644 index 000000000000..25cb9d5d687f --- /dev/null +++ b/test/old-elf/X86_64/weak-override.test @@ -0,0 +1,45 @@ +# Test for weak symbol getting overridden +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak.o %p/Inputs/ovrd.o \ +RUN: -o %t --noinhibit-exec +RUN: llvm-nm %t | FileCheck -check-prefix=WEAKORDER %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak.o \ +RUN: %p/Inputs/ovrd.o -o %t2 --output-filetype=yaml --noinhibit-exec +RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2 + +WEAKORDER: {{[0-9a-c]+}} T f + +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: fn +WEAKATOMSORDER: - name: fn +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: [[CONSTSTRA:[-a-zA-Z0-9_]+]] +WEAKATOMSORDER: - ref-name: [[CONSTSTRA]] +WEAKATOMSORDER: scope: global +WEAKATOMSORDER: content: [ 55, 48, 89, E5, BF, 00, 00, 00, 00, E8, 00, 00, +WEAKATOMSORDER: 00, 00, 5D, C3 ] +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: main +WEAKATOMSORDER: - name: main +WEAKATOMSORDER: scope: global +WEAKATOMSORDER: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, E8, 00, 00, +WEAKATOMSORDER: 00, 00, B8, 00, 00, 00, 00, 5D, C3 ] +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: R_X86_64_PC32 +WEAKATOMSORDER: offset: 10 +WEAKATOMSORDER: target: f +WEAKATOMSORDER: addend: -4 +WEAKATOMSORDER: - ref-name: {{[0-9A-Z]+}} +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: f +WEAKATOMSORDER: - name: f +WEAKATOMSORDER: scope: global +WEAKATOMSORDER: content: [ 55, 48, 89, E5, BF, 00, 00, 00, 00, E8, 00, 00, +WEAKATOMSORDER: 00, 00, 5D, C3 ] diff --git a/test/old-elf/X86_64/weak-zero-sized.test b/test/old-elf/X86_64/weak-zero-sized.test new file mode 100644 index 000000000000..93e27a355d64 --- /dev/null +++ b/test/old-elf/X86_64/weak-zero-sized.test @@ -0,0 +1,26 @@ +# Test for zero sized weak atoms, there is only a single weak atom +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak-zero-sized.o -o %t \ +RUN: --noinhibit-exec +RUN: llvm-nm %t | FileCheck -check-prefix=WEAKORDER %s +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak-zero-sized.o \ +RUN: --output-filetype=yaml -o %t2 --noinhibit-exec +RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2 + +WEAKORDER: 004001a4 T _start + +WEAKATOMSORDER: alignment: 4 +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: [[TARGETC:[-a-zA-Z0-9_]+]] +WEAKATOMSORDER: - name: [[TARGETA:[-a-zA-Z0-9_]+]] +WEAKATOMSORDER: scope: global +WEAKATOMSORDER: merge: as-weak +WEAKATOMSORDER: alignment: 4 +WEAKATOMSORDER: references: +WEAKATOMSORDER: - kind: layout-after +WEAKATOMSORDER: offset: 0 +WEAKATOMSORDER: target: [[TARGETC]] +WEAKATOMSORDER: - ref-name: [[TARGETC]] +WEAKATOMSORDER: scope: global +WEAKATOMSORDER: content: [ C3 ] +WEAKATOMSORDER: alignment: 4 diff --git a/test/old-elf/X86_64/weaksym.test b/test/old-elf/X86_64/weaksym.test new file mode 100644 index 000000000000..9e4f2da9bdba --- /dev/null +++ b/test/old-elf/X86_64/weaksym.test @@ -0,0 +1,77 @@ +# Tests that an executable with a weak undefine will put this symbol in the +# dynamic symbol table if the executable has a dynamic relocation against this +# symbol. + +#RUN: yaml2obj --format elf %s -o %t.o +#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -o %t1 +#RUN: llvm-readobj -dt %t1 | FileCheck -check-prefix CHECKSYMS %s + +#CHECKSYMS: Name: x@ +#CHECKSYMS-NEXT: Value: 0x0 +#CHECKSYMS-NEXT: Size: 0 +#CHECKSYMS-NEXT: Binding: Weak (0x2) +#CHECKSYMS-NEXT: Type: None (0x0) +#CHECKSYMS-NEXT: Other: 0 +#CHECKSYMS-NEXT: Section: Undefined (0x0) + +# The object file above corresponds to the following C program compiled with +# -fPIC: +# extern int *x __attribute__((weak)); +# +# int main() { +# if (x) +# return 1; +# return 0; +# } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5488B0500000000C745FC00000000488138000000000F840C000000C745FC01000000E907000000C745FC000000008B45FC5DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000007 + Symbol: x + Type: R_X86_64_GOTPCREL + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000037 + - Name: _GLOBAL_OFFSET_TABLE_ + Weak: + - Name: x diff --git a/test/old-elf/X86_64/yamlinput.test b/test/old-elf/X86_64/yamlinput.test new file mode 100644 index 000000000000..1c51811eec95 --- /dev/null +++ b/test/old-elf/X86_64/yamlinput.test @@ -0,0 +1,166 @@ +# This tests the functionality that lld is able to read +# an input YAML from a previous link + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \ +RUN: --noinhibit-exec --output-filetype=yaml -o %t.objtxt +RUN: lld -flavor old-gnu -target x86_64-linux %t.objtxt \ +RUN: --noinhibit-exec -o %t1 +RUN: llvm-readobj -sections %t1 | FileCheck %s -check-prefix=SECTIONS + +SECTIONS: Section { +SECTIONS: Index: 0 +SECTIONS: Name: (0) +SECTIONS: Type: SHT_NULL (0x0) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 1 +SECTIONS: Name: .interp +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 2 +SECTIONS: Name: .hash +SECTIONS: Type: SHT_HASH (0x5) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 3 +SECTIONS: Name: .dynsym +SECTIONS: Type: SHT_DYNSYM (0xB) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 4 +SECTIONS: Name: .dynstr +SECTIONS: Type: SHT_STRTAB (0x3) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 5 +SECTIONS: Name: .text +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x6) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_EXECINSTR (0x4) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 6 +SECTIONS: Name: .rodata +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 7 +SECTIONS: Name: .eh_frame +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x2) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 8 +SECTIONS: Name: .eh_frame_hdr +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 9 +SECTIONS: Name: .init_array +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 10 +SECTIONS: Name: .fini_array +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 11 +SECTIONS: Name: .dynamic +SECTIONS: Type: SHT_DYNAMIC (0x6) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 12 +SECTIONS: Name: .got.plt +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 13 +SECTIONS: Name: .data +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 14 +SECTIONS: Name: .bss +SECTIONS: Type: SHT_NOBITS (0x8) +SECTIONS: Flags [ (0x3) +SECTIONS: SHF_ALLOC (0x2) +SECTIONS: SHF_WRITE (0x1) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 15 +SECTIONS: Name: .comment +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 16 +SECTIONS: Name: .note.GNU-stack +SECTIONS: Type: SHT_PROGBITS (0x1) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 17 +SECTIONS: Name: .shstrtab +SECTIONS: Type: SHT_STRTAB (0x3) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 18 +SECTIONS: Name: .symtab +SECTIONS: Type: SHT_SYMTAB (0x2) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } +SECTIONS: Section { +SECTIONS: Index: 19 +SECTIONS: Name: .strtab +SECTIONS: Type: SHT_STRTAB (0x3) +SECTIONS: Flags [ (0x0) +SECTIONS: ] +SECTIONS: } diff --git a/test/old-elf/abs-dup.objtxt b/test/old-elf/abs-dup.objtxt new file mode 100644 index 000000000000..c662c9b44b4a --- /dev/null +++ b/test/old-elf/abs-dup.objtxt @@ -0,0 +1,19 @@ +# Tests handling an absolute symbol with no name +# RUN: lld -flavor old-gnu -target x86_64 -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +absolute-atoms: + - name: abs + scope: static + value: 0x10 + - name: '' + scope: static + value: 0x15 + +# CHECK: absolute-atoms: +# CHECK: - name: abs +# CHECK: scope: static +# CHECK: value: 0x0000000000000010 +# CHECK: - name: '' +# CHECK: scope: static +# CHECK: value: 0x0000000000000015 diff --git a/test/old-elf/abs.test b/test/old-elf/abs.test new file mode 100644 index 000000000000..f542582bfa85 --- /dev/null +++ b/test/old-elf/abs.test @@ -0,0 +1,19 @@ +# +# Source File: +# .local absGlobalSymbol +# .set absLocalSymbol,0xC0000 +# .type absLocalSymbol, @object +# .globl absGlobalSymbol +# .set absGlobalSymbol,0xD0000 +# .type absGlobalSymbol, @object + +# built using: "gcc -m32" +# +RUN: lld -flavor old-gnu -target i386 --output-filetype=yaml -r %p/Inputs/abs-test.i386 | FileCheck -check-prefix=YAML %s + +YAML: absolute-atoms: +YAML: - name: absLocalSymbol +YAML: value: {{0x[0]+C0000}} +YAML: - name: absGlobalSymbol +YAML: scope: global +YAML: value: {{0x[0]+D0000}} diff --git a/test/old-elf/allowduplicates.objtxt b/test/old-elf/allowduplicates.objtxt new file mode 100644 index 000000000000..b2f263148b60 --- /dev/null +++ b/test/old-elf/allowduplicates.objtxt @@ -0,0 +1,41 @@ +# RUN: lld -flavor old-gnu -target x86_64 --allow-multiple-definition %s \ +# RUN: %p/Inputs/allowduplicates.objtxt \ +# RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s +# +# RUN: not lld -flavor old-gnu -target x86_64 %s %p/Inputs/allowduplicates.objtxt \ +# RUN: --output-filetype=yaml \ +# RUN: --noinhibit-exec 2>&1 | FileCheck -check-prefix=ERROR %s +# +# RUN: lld -flavor old-gnu -target x86_64 -z muldefs %s \ +# RUN: %p/Inputs/allowduplicates.objtxt \ +# RUN: --noinhibit-exec --output-filetype=yaml | FileCheck %s + +--- +defined-atoms: + - name: .text + alignment: 16 + section-choice: custom-required + section-name: .text + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, + 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text +--- + +# CHECK: defined-atoms: +# CHECK: - name: .text +# CHECK: alignment: 16 +# CHECK: section-choice: custom-required +# CHECK: section-name: .text +# CHECK: - name: main +# CHECK: scope: global +# CHECK: content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, +# CHECK: 00, C3 ] +# CHECK: alignment: 16 +# CHECK: section-choice: custom-required +# CHECK: section-name: .text + +# ERROR: duplicate symbol error diff --git a/test/old-elf/archive-elf-forceload.test b/test/old-elf/archive-elf-forceload.test new file mode 100644 index 000000000000..db5ba6cdfaa2 --- /dev/null +++ b/test/old-elf/archive-elf-forceload.test @@ -0,0 +1,43 @@ +# Tests the functionality of archive libraries reading +# and resolution +# Note: The binary files would not be required once we have support to generate +# binary archives from textual(yaml) input +# +# Tests generated using the source files below +# main file +# int main() +# { +# fn(); +# return 0; +# } +# +# archive file +# int fn() +# { +# return 0; +# } +# +# int fn1() +# { +# return 0; +# } +# gcc -c main.c fn.c fn1.c + +RUN: lld -flavor old-gnu -target x86_64-linux -e main %p/Inputs/mainobj.x86_64 \ +RUN: --whole-archive %p/Inputs/libfnarchive.a --no-whole-archive --output-filetype=yaml \ +RUN: | FileCheck -check-prefix FORCELOAD %s + +FORCELOAD: defined-atoms: +FORCELOAD: - name: fn1 +FORCELOAD: scope: global +FORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ] +FORCELOAD: - name: fn +FORCELOAD: scope: global +FORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ] +FORCELOAD: absolute-atoms: +FORCELOAD: - name: main.c +FORCELOAD: value: 0x0 +FORCELOAD: - name: fn1.c +FORCELOAD: value: 0x0 +FORCELOAD: - name: fn.c +FORCELOAD: value: 0x0 diff --git a/test/old-elf/archive-elf.test b/test/old-elf/archive-elf.test new file mode 100644 index 000000000000..7784eb9279dc --- /dev/null +++ b/test/old-elf/archive-elf.test @@ -0,0 +1,38 @@ +# Tests the functionality of archive libraries reading +# and resolution +# Note: The binary files would not be required once we have support to generate +# binary archives from textual(yaml) input +# +# Tests generated using the source files below +# main file +# int main() +# { +# fn(); +# return 0; +# } +# +# archive file +# int fn() +# { +# return 0; +# } +# +# int fn1() +# { +# return 0; +# } +# gcc -c main.c fn.c fn1.c + +RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -r \ +RUN: %p/Inputs/mainobj.x86_64 %p/Inputs/libfnarchive.a | \ +RUN: FileCheck -check-prefix NOFORCELOAD %s + +NOFORCELOAD: defined-atoms: +NOFORCELOAD: - name: fn +NOFORCELOAD: scope: global +NOFORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ] +NOFORCELOAD: absolute-atoms: +NOFORCELOAD: - name: main.c +NOFORCELOAD: value: 0x0 +NOFORCELOAD: - name: fn.c +NOFORCELOAD: value: 0x0 diff --git a/test/old-elf/as-needed.test b/test/old-elf/as-needed.test new file mode 100644 index 000000000000..bcebfbac2f24 --- /dev/null +++ b/test/old-elf/as-needed.test @@ -0,0 +1,15 @@ +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \ +RUN: --as-needed %p/Inputs/shared.so-x86-64 %p/Inputs/libifunc.x86-64.so \ +RUN: -o %t1 -e main --allow-shlib-undefined +RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s -check-prefix AS_NEEDED + +AS_NEEDED: NEEDED SharedLibrary (shared.so-x86-64) +AS_NEEDED-NOT: NEEDED SharedLibrary (libifunc.x86-64.so) + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 %p/Inputs/libifunc.x86-64.so \ +RUN: -o %t2 -e main --allow-shlib-undefined +RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s -check-prefix NO_AS_NEEDED + +NO_AS_NEEDED: NEEDED SharedLibrary (shared.so-x86-64) +NO_AS_NEEDED: NEEDED SharedLibrary (libifunc.x86-64.so) diff --git a/test/old-elf/branch.test b/test/old-elf/branch.test new file mode 100644 index 000000000000..116fd0f07c5e --- /dev/null +++ b/test/old-elf/branch.test @@ -0,0 +1,34 @@ +RUN: lld -flavor old-gnu -target hexagon -static --output-filetype=yaml \ +RUN: %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon --noinhibit-exec | FileCheck %s -check-prefix hexagon-yaml +RUN: lld -flavor old-gnu -target hexagon -e target -o %t1 \ +RUN: %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon --noinhibit-exec +RUN: llvm-readobj -h %t1 | FileCheck -check-prefix=hexagon-readobj %s + +hexagon-yaml: - name: back +hexagon-yaml: scope: global +hexagon-yaml: content: [ 00, C0, 00, 7F, 00, C0, 00, 5A, 00, 00, 00, 00, +hexagon-yaml: 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ] +hexagon-yaml: references: +hexagon-yaml: - kind: +hexagon-yaml: offset: 4 +hexagon-yaml: target: target + +hexagon-yaml: - name: target +hexagon-yaml: scope: global +hexagon-yaml: content: [ 00, C0, 00, 5A ] +hexagon-yaml: references: +hexagon-yaml: - kind: +hexagon-yaml: offset: 0 +hexagon-yaml: target: back + + +hexagon-readobj: ElfHeader { +hexagon-readobj: Ident { +hexagon-readobj: Class: 32-bit (0x1) +hexagon-readobj: DataEncoding: LittleEndian (0x1) +hexagon-readobj: FileVersion: 1 +hexagon-readobj: OS/ABI: SystemV (0x0) +hexagon-readobj: ABIVersion: 0 +hexagon-readobj: } +hexagon-readobj: Type: Executable (0x2) +hexagon-readobj: Machine: EM_HEXAGON (0xA4) diff --git a/test/old-elf/check.test b/test/old-elf/check.test new file mode 100644 index 000000000000..3fc11728e12d --- /dev/null +++ b/test/old-elf/check.test @@ -0,0 +1,39 @@ +# This tests the basic functionality of ordering data and functions as they +# appear in the inputs +RUN: lld -flavor old-gnu -target i386 -e global_func --noinhibit-exec --output-filetype=yaml \ +RUN: %p/Inputs/object-test.elf-i386 -o %t +RUN: FileCheck %s -check-prefix ELF-i386 < %t +RUN: lld -flavor old-gnu -target hexagon -e global_func --noinhibit-exec --output-filetype=yaml \ +RUN: %p/Inputs/object-test.elf-hexagon -o %t1 +RUN: FileCheck %s -check-prefix ELF-hexagon < %t1 + +ELF-i386: defined-atoms: +ELF-i386: - name: global_func +ELF-i386: - name: static_func +ELF-i386: - name: weak_func +ELF-i386: - name: hidden_func +ELF-i386: - name: no_dead_strip +ELF-i386: - name: no_special_section_func +ELF-i386: - name: global_variable +ELF-i386: - name: uninitialized_static_variable +ELF-i386: - name: special_section_func +ELF-i386: undefined-atoms: +ELF-i386: - name: puts +ELF-i386: absolute-atoms: +ELF-i386: - name: sample.c + +ELF-hexagon: - name: global_func +ELF-hexagon: - name: static_func +ELF-hexagon: - name: weak_func +ELF-hexagon: - name: hidden_func +ELF-hexagon: - name: no_dead_strip +ELF-hexagon: - name: no_special_section_func +ELF-hexagon: - name: global_variable +ELF-hexagon: - name: uninitialized_static_variable +ELF-hexagon: - name: special_section_func +ELF-hexagon: undefined-atoms: +ELF-hexagon: - name: puts +ELF-hexagon: absolute-atoms: +ELF-hexagon: - name: sample.c +ELF-hexagon: scope: static +ELF-hexagon: value: 0x0000000000000000 diff --git a/test/old-elf/checkrodata.test b/test/old-elf/checkrodata.test new file mode 100644 index 000000000000..71304a443b8b --- /dev/null +++ b/test/old-elf/checkrodata.test @@ -0,0 +1,9 @@ + +RUN: lld -flavor old-gnu -target i386 -o %t1 %p/Inputs/rodata-test.i386 --noinhibit-exec +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=i386 %s +RUN: lld -flavor old-gnu -target hexagon -o %t2 %p/Inputs/rodata-test.hexagon --noinhibit-exec +RUN: llvm-objdump -section-headers %t2 | FileCheck -check-prefix=hexagon %s + +i386: .rodata 00000004 0000000000000114 DATA + +hexagon: .rodata 00000004 0000000000000114 DATA diff --git a/test/old-elf/common.test b/test/old-elf/common.test new file mode 100644 index 000000000000..e337ac399140 --- /dev/null +++ b/test/old-elf/common.test @@ -0,0 +1,10 @@ +RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/relocs.x86-64 \ +RUN: -e _start -static +RUN: llvm-readobj -t %t | FileCheck %s + +CHECK: Symbol { +CHECK: Name: i +CHECK-NEXT: Value: +CHECK-NEXT: Size: +CHECK-NEXT: Binding: +CHECK-NEXT: Type: Object diff --git a/test/old-elf/consecutive-weak-sym-defs.test b/test/old-elf/consecutive-weak-sym-defs.test new file mode 100644 index 000000000000..0120aa126551 --- /dev/null +++ b/test/old-elf/consecutive-weak-sym-defs.test @@ -0,0 +1,81 @@ +#Tests that multiple consecutive weak symbol definitions do not confuse the +#ELF reader. For example: +# +# my_weak_func1: +# my_weak_func2: +# my_weak_func3: +# code +# +#If my_weak_func2 is merged to other definition, this should not disturb the +#definition my_weak_func1 to "code". +# +# +#RUN: yaml2obj -format=elf %p/Inputs/consecutive-weak-defs.o.yaml -o=%t1.o +#RUN: yaml2obj -format=elf %p/Inputs/main-with-global-def.o.yaml -o=%t2.o +#RUN: lld -flavor old-gnu -target x86_64 %t1.o %t2.o -e=main -o %t1 +#RUN: obj2yaml %t1 | FileCheck -check-prefix CHECKLAYOUT %s +# +# Check that the layout has not been changed: +# +#CHECKLAYOUT: Name: .text +#CHECKLAYOUT-NEXT: Type: +#CHECKLAYOUT-NEXT: Flags: +#CHECKLAYOUT-NEXT: Address: +#CHECKLAYOUT-NEXT: AddressAlign: +#CHECKLAYOUT-NEXT: Content: 554889E5E8020000005DC3554889E5B8640000005DC3 +# ^~~> my_func ^~~> my_weak_func +# +# +# +#Our two input files were produced by the following code: +# +#Inputs/consecutive-weak-defs.o.yaml (this one is in assembly to allow us to +# easily define multiple labels) +# +# .text +# .globl my_func +# .type my_func,@function +# my_func: +# pushq %rbp +# movq %rsp, %rbp +# callq my_weak_func +# popq %rbp +# retq +# .Ltmp0: +# .size my_func, .Ltmp0-my_func +# +# .text +# .weak my_weak_func +# .type my_weak_func,@function +# .weak my_weak_func2 +# .type my_weak_func2,@function +# .weak my_weak_func3 +# .type my_weak_func3,@function +# my_weak_func: +# my_weak_func2: +# my_weak_func3: +# pushq %rbp +# movq %rsp, %rbp +# movl $100, %eax +# popq %rbp +# retq +# .Ltmp1: +# .size my_weak_func, .Ltmp1-my_weak_func +# .size my_weak_func2, .Ltmp1-my_weak_func2 +# .size my_weak_func3, .Ltmp1-my_weak_func3 +# +#Inputs/main-with-global-def.o.yaml: +# +# int my_func(); +# +# int my_weak_func2() { +# return 200; +# } +# +# int main() { +# return my_func(); +# } +# +#------------------------------------------------------------------------------- +# The net effect is that this program should return 100. + diff --git a/test/old-elf/defsym.objtxt b/test/old-elf/defsym.objtxt new file mode 100644 index 000000000000..7fdc20d4dd93 --- /dev/null +++ b/test/old-elf/defsym.objtxt @@ -0,0 +1,31 @@ +# RUN: lld -flavor old-gnu -target x86_64 --defsym=foo=0x1234 -r %s \ +# RUN: --output-filetype=yaml | FileCheck -check-prefix=ABS %s + +# RUN: lld -flavor old-gnu -target x86_64 --defsym=foo=main -r %s \ +# RUN: --output-filetype=yaml | FileCheck -check-prefix=ALIAS %s + +# RUN: lld -flavor old-gnu -target x86_64 --defsym foo=main -r %s \ +# RUN: --output-filetype=yaml | FileCheck -check-prefix=ALIAS %s + +defined-atoms: + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text + +# ABS: absolute-atoms: +# ABS: - name: foo +# ABS: scope: global +# ABS: value: 0x0000000000001234 + +# ALIAS: defined-atoms: +# ALIAS: - name: foo +# ALIAS: scope: global +# ALIAS: section-choice: custom-required +# ALIAS: section-name: .text +# ALIAS: references: +# ALIAS: - kind: layout-after +# ALIAS: offset: 0 +# ALIAS: target: main diff --git a/test/old-elf/discard-all.test b/test/old-elf/discard-all.test new file mode 100644 index 000000000000..7fca435008ab --- /dev/null +++ b/test/old-elf/discard-all.test @@ -0,0 +1,88 @@ +# Test that -x/--discard all works. +# +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main -x -o %t1 +#RUN: llvm-objdump -t %t1 | FileCheck %s + +#CHECK-NOT: 0000000000400210 l F .text 00000009 local + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E58B45FC5DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000900000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 48 +Symbols: + Local: + - Name: local + Type: STT_FUNC + Section: .text + Value: 0x0000000000000030 + Size: 0x0000000000000009 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000024 +... diff --git a/test/old-elf/discard-locals.test b/test/old-elf/discard-locals.test new file mode 100644 index 000000000000..d1a0918949ad --- /dev/null +++ b/test/old-elf/discard-locals.test @@ -0,0 +1,65 @@ +# Test that -X/--discard-locals works. +# +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -shared -X -o %t1 +#RUN: llvm-objdump -t %t1 | FileCheck %s + +#CHECK-NOT: 0000000000400121 l .rodata 00000000 .Lsym8 + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00000000F20F100D00000000C3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .rodata.str1.1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000008 + Symbol: .Lsym8 + Type: R_X86_64_PC32 + Addend: -4 +Symbols: + Local: + - Name: .Lsym8 + Section: .rodata.str1.1 + - Name: test + Section: .text + Value: 0x000000000000000C + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .rodata.str1.1 + Type: STT_SECTION + Section: .rodata.str1.1 +... diff --git a/test/old-elf/dynamic-segorder.test b/test/old-elf/dynamic-segorder.test new file mode 100644 index 000000000000..e9143d83f0f6 --- /dev/null +++ b/test/old-elf/dynamic-segorder.test @@ -0,0 +1,17 @@ +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \ +RUN: --defsym=__tls_get_addr=0 +RUN: llvm-objdump -p %t | FileCheck %s + +CHECK: PHDR +CHECK: flags r-x +CHECK: INTERP +CHECK: flags r-- +CHECK: LOAD +CHECK: flags r-x +CHECK: LOAD +CHECK: flags rw- +CHECK: DYNAMIC +CHECK: flags rw- +CHECK: TLS +CHECK: flags rw- diff --git a/test/old-elf/dynamic-undef.test b/test/old-elf/dynamic-undef.test new file mode 100644 index 000000000000..fc661684b19b --- /dev/null +++ b/test/old-elf/dynamic-undef.test @@ -0,0 +1,38 @@ +# +# This test creates a executable and tests the options that are used to +# to create an executable and a shared library +# +# This test will fail because there are unresolved symbols from the shared +# library and we are passing --no-allow-shlib-undefined +RUN: not lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --no-allow-shlib-undefined 2> %t1 +RUN: FileCheck -check-prefix=EXEC %s < %t1 +# This test will pass because of --allow-shlib-undefined +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \ +RUN: --defsym=__tls_get_addr=0 +# This test will pass becase --allow-shlib-undefined is the default. +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t -e main \ +RUN: --defsym=__tls_get_addr=0 +# Building shared libraries should not fail when there is a undefined symbol. +# Test creation of shared library, this should pass because we are using +# shared option and by default, dynamic library wouldn't create undefined atoms +# from the input shared library +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t.usenoundefines -e main -shared +RUN: llvm-readobj -symbols %t.usenoundefines | FileCheck %s -check-prefix=SHLIB-NOUNDEF +# Test creation of shared library, this should fail because we are using +# shared option setting the options to use the shared library undefines to +# create undefined atoms from the input shared library +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t.useundefines -e main -shared \ +RUN: --use-shlib-undefines --no-allow-shlib-undefined 2> %t2 +RUN: llvm-readobj -symbols %t.useundefines | FileCheck -check-prefix=SHLIB-UNDEF-SYMBOLS %s + +EXEC: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: puts +SHLIB: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: puts +EXEC-NOT: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: weakfoo +SHLIB-NOT: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: weakfoo +SHLIB-NOUNDEF-NOT: Name: puts +SHLIB-UNDEF-SYMBOLS: Name: puts diff --git a/test/old-elf/dynamic.test b/test/old-elf/dynamic.test new file mode 100644 index 000000000000..2b548a7aaf5e --- /dev/null +++ b/test/old-elf/dynamic.test @@ -0,0 +1,80 @@ +# Checks functionality of dynamic executables +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \ +RUN: -rpath /l1:/l2 -rpath /l3 +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml -o %t2 --allow-shlib-undefined \ +RUN: --noinhibit-exec +RUN: llvm-objdump -p %t >> %t2 +RUN: llvm-readobj -s -dyn-symbols -dynamic-table %t >> %t2 +RUN: FileCheck %s < %t2 + +CHECK: name: main +CHECK: kind: R_X86_64_PC32 +CHECK: offset: 18 +CHECK: target: [[PLTNAME:[-a-zA-Z0-9_]+]] + +CHECK: name: [[PLTNAME]] +CHECK: type: stub + +CHECK: type: got +CHECK: references: +CHECK: kind: R_X86_64_JUMP_SLOT + +CHECK: shared-library-atoms: +CHECK: name: foo +CHECK: load-name: shared.so-x86-64 + +CHECK: PHDR off 0x{{0+}}40 +CHECK: INTERP +CHECK: flags r-- + +CHECK: Section { +CHECK: Name: .hash +CHECK-NEXT: Type: SHT_HASH +CHECK-NEXT: Flags [ +CHECK-NEXT: SHF_ALLOC +CHECK-NEXT: ] +CHECK-NEXT: Address: +CHECK-NEXT: Offset: +CHECK-NEXT: Size: 32 +CHECK-NEXT: Link: +CHECK-NEXT: Info: +CHECK-NEXT: AddressAlignment: 8 +CHECK-NEXT: EntrySize: +CHECK-NEXT: } + +CHECK: DynamicSymbols [ +CHECK: Symbol { +CHECK: Name: foo +CHECK-NEXT: Value: 0 +CHECK-NEXT: Size: +CHECK-NEXT: Binding: Global +CHECK-NEXT: Type: Function +CHECK: } +CHECK: Symbol { +CHECK: Name: i +CHECK-NEXT: Value: 0 +CHECK-NEXT: Size: +CHECK-NEXT: Binding: Global +CHECK-NEXT: Type: Object +CHECK: } + +CHECK: DynamicSection [ (15 entries) +CHECK: Tag Type Name/Value +CHECK: 0x0000000000000004 HASH +CHECK: 0x0000000000000005 STRTAB +CHECK: 0x0000000000000006 SYMTAB +CHECK: 0x000000000000000A STRSZ +CHECK: 0x000000000000000B SYMENT 24 +CHECK: 0x0000000000000007 RELA +CHECK: 0x0000000000000008 RELASZ 24 +CHECK: 0x0000000000000009 RELAENT 24 +CHECK: 0x0000000000000002 PLTRELSZ 24 +CHECK: 0x0000000000000003 PLTGOT +CHECK: 0x0000000000000014 PLTREL RELA +CHECK: 0x0000000000000017 JMPREL +CHECK: 0x0000000000000001 NEEDED SharedLibrary (shared.so-x86-64) +CHECK: 0x000000000000000F RPATH /l1:/l2:/l3 +CHECK: 0x0000000000000000 NULL 0x0 +CHECK: ] diff --git a/test/old-elf/eh_frame_hdr.test b/test/old-elf/eh_frame_hdr.test new file mode 100644 index 000000000000..74383b8dbc5b --- /dev/null +++ b/test/old-elf/eh_frame_hdr.test @@ -0,0 +1,30 @@ +#RUN: yaml2obj -format=elf %s > %t +#RUN: lld -flavor old-gnu -target x86_64-linux %t --noinhibit-exec \ +#RUN: -o %t1 +#RUN: llvm-objdump -s %t1 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: +- Name: .eh_frame + Type: SHT_PROGBITS + Content: "00" + AddressAlign: 8 + Flags: [SHF_ALLOC] + +Symbols: + Local: + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + +# CHECK: Contents of section .eh_frame: +# CHECK-NEXT: 4001e0 00 +# CHECK-NEXT: Contents of section .eh_frame_hdr: +# CHECK-NEXT: 4001e8 011bffff f4ffffff +# ^ 0x4001e0 - 0x4001e8 - 4 = 0xfffffff4 diff --git a/test/old-elf/entry.objtxt b/test/old-elf/entry.objtxt new file mode 100644 index 000000000000..6590d139c417 --- /dev/null +++ b/test/old-elf/entry.objtxt @@ -0,0 +1,58 @@ +# Tests entry point handling +# +# Test generated using the source file below: +# +# int main() +# { +# return 0; +# } +# + +# RUN: lld -flavor old-gnu -target x86_64 %s -e _entrypoint --noinhibit-exec -o %t1 +# RUN: llvm-nm -n %t1 | FileCheck %s +# +# CHECK: U _entrypoint +# CHECK: 004001e0 T main +# CHECK: 00401000 D _DYNAMIC +# CHECK: 00401060 A _end +# CHECK: 00401060 A end + +defined-atoms: + - name: .text + alignment: 16 + section-choice: custom-required + section-name: .text + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, + 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text + - name: .data + type: data + alignment: 4 + section-choice: custom-required + section-name: .data + - name: .bss + type: zero-fill + alignment: 4 + section-choice: custom-required + section-name: .bss + - name: .note.GNU-stack + section-choice: custom-required + section-name: .note.GNU-stack + permissions: r-- + - name: .eh_frame + content: [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00, + 01, 78, 10, 01, 1B, 0C, 07, 08, 90, 01, 00, 00, + 14, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00, + 0E, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ] + alignment: 8 + section-choice: custom-required + section-name: .eh_frame + permissions: r-- + references: + - kind: R_X86_64_PC32 + offset: 32 + target: .text diff --git a/test/old-elf/export-dynamic.test b/test/old-elf/export-dynamic.test new file mode 100644 index 000000000000..b88961597ea0 --- /dev/null +++ b/test/old-elf/export-dynamic.test @@ -0,0 +1,98 @@ +# Tests the --export-dynamic (-E) flag. When creating a dynamic executable and +# receiving this flag, the linker should export all globally visible symbols in +# its dynamic symbol table. + +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 -E %t.o -e=main -o %t1 +#RUN: llvm-readobj -dt %t1 | FileCheck -check-prefix CHECKSYMS %s + +#CHECKSYMS: myfunc1@ +#CHECKSYMS: main@ +#CHECKSYMS: myvar1@ + +# The object file below was generated with the following code: +# +# (command line clang -c prog.c -o prog.o) +# +# int myvar1 = 22; +# +# static int mysecretvar = 11; +# +# int myfunc1() { +# return 23; +# } +# +# static int mysecretfunc() { +# return 42; +# } +# +# int main() { +# return mysecretfunc() + mysecretvar; +# } +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B8170000005DC30F1F440000554889E54883EC10C745FC00000000E81C000000030425000000004883C4105DC36666666666662E0F1F840000000000554889E5B82A0000005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000027 + Symbol: .data + Type: R_X86_64_32S + Addend: 4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: 160000000B000000 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: mysecretfunc + Type: STT_FUNC + Section: .text + Value: 0x0000000000000040 + Size: 0x000000000000000B + - Name: mysecretvar + Type: STT_OBJECT + Section: .data + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000010 + Size: 0x0000000000000021 + - Name: myfunc1 + Type: STT_FUNC + Section: .text + Size: 0x000000000000000B + - Name: myvar1 + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000004 diff --git a/test/old-elf/filenotfound.test b/test/old-elf/filenotfound.test new file mode 100644 index 000000000000..5020e9cf9b74 --- /dev/null +++ b/test/old-elf/filenotfound.test @@ -0,0 +1,3 @@ +# Check that a file that cannot be found results in a proper error message +RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/nofile.o 2>&1 | FileCheck %s +#CHECK: lld: cannot find file {{.+[\\/]}}nofile.o diff --git a/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test b/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test new file mode 100644 index 000000000000..c05a06fab32b --- /dev/null +++ b/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test @@ -0,0 +1,145 @@ +# Tests that the linker is able to read .gnu.linkonce sections and link them +# appropriately. The testcase has been created by using the following source +# code. +# TODO: This test should produce a discarded reference error message which it +# does not currently. +# linkoncea.s +# .section .gnu.linkonce.d.dummy,"aw" +#bar: +# .long 0 +# linkonceb.s +# .section .gnu.linkonce.d.dummy,"aw" +#foo: +# .long 0 +# .section .blah, "aw" +# .long foo +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGNULINKONCE < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGNULINKONCESECTIONS +#CHECKGNULINKONCE: - name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCE: scope: global +#CHECKGNULINKONCE: type: gnu-linkonce +#CHECKGNULINKONCE: section-choice: custom-required +#CHECKGNULINKONCE: section-name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCE: permissions: rw- +#CHECKGNULINKONCE: references: +#CHECKGNULINKONCE: - kind: group-child +#CHECKGNULINKONCE: offset: 0 +#CHECKGNULINKONCE: target: bar +#CHECKGNULINKONCESECTIONS: Section { +#CHECKGNULINKONCESECTIONS: Name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCESECTIONS: Type: SHT_PROGBITS +#CHECKGNULINKONCESECTIONS: Flags [ (0x3) +#CHECKGNULINKONCESECTIONS: SHF_ALLOC (0x2) +#CHECKGNULINKONCESECTIONS: SHF_WRITE (0x1) +#CHECKGNULINKONCESECTIONS: ] +#CHECKGNULINKONCESECTIONS: Size: 4 +#CHECKGNULINKONCESECTIONS: } +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy + - Name: bar + Section: .gnu.linkonce.d.dummy +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' + - Name: .blah + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' + - Name: .rela.blah + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .blah + Relocations: + - Offset: 0x0000000000000000 + Symbol: foo + Type: R_X86_64_32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy + - Name: foo + Section: .gnu.linkonce.d.dummy + - Name: .blah + Type: STT_SECTION + Section: .blah +... diff --git a/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test b/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test new file mode 100644 index 000000000000..f91123f0efad --- /dev/null +++ b/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test @@ -0,0 +1,127 @@ +# Tests that the linker is able to read .gnu.linkonce sections and link them +# appropriately. The testcase has been created by using the following source +# code. This test checks that the linker produces an undefined error. +# linkoncea.s +# .section .gnu.linkonce.d.dummy,"aw" +#bar: +# .long 0 +# linkonceb.s +# .section .gnu.linkonce.d.dummy,"aw" +# .global foo +#foo: +# .long 0 +# .section .blah, "aw" +# .long foo +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o +#RUN: not lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: --output-filetype=yaml -o %t2.out.yaml 2>&1 | FileCheck \ +#RUN: -check-prefix=UNDEFS %s +#RUN: not lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: -o %t2.out 2>&1 | FileCheck -check-prefix=UNDEFS %s +#UNDEFS: Undefined symbol: {{.*}} foo +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy + - Name: bar + Section: .gnu.linkonce.d.dummy +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' + - Name: .blah + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' + - Name: .rela.blah + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .blah + Relocations: + - Offset: 0x0000000000000000 + Symbol: foo + Type: R_X86_64_32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy + - Name: .blah + Type: STT_SECTION + Section: .blah + Global: + - Name: foo + Section: .gnu.linkonce.d.dummy +... diff --git a/test/old-elf/gnulinkonce/gnulinkonce.test b/test/old-elf/gnulinkonce/gnulinkonce.test new file mode 100644 index 000000000000..eacd41d6ded5 --- /dev/null +++ b/test/old-elf/gnulinkonce/gnulinkonce.test @@ -0,0 +1,149 @@ +# Tests that the linker is able to read .gnu.linkonce sections and link them +# appropriately. The testcase has been created by using the following source +# code +# linkonce1a.s +# ------------ +# .section .gnu.linkonce.d.dummy,"aw" +#bar: +# .long 0 +# linkonce1b.s +# ------------ +# .globl main +# .globl start +# .globl _start +# .globl __start +# .text +#main: +#start: +#_start: +#__start: +# .long 0 +# +# .section .gnu.linkonce.d.dummy,"aw" +#foo: +# .long 0 +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \ +#RUN: --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGNULINKONCE < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGNULINKONCESECTIONS +#CHECKGNULINKONCE: - name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCE: scope: global +#CHECKGNULINKONCE: type: gnu-linkonce +#CHECKGNULINKONCE: section-choice: custom-required +#CHECKGNULINKONCE: section-name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCE: permissions: rw- +#CHECKGNULINKONCE: references: +#CHECKGNULINKONCE: - kind: group-child +#CHECKGNULINKONCE: offset: 0 +#CHECKGNULINKONCE: target: bar +#CHECKGNULINKONCE: - kind: group-child +#CHECKGNULINKONCE: offset: 0 +#CHECKGNULINKONCESECTIONS: Section { +#CHECKGNULINKONCESECTIONS: Name: .gnu.linkonce.d.dummy +#CHECKGNULINKONCESECTIONS: Type: SHT_PROGBITS +#CHECKGNULINKONCESECTIONS: Flags [ (0x3) +#CHECKGNULINKONCESECTIONS: SHF_ALLOC (0x2) +#CHECKGNULINKONCESECTIONS: SHF_WRITE (0x1) +#CHECKGNULINKONCESECTIONS: ] +#CHECKGNULINKONCESECTIONS: Size: 4 +#CHECKGNULINKONCESECTIONS: } +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' +Symbols: + Local: + - Name: bar + Section: .gnu.linkonce.d.dummy + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '00000000' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .gnu.linkonce.d.dummy + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '00000000' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .gnu.linkonce.d.dummy + Type: STT_SECTION + Section: .gnu.linkonce.d.dummy + - Name: foo + Section: .gnu.linkonce.d.dummy + Global: + - Name: main + Section: .text + - Name: start + Section: .text + - Name: _start + Section: .text + - Name: __start + Section: .text +... diff --git a/test/old-elf/gotpcrel.test b/test/old-elf/gotpcrel.test new file mode 100644 index 000000000000..b8695f1aedfb --- /dev/null +++ b/test/old-elf/gotpcrel.test @@ -0,0 +1,21 @@ +# This test checks that GOTPCREL entries are being handled properly +RUN: lld -flavor old-gnu -target x86_64-linux -static -e main --output-filetype=yaml \ +RUN: --noinhibit-exec %p/Inputs/gotpcrel.x86-64 \ +RUN: | FileCheck %s -check-prefix=YAML + +YAML: name: main +YAML: references: +YAML: kind: R_X86_64_GOTPCREL +YAML: offset: 3 +YAML: target: [[NULLGOT:[a-zA-Z0-9_]+]] +YAML: kind: R_X86_64_GOTPCREL +YAML: offset: 10 +YAML: target: [[MAINGOT:[a-zA-Z0-9_]+]] + +YAML: name: [[NULLGOT]] +YAML: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +YAML-NOT: references: + +YAML: name: [[MAINGOT]] +YAML: kind: R_X86_64_64 +YAML: target: main diff --git a/test/old-elf/gottpoff.test b/test/old-elf/gottpoff.test new file mode 100644 index 000000000000..969874e538a5 --- /dev/null +++ b/test/old-elf/gottpoff.test @@ -0,0 +1,119 @@ +# Test that GOTTPOFF reloc generates an outstanding R_X86_64_TPOFF64 +# to be processed at startup time. +# Reference: Ulrich Drepper's "ELF Handling for Thread-Local storage" + +#RUN: yaml2obj -format=elf %s -o %t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t -e=main --defsym=__tls_get_addr=0 +#RUN: llvm-readobj -r %t | FileCheck %s +# +#CHECK: Section (5) .rela.dyn { +#CHECK: 0x401098 R_X86_64_TPOFF64 tls2 0x0 +#CHECK: } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: E819000000640304250000000064030425000000006403042500000000C3488B0500000000648B00C3488D3D00000000E800000000488D8000000000C3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000009 + Symbol: tls1 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000011 + Symbol: tls0 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000019 + Symbol: tls2 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000021 + Symbol: tls2 + Type: R_X86_64_GOTTPOFF + Addend: -4 + - Offset: 0x000000000000002C + Symbol: tls0 + Type: R_X86_64_TLSLD + Addend: -4 + - Offset: 0x0000000000000031 + Symbol: __tls_get_addr + Type: R_X86_64_PLT32 + Addend: -4 + - Offset: 0x0000000000000038 + Symbol: tls0 + Type: R_X86_64_DTPOFF32 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 8 + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: '01000000' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .tbss + Type: STT_SECTION + Section: .tbss + - Name: .tdata + Type: STT_SECTION + Section: .tdata + Global: + - Name: GOTTPOFF + Type: STT_FUNC + Section: .text + Value: 0x000000000000001E + - Name: TLSLD + Type: STT_FUNC + Section: .text + Value: 0x0000000000000029 + - Name: main + Type: STT_FUNC + Section: .text + - Name: tls0 + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 + - Name: tls1 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: tls2 + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: _GLOBAL_OFFSET_TABLE_ + - Name: __tls_get_addr +... diff --git a/test/old-elf/group-cmd-search.test b/test/old-elf/group-cmd-search.test new file mode 100644 index 000000000000..1d7f5ee43367 --- /dev/null +++ b/test/old-elf/group-cmd-search.test @@ -0,0 +1,134 @@ +/* + XFAIL: win32 + + This test does not pass on Windows because a path starting with + "/" is not considered as an absolute path. (It needs a drive + letter.) +*/ + +/* + In general the linker scripts's GROUP command works like a pair + of command line options --start-group/--end-group. But there is + a difference in the files look up algorithm. + + The --start-group/--end-group commands use a trivial approach: + a) If the path has '-l' prefix, add 'lib' prefix and '.a'/'.so' + suffix and search the path through library search directories. + b) Otherwise, use the path 'as-is'. + + The GROUP command implements more compicated approach: + a) If the path has '-l' prefix, add 'lib' prefix and '.a'/'.so' + suffix and search the path through library search directories. + b) If the path does not have '-l' prefix, and sysroot is configured, + and the path starts with the / character, and the script being + processed is located inside the sysroot, search the path under + the sysroot. Otherwise, try to open the path in the current + directory. If it is not found, search through library search + directories. +*/ + +/* + This link should finish successfully. The --start-group/--end-group + contains an existing absolute path to the file. + +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: --start-group %p/Inputs/shared.so-x86-64 --end-group -o %t1 +*/ + +/* + This link should fail with unknown input file format error. + There is no shared.so-x86-64 file in the current directory. + +RUN: not \ +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: --start-group shared.so-x86-64 --end-group -o %t2 +*/ + +/* + This link should fail with unknown input file format error. + The absolute path /shared.so-x86-64 does not exist and the linker + should not attempt to search it under the sysroot directory. + +RUN: not \ +RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: --start-group /shared.so-x86-64 --end-group -o %t3 +*/ + +/* + This link should finish successfully. The group-cmd-search-1.ls + script contains "GROUP ( shared.so-x86-64 )" command and the linker + has to search shared.so-x86-64 through the library search paths. + +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/group-cmd-search-1.ls -o %t4 +*/ + +/* + This link should fail with unknown input file format error. + The group-cmd-search-2.ls script contains GROUP command with + a non-existing absolute path but there is no --sysroot argument. + +RUN: not \ +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/group-cmd-search-2.ls -o %t5 +*/ + +/* + This link should finish successfully. The group-cmd-search-2.ls + script contains GROUP command with an absolute path and the sysroot + directory is provided. The linker has to search the absolute path + under the sysroot directory. + +RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/group-cmd-search-2.ls -o %t6 +*/ + +/* + This link should finish successfully. The group-cmd-search-2.ls + script contains GROUP command with an absolute path and the sysroot + directory is provided. The linker has to search the absolute path + under the sysroot directory. + +RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs/../Inputs \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/group-cmd-search-2.ls -o %t6 +*/ + +/* + This link should finish successfully. The group-cmd-search-3.ls + script contains GROUP command with two elements. The first one + has a -l:<path> form and should be found by iterating through + lib dirs and searching the 'path' name exactly. The second element + has a -l<lib name> form and should be found by constructing a full + library name lib<lib name>.a and iterating through lib dirs. + +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/group-cmd-search-3.ls -o %t8 +*/ + +/* + This link should fail with unknown input file format error. + The linker script from this file contains GROUP with an absolute + path which can be found under provided sysroot directory. + But the linker script itself is not under the sysroot. + +RUN: not \ +RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: %s -o %t7 +*/ + +/* +RUN: lld -flavor old-gnu -target x86_64 -shared \ +RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \ +RUN: -l:group-cmd-search-1.ls -o %t9 +*/ + +GROUP ( /shared.so-x86-64 ) diff --git a/test/old-elf/hexagon-quickdata-sort.test b/test/old-elf/hexagon-quickdata-sort.test new file mode 100644 index 000000000000..98488b75ceb7 --- /dev/null +++ b/test/old-elf/hexagon-quickdata-sort.test @@ -0,0 +1,12 @@ +RUN: lld -flavor old-gnu -target hexagon %p/Inputs/quickdata-sort-test.o.elf-hexagon -o %t1 --noinhibit-exec +RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=quickdataSort + +quickdataSort: 00002000 D A1 +quickdataSort: 00002001 D AA1 +quickdataSort: 00002002 D B1 +quickdataSort: 00002004 D BB1 +quickdataSort: 00002008 D C1 +quickdataSort: 0000200c D CC1 +quickdataSort: 00002010 D D1 +quickdataSort: 00002018 D DD1 + diff --git a/test/old-elf/hexagon-quickdata-sortcommon.test b/test/old-elf/hexagon-quickdata-sortcommon.test new file mode 100644 index 000000000000..d4d7d6a617e6 --- /dev/null +++ b/test/old-elf/hexagon-quickdata-sortcommon.test @@ -0,0 +1,16 @@ +RUN: lld -flavor old-gnu -target hexagon -o %t1 --noinhibit-exec \ +RUN: %p/Inputs/quickdata-sortcommon-test.o.elf-hexagon +RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=quickdataSortCommon + +quickdataSortCommon: 00002000 D A1 +quickdataSortCommon: 00002001 D AA1 +quickdataSortCommon: 00002002 D AAA1 +quickdataSortCommon: 00002004 D B1 +quickdataSortCommon: 00002006 D BB1 +quickdataSortCommon: 00002008 D BBB1 +quickdataSortCommon: 0000200c D C1 +quickdataSortCommon: 00002010 D CC1 +quickdataSortCommon: 00002014 D CCC1 +quickdataSortCommon: 00002018 D D1 +quickdataSortCommon: 00002020 D DD1 +quickdataSortCommon: 00002028 D DDD1 diff --git a/test/old-elf/ifunc.test b/test/old-elf/ifunc.test new file mode 100644 index 000000000000..0aa317a24e6f --- /dev/null +++ b/test/old-elf/ifunc.test @@ -0,0 +1,69 @@ +# REQUIRES: x86 + +# This test checks that IRELATIVE relocations are created for symbols that +# need relocation even for static links. +RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -r \ +RUN: %p/Inputs/ifunc.x86-64 | FileCheck %s + +RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml --noinhibit-exec \ +RUN: %p/Inputs/ifunc.x86-64 %p/Inputs/ifunc.cpp.x86-64 \ +RUN: | FileCheck %s --check-prefix=PLT + +RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/ifunc.x86-64 \ +RUN: -e main -static %p/Inputs/ifunc.cpp.x86-64 +RUN: llvm-objdump -d -s %t| FileCheck %s --check-prefix=BIN +RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELATIVEADDEND + +# Test that STT_GNU_IFUNC symbols have type Code in SharedLibraryAtom. +RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml \ +RUN: --noinhibit-exec %p/Inputs/ifunc.cpp.x86-64 -L%p/Inputs -lifunc.x86-64 \ +RUN: | FileCheck %s --check-prefix=SHARED + +PLT: defined-atoms: + +PLT: name: plt +PLT: scope: global +PLT: references: +PLT: kind: R_X86_64_PC32 +PLT: target: [[PLTNAME:[-a-zA-Z0-9_]+]] + +PLT: name: main +PLT: scope: global +PLT: references: +PLT: kind: R_X86_64_PC32 +PLT: target: [[PLTNAME]] + +// Make sure the target of main's relocation is a stub with a PC32 relocation. +// This relocation is to the got atom, but you can't really write that check in +// FileCheck. +PLT: name: +PLT: type: stub +PLT: references +PLT: kind: R_X86_64_PC32 + +// Make sure there's a got entry with a IRELATIVE relocation. +PLT: type: got +PLT: references: +PLT: kind: R_X86_64_IRELATIVE +PLT: target: hey + +CHECK: name: hey +CHECK: scope: global +CHECK: type: resolver + + +// This is a horribly brittle test. We need a way to do arithmetic on captured +// variables. +BIN: {{[0-9a-f]+}}: ff 25 {{[0-9a-f]+}} {{[0-9a-f]+}} 00 00 jmpq *{{[0-9]+}}(%rip) +BIN: .got.plt: +BIN-NEXT: {{[0-9a-f]+}} 00000000 00000000 + +RELATIVEADDEND: Relocations [ +RELATIVEADDEND-NEXT: Section (1) .rela.plt { +RELATIVEADDEND-NEXT: 0x401000 R_X86_64_IRELATIVE - 0x400110 +RELATIVEADDEND-NEXT: } +RELATIVEADDEND-NEXT: ] + +SHARED: shared-library-atoms +SHARED: name: hey +SHARED-NOT: data diff --git a/test/old-elf/ignore-unknownoption.test b/test/old-elf/ignore-unknownoption.test new file mode 100644 index 000000000000..aa03a2eb4e73 --- /dev/null +++ b/test/old-elf/ignore-unknownoption.test @@ -0,0 +1,5 @@ +# This test tests that lld is able to print unknown options that are not +# recognized. +RUN: not lld -flavor old-gnu -target x86_64 --gc-sections 2> %t +RUN: FileCheck %s < %t +CHECK: warning: ignoring unknown argument: --gc-sections diff --git a/test/old-elf/init_array-order.test b/test/old-elf/init_array-order.test new file mode 100644 index 000000000000..2b8bcb65c3e4 --- /dev/null +++ b/test/old-elf/init_array-order.test @@ -0,0 +1,67 @@ +#RUN: yaml2obj -format=elf %s > %t +#RUN: lld -flavor old-gnu -target x86_64-linux %t --noinhibit-exec \ +#RUN: -o %t1.out +#RUN: llvm-objdump -s %t1.out | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: "1100000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .init_array.2 + Type: SHT_INIT_ARRAY + Content: "0200000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC] +- Name: .init_array.3 + Type: SHT_INIT_ARRAY + Content: "0300000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC] +- Name: .init_array + Type: SHT_INIT_ARRAY + Content: "9900000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC] +- Name: .data + Type: SHT_PROGBITS + Content: "2200000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC, SHF_WRITE] +- Name: .init_array.1 + Type: SHT_INIT_ARRAY + Content: "0100000000000000" + AddressAlign: 8 + Flags: [SHF_ALLOC] + +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .init_array.3 + Type: STT_SECTION + Section: .init_array.3 + - Name: .init_array.2 + Type: STT_SECTION + Section: .init_array.2 + - Name: .init_array.1 + Type: STT_SECTION + Section: .init_array.1 + - Name: .init_array + Type: STT_SECTION + Section: .init_array + +#CHECK: {{[0xa-f0-9]+}} 01000000 00000000 02000000 00000000 +#CHECK: {{[0xa-f0-9]+}} 03000000 00000000 99000000 00000000 diff --git a/test/old-elf/init_array.test b/test/old-elf/init_array.test new file mode 100644 index 000000000000..f7f48445621e --- /dev/null +++ b/test/old-elf/init_array.test @@ -0,0 +1,127 @@ +# Test .init_array. +# Generated from the following C code: +# +# static void +# init () {} +# +# static void (*const init_array []) () +# __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) +# = { init }; +# +# int +# main() { return (0); } +# +# Note: both STT_OBJECT and STT_SECTION for .init_array are commented in yaml +# declaration to check if lld correct adds the object's .init_array when the +# section has no symbol (some compilers may create object with this behavior, +# specially for C++ global constructors). + +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t -e=main +#RUN: llvm-objdump -t -section-headers %t | FileCheck %s + +#CHECK: .init_array {{[0-9]+}} [[ADDR:[0-9]+]] +#CHECK: [[ADDR]] l *ABS* {{[0-9]+}} .hidden __init_array_start + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B800000000C745FC000000005DC366666666662E0F1F840000000000554889E55DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .init_array + Type: SHT_INIT_ARRAY + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: '0000000000000000' + - Name: .rela.init_array + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .init_array + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text + Type: R_X86_64_64 + Addend: 32 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000600000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 32 +Symbols: + Local: + - Name: init + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + Size: 0x0000000000000006 +# - Name: init_array +# Type: STT_OBJECT +# Section: .init_array +# Size: 0x0000000000000008 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss +# - Name: .init_array +# Type: STT_SECTION +# Section: .init_array + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000012 +... diff --git a/test/old-elf/initfini-options.test-1.test b/test/old-elf/initfini-options.test-1.test new file mode 100644 index 000000000000..f8571a637197 --- /dev/null +++ b/test/old-elf/initfini-options.test-1.test @@ -0,0 +1,33 @@ +# Check that if there are no -init/-fini options and _init/_fini symbols +# are undefined the linker does not emit DT_INIT/DT_FINI tags. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target x86_64 -shared --noinhibit-exec -o %t.so %t.o +# RUN: llvm-readobj -dynamic-table %t.so | FileCheck %s + +# CHECK-NOT: 0x000000000000000C INIT 0x{{[0-9A-F]+}} +# CHECK-NOT: 0x000000000000000D FINI 0x{{[0-9A-F]+}} + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x08 + +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Size: 0x08 + - Name: _init + - Name: _fini +... diff --git a/test/old-elf/initfini-options.test-2.test b/test/old-elf/initfini-options.test-2.test new file mode 100644 index 000000000000..35361c76d973 --- /dev/null +++ b/test/old-elf/initfini-options.test-2.test @@ -0,0 +1,47 @@ +# Check that if _init/_fini symbols are defined the linker emits +# DT_INIT/DT_FINI tags point to these symbols. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.o +# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s + +# CHECK: Name: _init (8) +# CHECK-NEXT: Value: {{[0x0-9a-f]+}} +# CHECK: Name: _fini (14) +# CHECK-NEXT: Value: {{[0x0-9a-f]+}} +# +# CHECK: 0x000000000000000C INIT {{[0x0-9a-f]+}} +# CHECK: 0x000000000000000D FINI {{[0x0-9a-f]+}} + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x18 + +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0 + Size: 0x8 + - Name: _init + Type: STT_FUNC + Section: .text + Value: 0x8 + Size: 0x8 + - Name: _fini + Type: STT_FUNC + Section: .text + Value: 0xF + Size: 0x8 +... diff --git a/test/old-elf/initfini-options.test-3.test b/test/old-elf/initfini-options.test-3.test new file mode 100644 index 000000000000..2c9ab3cceb94 --- /dev/null +++ b/test/old-elf/initfini-options.test-3.test @@ -0,0 +1,53 @@ +# Check that -init/-fini command line options override default function names +# and the linker uses these name to search symbols and setup DT_INIT/DT_FINI. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.o \ +# RUN: -init _init -init _start -fini _fini -fini _stop +# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s + +# CHECK: Name: _start (1) +# CHECK-NEXT: Value: {{[0x0-9a-f]+}} +# CHECK: Name: _stop (8) +# CHECK-NEXT: Value: {{[0x0-9a-f]+}} +# +# CHECK: 0x000000000000000C INIT {{[0x0-9a-f]+}} +# CHECK: 0x000000000000000D FINI {{[0x0-9a-f]+}} + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x04 + Size: 0x20 + +Symbols: + Global: + - Name: _start + Type: STT_FUNC + Section: .text + Value: 0x0 + Size: 0x8 + - Name: _stop + Type: STT_FUNC + Section: .text + Value: 0x8 + Size: 0x8 + - Name: _init + Type: STT_FUNC + Section: .text + Value: 0xF + Size: 0x8 + - Name: _fini + Type: STT_FUNC + Section: .text + Value: 0x18 + Size: 0x8 +... diff --git a/test/old-elf/librarynotfound.test b/test/old-elf/librarynotfound.test new file mode 100644 index 000000000000..9b1b8f2cffc4 --- /dev/null +++ b/test/old-elf/librarynotfound.test @@ -0,0 +1,5 @@ +# Tests the functionality of library not found +RUN: not lld -flavor old-gnu -lfn 2> %t1 +RUN: FileCheck %s < %t1 + +CHECK: Unable to find library -lfn diff --git a/test/old-elf/linker-as-ld.test b/test/old-elf/linker-as-ld.test new file mode 100644 index 000000000000..8b07ae9d1a71 --- /dev/null +++ b/test/old-elf/linker-as-ld.test @@ -0,0 +1,16 @@ +REQUIRES: system-linker-elf + +RUN: mkdir -p %t.dir && cp `which lld` %t.dir/ld +RUN: %t.dir/ld -o %t %p/Inputs/relocs.x86-64 \ +RUN: -e _start -static +RUN: llvm-readobj -t %t | FileCheck %s + +# Test linker run as "ld" on elf based system works like gnu linker. + + +CHECK: Symbol { +CHECK: Name: i +CHECK-NEXT: Value: +CHECK-NEXT: Size: +CHECK-NEXT: Binding: +CHECK-NEXT: Type: Object diff --git a/test/old-elf/linkerscript/Inputs/externs.ls b/test/old-elf/linkerscript/Inputs/externs.ls new file mode 100644 index 000000000000..20fdc0c3f980 --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/externs.ls @@ -0,0 +1,3 @@ +/* A simple valid linker script used for testing the EXTERN command. + */ +EXTERN(_foo bar __baz) diff --git a/test/old-elf/linkerscript/Inputs/invalid.ls b/test/old-elf/linkerscript/Inputs/invalid.ls new file mode 100644 index 000000000000..894d4bef2732 --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/invalid.ls @@ -0,0 +1 @@ +GROUP( diff --git a/test/old-elf/linkerscript/Inputs/prog1.o.yaml b/test/old-elf/linkerscript/Inputs/prog1.o.yaml new file mode 100644 index 000000000000..f450048ab37b --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/prog1.o.yaml @@ -0,0 +1,87 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E5B000E800000000BF01000000BA0E0000004889C6E80000000031C05DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000007 + Symbol: prog2 + Type: R_X86_64_PC32 + Addend: -4 + - Offset: 0x0000000000000019 + Symbol: write + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742036336134646334616430343938646139623934386330383263623735336430353735323938346638292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623838363135326664656538376564653738613565643965616638663664313839343033616266312900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000002100000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000021 + - Name: prog2 + - Name: write +... diff --git a/test/old-elf/linkerscript/Inputs/prog2.o.yaml b/test/old-elf/linkerscript/Inputs/prog2.o.yaml new file mode 100644 index 000000000000..4d1bbd5754ea --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/prog2.o.yaml @@ -0,0 +1,88 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E548B800000000000000005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000006 + Symbol: .rodata.str1.1 + Type: R_X86_64_64 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .rodata.str1.1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 48656C6C6F2C20776F726C64210A00 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742036336134646334616430343938646139623934386330383263623735336430353735323938346638292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623838363135326664656538376564653738613565643965616638663664313839343033616266312900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000001000000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .rodata.str1.1 + Type: STT_SECTION + Section: .rodata.str1.1 + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: prog2 + Type: STT_FUNC + Section: .text + Size: 0x0000000000000010 +... diff --git a/test/old-elf/linkerscript/Inputs/prog3.o.yaml b/test/old-elf/linkerscript/Inputs/prog3.o.yaml new file mode 100644 index 000000000000..2402be4d42b6 --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/prog3.o.yaml @@ -0,0 +1,51 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: B8010000000F05C3E800000000B83C0000000F05C3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000009 + Symbol: main + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: _start + Section: .text + Value: 0x0000000000000008 + - Name: write + Section: .text + - Name: main +... diff --git a/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml b/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml new file mode 100644 index 000000000000..f826034053c3 --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml @@ -0,0 +1,32 @@ +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 4 + Size: 16 + + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 4 + Size: 16 + +Symbols: + Local: + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .text + Type: STT_SECTION + Section: .text + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Size: 16 diff --git a/test/old-elf/linkerscript/Inputs/simple.o.yaml b/test/old-elf/linkerscript/Inputs/simple.o.yaml new file mode 100644 index 000000000000..fc9cd4c5f67d --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/simple.o.yaml @@ -0,0 +1,51 @@ +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: B80100000048C7C70100000048C7C60000000048C7C20E0000000F05C3E8DEFFFFFFB83C0000000F05C3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x000000000000000F + Symbol: .data + Type: R_X86_64_32S + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: 48656C6C6F2C20576F726C64210A00 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + Local: + - Name: main + Section: .text + - Name: msg + Section: .data + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: _start + Section: .text + Value: 0x000000000000001D +... diff --git a/test/old-elf/linkerscript/Inputs/valid.ls b/test/old-elf/linkerscript/Inputs/valid.ls new file mode 100644 index 000000000000..43593602d3fb --- /dev/null +++ b/test/old-elf/linkerscript/Inputs/valid.ls @@ -0,0 +1,6 @@ +/* A simple valid linker script used for testing the -T/--script options. + * + * An unresolved symbol named '_entry_point' can be scanned for by the tests + * to determine that the linker script was processed. + */ +ENTRY(_entry_point) diff --git a/test/old-elf/linkerscript/externs.objtxt b/test/old-elf/linkerscript/externs.objtxt new file mode 100644 index 000000000000..d79c56a142c9 --- /dev/null +++ b/test/old-elf/linkerscript/externs.objtxt @@ -0,0 +1,21 @@ +# Check symbols defined with the EXTERN command are added as undefined +# symbols. + +# RUN: lld -flavor old-gnu -target x86_64 -T %p/Inputs/externs.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +defined-atoms: + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text + +# CHECK: undefined-atoms: +# CHECK: - name: _foo +# CHECK: can-be-null: at-buildtime +# CHECK: - name: bar +# CHECK: can-be-null: at-buildtime +# CHECK: - name: __baz +# CHECK: can-be-null: at-buildtime diff --git a/test/old-elf/linkerscript/filename-with-wildcards.test b/test/old-elf/linkerscript/filename-with-wildcards.test new file mode 100644 index 000000000000..9376d5a5cfb4 --- /dev/null +++ b/test/old-elf/linkerscript/filename-with-wildcards.test @@ -0,0 +1,49 @@ +/* +Tests a linker script that uses the SECTIONS command with rules containing +wildcards that matching input object files. +*/ + +ENTRY(_start) + +SECTIONS +{ + . = 0x500000; + .foo : { *p1-wc.o(.text .rodata*) } + .bar : { *(.text .rodata*) } +} + +/* +RUN: mkdir -p %T +RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1-wc.o +RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2-wc.o +RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3-wc.o +RUN: cd %T + +RUN: lld -flavor old-gnu -target x86_64 -T %s p1-wc.o p2-wc.o p3-wc.o \ +RUN: -static -o %t1 +RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s + +CHECKSECTIONS: Index: 1 +CHECKSECTIONS: Name: .foo +CHECKSECTIONS: Address: 0x500000 +CHECKSECTIONS: Size: 33 + +CHECKSECTIONS: Index: 2 +CHECKSECTIONS: Name: .bar +CHECKSECTIONS: Address: 0x500030 +CHECKSECTIONS: Size: 52 + +RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: Name: main +CHECKSYMS-NEXT: Value: 0x500000 + +CHECKSYMS: Name: prog2 +CHECKSYMS-NEXT: Value: 0x500030 + +CHECKSYMS: Name: write +CHECKSYMS-NEXT: Value: 0x500040 + +CHECKSYMS: Name: _start +CHECKSYMS-NEXT: Value: 0x500048 +*/ diff --git a/test/old-elf/linkerscript/invalid-script-cli-1.test b/test/old-elf/linkerscript/invalid-script-cli-1.test new file mode 100644 index 000000000000..72d2edebb4d5 --- /dev/null +++ b/test/old-elf/linkerscript/invalid-script-cli-1.test @@ -0,0 +1,10 @@ +# Check that the -T/--script options issue an error when passed +# filenames for files that do not exist. + +RUN: not lld -flavor old-gnu -target x86_64 -T idonotexist.ls 2> %t.err +RUN: FileCheck %s < %t.err + +RUN: not lld -flavor old-gnu -target x86_64 --script=idonotexist.ls 2> %t.err +RUN: FileCheck %s < %t.err + +CHECK: {{.*}}lld: cannot find file {{.*}}idonotexist.ls diff --git a/test/old-elf/linkerscript/invalid-script-cli-2.test b/test/old-elf/linkerscript/invalid-script-cli-2.test new file mode 100644 index 000000000000..cc76f0e55a81 --- /dev/null +++ b/test/old-elf/linkerscript/invalid-script-cli-2.test @@ -0,0 +1,6 @@ +# Check that linker script are *not* picked up with -lscript.ls. + +RUN: not lld -flavor old-gnu -target x86_64 -L%p/Inputs/ -lvalid.ls 2> %t.err +RUN: FileCheck %s < %t.err + +CHECK: {{.*}}: Unable to find library -lvalid.ls diff --git a/test/old-elf/linkerscript/invalid.test b/test/old-elf/linkerscript/invalid.test new file mode 100644 index 000000000000..a00a200225dc --- /dev/null +++ b/test/old-elf/linkerscript/invalid.test @@ -0,0 +1,5 @@ +# Check for errors from invalid linker scripts +RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/invalid.ls 2> %t.err +RUN: FileCheck %s < %t.err + +CHECK: {{.*}}invalid.ls: Error parsing linker script diff --git a/test/old-elf/linkerscript/phdrs-all-none.test b/test/old-elf/linkerscript/phdrs-all-none.test new file mode 100644 index 000000000000..45baf188d8d8 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-all-none.test @@ -0,0 +1,26 @@ +/* +Test when all segments are marked as NONE. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix NONE-ALL-PHDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :NONE + .data : { *(.data) } +} + +/* +NONE-ALL-PHDRS: .text {{[0-9a-f]+}} 0000000000000000 +NONE-ALL-PHDRS: .data {{[0-9a-f]+}} 000000000000002c +*/ diff --git a/test/old-elf/linkerscript/phdrs-custom-none.test b/test/old-elf/linkerscript/phdrs-custom-none.test new file mode 100644 index 000000000000..e3672cf8fd30 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-custom-none.test @@ -0,0 +1,36 @@ +/* +Test when PHDRS contains custom NONE segment. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix CUSTOM-NONE-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix CUSTOM-NONE-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + NONE PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :NONE + .data : { *(.data) } +} + +/* +CUSTOM-NONE-SECS: .text {{[0-9a-f]+}} 00000000004000b0 +CUSTOM-NONE-SECS: .data {{[0-9a-f]+}} 00000000004000dc + +CUSTOM-NONE-HDRS: ProgramHeader { +CUSTOM-NONE-HDRS: Type: PT_LOAD (0x1) +CUSTOM-NONE-HDRS: VirtualAddress: 0x400000 +CUSTOM-NONE-HDRS: Flags [ (0x5) +CUSTOM-NONE-HDRS: PF_R (0x4) +CUSTOM-NONE-HDRS: PF_X (0x1) +CUSTOM-NONE-HDRS: ] +CUSTOM-NONE-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-default.test b/test/old-elf/linkerscript/phdrs-default.test new file mode 100644 index 000000000000..8c493d020504 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-default.test @@ -0,0 +1,82 @@ +/* +This group of tests checks usage of default headers during linking, +when PHDRS command is not defined or defined empty in linker scripts. + +This test uses a single X86-64 input object, simple.o, created with the +following X86-64 assembly code: + +*** simple.S: + +(command line clang -c simple.S -o simple.o) + + .text + main: + mov $1, %eax + movq $1, %rdi + movq $msg, %rsi + movq $14, %rdx + syscall + ret + + .globl _start + _start: + call main + mov $60, %eax + syscall + ret + + .data + msg: .asciz "Hello, World!\n" +*/ + +/* +Prepare the object file to test on. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o +*/ + +/* +Test when no linker script passed. + +RUN: lld -flavor old-gnu -target x86_64 %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix SECTIONS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix HEADERS %s + +SECTIONS: .text {{[0-9a-f]+}} 00000000004000b0 +SECTIONS: .data {{[0-9a-f]+}} 0000000000401000 + +HEADERS: ProgramHeader { +HEADERS: Type: PT_LOAD (0x1) +HEADERS: VirtualAddress: 0x400000 +HEADERS: } +HEADERS: ProgramHeader { +HEADERS: Type: PT_LOAD (0x1) +HEADERS: VirtualAddress: 0x401000 +HEADERS: } +*/ + +/* +Test when linker script doesn't contain PHDRS and sections are not assigned to any segments. + +RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-no-phdrs.script %t.o -static -o %t2 +RUN: llvm-objdump -section-headers %t2 | FileCheck -check-prefix SECTIONS %s +RUN: llvm-readobj -program-headers %t2 | FileCheck -check-prefix HEADERS %s +*/ + +/* +Test when linker script contains empty PHDRS and sections are not assigned to any segments. + +RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-empty-phdrs.script %t.o -static -o %t3 +RUN: llvm-objdump -section-headers %t3 | FileCheck -check-prefix SECTIONS %s +RUN: llvm-readobj -program-headers %t3 | FileCheck -check-prefix HEADERS %s +*/ + +/* +Test when linker script contains empty PHDRS and sections are only assigned to NONE segments +or not assigned at all. +NOTE: Segments with the name NONE are ignored in such a case. + +RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-none-phdrs.script %t.o -static -o %t4 +RUN: llvm-objdump -section-headers %t4 | FileCheck -check-prefix SECTIONS %s +RUN: llvm-readobj -program-headers %t4 | FileCheck -check-prefix HEADERS %s +*/ diff --git a/test/old-elf/linkerscript/phdrs-different.test b/test/old-elf/linkerscript/phdrs-different.test new file mode 100644 index 000000000000..7fe14dd543d1 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-different.test @@ -0,0 +1,45 @@ +/* +Test sections put to different segments. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix DIFF-PHDRS-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix DIFF-PHDRS-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; + data PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } :data +} + +/* +DIFF-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000e8 +DIFF-PHDRS-SECS: .data {{[0-9a-f]+}} 0000000000401000 + +DIFF-PHDRS-HDRS: ProgramHeader { +DIFF-PHDRS-HDRS: Type: PT_LOAD (0x1) +DIFF-PHDRS-HDRS: VirtualAddress: 0x400000 +DIFF-PHDRS-HDRS: Flags [ (0x5) +DIFF-PHDRS-HDRS: PF_R (0x4) +DIFF-PHDRS-HDRS: PF_X (0x1) +DIFF-PHDRS-HDRS: ] +DIFF-PHDRS-HDRS: } +DIFF-PHDRS-HDRS: ProgramHeader { +DIFF-PHDRS-HDRS: Type: PT_LOAD (0x1) +DIFF-PHDRS-HDRS: VirtualAddress: 0x401000 +DIFF-PHDRS-HDRS: Flags [ (0x6) +DIFF-PHDRS-HDRS: PF_R (0x4) +DIFF-PHDRS-HDRS: PF_W (0x2) +DIFF-PHDRS-HDRS: ] +DIFF-PHDRS-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-extra-program.test b/test/old-elf/linkerscript/phdrs-extra-program.test new file mode 100644 index 000000000000..3bf27dcb1f5a --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-extra-program.test @@ -0,0 +1,27 @@ +/* +Test extra program header generates error. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error +RUN: FileCheck -check-prefix EXTRA-PROGRAM-PHDR %s < %t1-error +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR PHDRS; + header2 PT_PHDR PHDRS; + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :NONE + .data : { *(.data) } +} + +/* +EXTRA-PROGRAM-PHDR: Extra program header is found +*/ diff --git a/test/old-elf/linkerscript/phdrs-flags.test b/test/old-elf/linkerscript/phdrs-flags.test new file mode 100644 index 000000000000..0fac53e75302 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-flags.test @@ -0,0 +1,46 @@ +/* +Test sections put to different segments with FLAGS attribute set. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD FLAGS(0x5); + data PT_LOAD FLAGS(0x7); +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } :data +} + +/* +FLAGS-PHDRS-SECS: .text {{[0-9a-f]+}} 0000000000401000 +FLAGS-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000e8 + +FLAGS-PHDRS-HDRS: ProgramHeader { +FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1) +FLAGS-PHDRS-HDRS: VirtualAddress: 0x400000 +FLAGS-PHDRS-HDRS: Flags [ (0x7) +FLAGS-PHDRS-HDRS: PF_R (0x4) +FLAGS-PHDRS-HDRS: PF_W (0x2) +FLAGS-PHDRS-HDRS: PF_X (0x1) +FLAGS-PHDRS-HDRS: ] +FLAGS-PHDRS-HDRS: } +FLAGS-PHDRS-HDRS: ProgramHeader { +FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1) +FLAGS-PHDRS-HDRS: VirtualAddress: 0x401000 +FLAGS-PHDRS-HDRS: Flags [ (0x5) +FLAGS-PHDRS-HDRS: PF_R (0x4) +FLAGS-PHDRS-HDRS: PF_X (0x1) +FLAGS-PHDRS-HDRS: ] +FLAGS-PHDRS-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-has-program.test b/test/old-elf/linkerscript/phdrs-has-program.test new file mode 100644 index 000000000000..83fe94c70614 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-has-program.test @@ -0,0 +1,33 @@ +/* +Test when program segment is set it's generated. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDR %s +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR FILEHDR PHDRS; + text PT_LOAD PHDRS; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-PHDR: ProgramHeader { +PROGRAM-PHDR: Type: PT_PHDR (0x6) +PROGRAM-PHDR: VirtualAddress: 0x400040 +PROGRAM-PHDR: Flags [ (0x5) +PROGRAM-PHDR: PF_R (0x4) +PROGRAM-PHDR: PF_X (0x1) +PROGRAM-PHDR: ] +PROGRAM-PHDR: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-invalid.test b/test/old-elf/linkerscript/phdrs-invalid.test new file mode 100644 index 000000000000..c1426e8ffa5f --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-invalid.test @@ -0,0 +1,63 @@ +/* +This group of tests checks invalid cases of defining and using PHDRS +command in linker scripts. + +This test uses a single X86-64 input object, simple.o, created with the +following X86-64 assembly code: + +*** simple.S: + +(command line clang -c simple.S -o simple.o) + + .text + main: + mov $1, %eax + movq $1, %rdi + movq $msg, %rsi + movq $14, %rdx + syscall + ret + + .globl _start + _start: + call main + mov $60, %eax + syscall + ret + + .data + msg: .asciz "Hello, World!\n" +*/ + +/* +Prepare the object file to test on. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o +*/ + +/* +Test undefined header used when no PHDRS defined. + +RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-no-phdrs.script %t.o -static -o %t1 &> %t1-error +RUN: FileCheck -check-prefix UNDEF-NO-PHDRS %s < %t1-error + +UNDEF-NO-PHDRS: Unknown header identifiers (missing in PHDRS command) are used +*/ + +/* +Test undefined header used when PHDRS is empty. + +RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-empty-phdrs.script %t.o -static -o %t2 &> %t2-error +RUN: FileCheck -check-prefix UNDEF-EMPTY-PHDRS %s < %t2-error + +UNDEF-EMPTY-PHDRS: Unknown header identifiers (missing in PHDRS command) are used +*/ + +/* +Test undefined header used when PHDRS contains definitions. + +RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-id-phdrs.script %t.o -static -o %t3 &> %t3-error +RUN: FileCheck -check-prefix UNDEF-ID-PHDRS %s < %t3-error + +UNDEF-ID-PHDRS: Unknown header identifiers (missing in PHDRS command) are used +*/ diff --git a/test/old-elf/linkerscript/phdrs-misplaced-program.test b/test/old-elf/linkerscript/phdrs-misplaced-program.test new file mode 100644 index 000000000000..0fb669d818c4 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-misplaced-program.test @@ -0,0 +1,26 @@ +/* +Test misplaced program header generates error. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error +RUN: FileCheck -check-prefix MISPLACED-PROGRAM-PHDR %s < %t1-error +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; + header PT_PHDR PHDRS; +} + +SECTIONS +{ + .text : { *(.text) } :NONE + .data : { *(.data) } +} + +/* +MISPLACED-PROGRAM-PHDR: Program header must precede load segments +*/ diff --git a/test/old-elf/linkerscript/phdrs-no-program.test b/test/old-elf/linkerscript/phdrs-no-program.test new file mode 100644 index 000000000000..e461d5061019 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-no-program.test @@ -0,0 +1,25 @@ +/* +Test when no program segment set it's not generated. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDR %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-PHDR-NOT: Type: PT_PHDR (0x6) +*/ diff --git a/test/old-elf/linkerscript/phdrs-one-none.test b/test/old-elf/linkerscript/phdrs-one-none.test new file mode 100644 index 000000000000..a1c84e59fc60 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-one-none.test @@ -0,0 +1,36 @@ +/* +Test when one segment is marked as NONE. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix NONE-PHDRS-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix NONE-PHDRS-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } :NONE +} + +/* +NONE-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0 +NONE-PHDRS-SECS: .data {{[0-9a-f]+}} 0000000000000000 + +NONE-PHDRS-HDRS: ProgramHeader { +NONE-PHDRS-HDRS: Type: PT_LOAD (0x1) +NONE-PHDRS-HDRS: VirtualAddress: 0x400000 +NONE-PHDRS-HDRS: Flags [ (0x5) +NONE-PHDRS-HDRS: PF_R (0x4) +NONE-PHDRS-HDRS: PF_X (0x1) +NONE-PHDRS-HDRS: ] +NONE-PHDRS-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-program-flags.test b/test/old-elf/linkerscript/phdrs-program-flags.test new file mode 100644 index 000000000000..2a719a6cb296 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-program-flags.test @@ -0,0 +1,33 @@ +/* +Test when program segment contains only FLAGS attribute. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-FLAGS-PHDR %s +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR PHDRS FLAGS(0x7); + text PT_LOAD FILEHDR PHDRS; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-FLAGS-PHDR: ProgramHeader { +PROGRAM-FLAGS-PHDR: Type: PT_PHDR (0x6) +PROGRAM-FLAGS-PHDR: Flags [ (0x7) +PROGRAM-FLAGS-PHDR: PF_R (0x4) +PROGRAM-FLAGS-PHDR: PF_W (0x2) +PROGRAM-FLAGS-PHDR: PF_X (0x1) +PROGRAM-FLAGS-PHDR: ] +PROGRAM-FLAGS-PHDR: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-program-good-phdrs.test b/test/old-elf/linkerscript/phdrs-program-good-phdrs.test new file mode 100644 index 000000000000..373facc380ba --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-program-good-phdrs.test @@ -0,0 +1,34 @@ +/* +Test when program segment contains only PHDRS attribute. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDRS-PHDR %s +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR PHDRS; + text PT_LOAD PHDRS; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-PHDRS-PHDR: ProgramHeader { +PROGRAM-PHDRS-PHDR: Type: PT_PHDR (0x6) +PROGRAM-PHDRS-PHDR: VirtualAddress: 0x400040 +PROGRAM-PHDRS-PHDR: MemSize: 168 +PROGRAM-PHDRS-PHDR: Flags [ (0x5) +PROGRAM-PHDRS-PHDR: PF_R (0x4) +PROGRAM-PHDRS-PHDR: PF_X (0x1) +PROGRAM-PHDRS-PHDR: ] +PROGRAM-PHDRS-PHDR: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-program-no-phdrs.test b/test/old-elf/linkerscript/phdrs-program-no-phdrs.test new file mode 100644 index 000000000000..3e639bdb0f43 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-program-no-phdrs.test @@ -0,0 +1,26 @@ +/* +Test when program segment doesn't contain PHDRS attribute. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error +RUN: FileCheck -check-prefix PROGRAM-PHDR-NO-PHDRS %s < %t1-error +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR; + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-PHDR-NO-PHDRS: Program header has invalid PHDRS attribute +*/ diff --git a/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test b/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test new file mode 100644 index 000000000000..c27b23d85876 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test @@ -0,0 +1,26 @@ +/* +Test when program segment contains PHDRS attribute not mapped to load segment. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error +RUN: FileCheck -check-prefix PROGRAM-PHDR-WRONG-PHDRS %s < %t1-error +*/ + +ENTRY(_start) + +PHDRS +{ + header PT_PHDR PHDRS; + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +PROGRAM-PHDR-WRONG-PHDRS: Program header has invalid PHDRS attribute +*/ diff --git a/test/old-elf/linkerscript/phdrs-same-flags.test b/test/old-elf/linkerscript/phdrs-same-flags.test new file mode 100644 index 000000000000..e39f61881033 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-same-flags.test @@ -0,0 +1,35 @@ +/* +Test sections put to same segment with FLAGS attribute set. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD FLAGS(0x4); +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +FLAGS-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0 +FLAGS-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000dc + +FLAGS-PHDRS-HDRS: ProgramHeader { +FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1) +FLAGS-PHDRS-HDRS: VirtualAddress: 0x400000 +FLAGS-PHDRS-HDRS: Flags [ (0x4) +FLAGS-PHDRS-HDRS: PF_R (0x4) +FLAGS-PHDRS-HDRS: ] +FLAGS-PHDRS-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs-same.test b/test/old-elf/linkerscript/phdrs-same.test new file mode 100644 index 000000000000..92b3ad3909c3 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs-same.test @@ -0,0 +1,36 @@ +/* +Test sections put to same segment. + +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix SAME-PHDRS-SECS %s +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix SAME-PHDRS-HDRS %s +*/ + +ENTRY(_start) + +PHDRS +{ + text PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :text + .data : { *(.data) } +} + +/* +SAME-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0 +SAME-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000dc + +SAME-PHDRS-HDRS: ProgramHeader { +SAME-PHDRS-HDRS: Type: PT_LOAD (0x1) +SAME-PHDRS-HDRS: VirtualAddress: 0x400000 +SAME-PHDRS-HDRS: Flags [ (0x5) +SAME-PHDRS-HDRS: PF_R (0x4) +SAME-PHDRS-HDRS: PF_X (0x1) +SAME-PHDRS-HDRS: ] +SAME-PHDRS-HDRS: } +*/ diff --git a/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script new file mode 100644 index 000000000000..ac30df78d5e1 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script @@ -0,0 +1,11 @@ +ENTRY(_start) + +PHDRS +{ +} + +SECTIONS +{ + .text : { *(.text) } + .data : { *(.data) } +} diff --git a/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script new file mode 100644 index 000000000000..b8848cd3ab0d --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script @@ -0,0 +1,7 @@ +ENTRY(_start) + +SECTIONS +{ + .text : { *(.text) } + .data : { *(.data) } +} diff --git a/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script new file mode 100644 index 000000000000..4b240245d2b2 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script @@ -0,0 +1,11 @@ +ENTRY(_start) + +PHDRS +{ +} + +SECTIONS +{ + .text : { *(.text) } :NONE + .data : { *(.data) } +} diff --git a/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script new file mode 100644 index 000000000000..f92b452d2346 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script @@ -0,0 +1,11 @@ +ENTRY(_start) + +PHDRS +{ +} + +SECTIONS +{ + .text : { *(.text) } + .data : { *(.data) } :phdr +} diff --git a/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script new file mode 100644 index 000000000000..8ac56695f00a --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script @@ -0,0 +1,12 @@ +ENTRY(_start) + +PHDRS +{ + phdr PT_LOAD; +} + +SECTIONS +{ + .text : { *(.text) } :phdr_wrong + .data : { *(.data) } +} diff --git a/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script new file mode 100644 index 000000000000..d3ee5bdebe41 --- /dev/null +++ b/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script @@ -0,0 +1,7 @@ +ENTRY(_start) + +SECTIONS +{ + .text : { *(.text) } :phdr + .data : { *(.data) } +} diff --git a/test/old-elf/linkerscript/sections-order.test b/test/old-elf/linkerscript/sections-order.test new file mode 100644 index 000000000000..4d23f5eb9d54 --- /dev/null +++ b/test/old-elf/linkerscript/sections-order.test @@ -0,0 +1,113 @@ +/* +Tests a simple linker script that changes the order of output sections and +also changes the address of output sections by using simple expressions. + +This test uses three X86-64 input objects, prog1.o, prog2.o and prog3.o, +which were created with the following C or assembly code: + +*** prog1.o: + +(command line clang -c prog1.c -o prog1.o) + +const char *prog2(); +void write(int, const char *, int); + +int main() { + write(1, prog2(), 14); +} + +*** prog2.o: + +(command line clang -c prog2.c -o prog2.o) + +const char *prog2() { + return "Hello, world!\n"; +} + +*** prog3.o: + +(command line clang -c prog3.S -o prog3.o) + + .globl write +write: + mov $1, %eax + syscall + ret + + .globl _start +_start: + call main + mov $60, %eax + syscall + ret + +We use the following linker script for this test: +*/ + +ENTRY(_start) + +SECTIONS +{ + . = 0x500000; + .text : { prog1.o(.text) } + .mystring : { prog2.o(.rodata.str1.1) } + . = . + 0x6000; + .text.2 : {prog3.o(.text) prog2.o(.text) } +} + +/* +RUN: mkdir -p %T +RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/prog1.o +RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/prog2.o +RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/prog3.o +RUN: cd %T + +RUN: lld -flavor old-gnu -target x86_64 -T %s prog1.o prog2.o prog3.o \ +RUN: -static -o %t1 +RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s + +CHECKSECTIONS: Index: 1 +CHECKSECTIONS: Name: .text +CHECKSECTIONS: Address: 0x500000 +CHECKSECTIONS: Size: 33 + +CHECKSECTIONS: Index: 2 +CHECKSECTIONS: Name: .mystring +CHECKSECTIONS: Address: 0x500021 +CHECKSECTIONS: Size: 15 + +CHECKSECTIONS: Index: 3 +CHECKSECTIONS: Name: .text.2 +CHECKSECTIONS: Address: 0x506030 +CHECKSECTIONS: Size: 48 + +RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: Name: main +CHECKSYMS-NEXT: Value: 0x500000 + +CHECKSYMS: Name: write +CHECKSYMS-NEXT: Value: 0x506030 + +CHECKSYMS: Name: _start +CHECKSYMS-NEXT: Value: 0x506038 + +CHECKSYMS: Name: prog2 +CHECKSYMS-NEXT: Value: 0x506050 + +RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix CHECKPHDRS %s + +CHECKPHDRS: Type: PT_LOAD (0x1) +CHECKPHDRS: Offset: 0x1000 +CHECKPHDRS-NEXT: VirtualAddress: 0x500000 +CHECKPHDRS-NEXT: PhysicalAddress: 0x500000 +CHECKPHDRS-NEXT: FileSize: 48 +CHECKPHDRS-NEXT: MemSize: 48 + +CHECKPHDRS: Type: PT_LOAD (0x1) +CHECKPHDRS: Offset: 0x2030 +CHECKPHDRS-NEXT: VirtualAddress: 0x506030 +CHECKPHDRS-NEXT: PhysicalAddress: 0x506030 +CHECKPHDRS-NEXT: FileSize: 168 +CHECKPHDRS-NEXT: MemSize: 168 +*/ diff --git a/test/old-elf/linkerscript/sections-with-wildcards.test b/test/old-elf/linkerscript/sections-with-wildcards.test new file mode 100644 index 000000000000..a390a2b2d36a --- /dev/null +++ b/test/old-elf/linkerscript/sections-with-wildcards.test @@ -0,0 +1,88 @@ +/* +Tests a linker script that uses the SECTIONS command with rules containing +wildcards and simple SORT directives. It also tests that the linker script +evaluates the expressions in the same order as the one written in the script +file. + +This test uses three X86-64 input objects, prog1.o, prog2.o and prog3.o, +which were created with the following C or assembly code: + +*** prog1.o: + +(command line clang -c prog1.c -o prog1.o) + +const char *prog2(); +void write(int, const char *, int); + +int main() { + write(1, prog2(), 14); +} + +*** prog2.o: + +(command line clang -c prog2.c -o prog2.o) + +const char *prog2() { + return "Hello, world!\n"; +} + +*** prog3.o: + +(command line clang -c prog3.S -o prog3.o) + + .globl write +write: + mov $1, %eax + syscall + ret + + .globl _start +_start: + call main + mov $60, %eax + syscall + ret + +We use the following linker script for this test: +*/ + +ENTRY(_start) + +SECTIONS +{ + my_start_addr = 0x500000; + my_symbol = my_start_addr; + . = my_symbol; + .foo : { SORT(*)(.text .rodata*) } +} + +/* +RUN: mkdir -p %T +RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1.o +RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2.o +RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3.o +RUN: cd %T + +RUN: lld -flavor old-gnu -target x86_64 -T %s p1.o p2.o p3.o \ +RUN: -static -o %t1 +RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s + +CHECKSECTIONS: Index: 1 +CHECKSECTIONS: Name: .foo +CHECKSECTIONS: Address: 0x500000 +CHECKSECTIONS: Size: 101 + +RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: Name: main +CHECKSYMS-NEXT: Value: 0x500000 + +CHECKSYMS: Name: prog2 +CHECKSYMS-NEXT: Value: 0x500030 + +CHECKSYMS: Name: write +CHECKSYMS-NEXT: Value: 0x500050 + +CHECKSYMS: Name: _start +CHECKSYMS-NEXT: Value: 0x500058 +*/ diff --git a/test/old-elf/linkerscript/symbol-definition-so.test b/test/old-elf/linkerscript/symbol-definition-so.test new file mode 100644 index 000000000000..15b22f6f581f --- /dev/null +++ b/test/old-elf/linkerscript/symbol-definition-so.test @@ -0,0 +1,32 @@ +/* +We test whether we can define symbols in a linker script and have them exported +to the output file symbol table. This test is the same as symbol-definition.test +but make checking in case of shared library linking. + +We use the following linker script for this test: +*/ + +SECTIONS +{ + .text : { *(.text) } + MYSTRING = .; + .data : { *(.data) } +} + +/* +RUN: yaml2obj -format=elf %p/Inputs/simple-pic.o.yaml -o=%t.o + +RUN: lld -flavor old-gnu -target x86_64 -shared -T %s %t.o -o %t.so +RUN: llvm-readobj -s -symbols %t.so | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: Name: .data +CHECKSYMS-NEXT: Type: SHT_PROGBITS +CHECKSYMS-NEXT: Flags [ +CHECKSYMS-NEXT: SHF_ALLOC +CHECKSYMS-NEXT: SHF_WRITE +CHECKSYMS-NEXT: ] +CHECKSYMS-NEXT: Address: 0x401060 + +CHECKSYMS: Name: MYSTRING +CHECKSYMS-NEXT: Value: 0x401060 +*/ diff --git a/test/old-elf/linkerscript/symbol-definition.test b/test/old-elf/linkerscript/symbol-definition.test new file mode 100644 index 000000000000..daa3b17e9965 --- /dev/null +++ b/test/old-elf/linkerscript/symbol-definition.test @@ -0,0 +1,54 @@ +/* +We test whether we can define symbols in a linker script and have them exported +to the output file symbol table. + +This test uses a single X86-64 input object, simple.o, created with the +following X86-64 assembly code: + +*** simple.S: + +(command line clang -c simple.S -o simple.o) + + .text + main: + mov $1, %eax + movq $1, %rdi + movq $msg, %rsi + movq $14, %rdx + syscall + ret + + .globl _start + _start: + call main + mov $60, %eax + syscall + ret + + .data + msg: .asciz "Hello, World!\n" + + +We use the following linker script for this test: +*/ + +ENTRY(_start) + +SECTIONS +{ + . = 0x500000; + .text : { *(.text) } + MYSTRING = .; + .data : { *(.data) } +} + +/* +RUN: mkdir -p %T +RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%T/simple.o + +RUN: lld -flavor old-gnu -target x86_64 -T %s %T/simple.o -static -o %t1 +RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: Name: MYSTRING +CHECKSYMS-NEXT: Value: 0x501000 +*/ diff --git a/test/old-elf/linkerscript/valid-script-cli.objtxt b/test/old-elf/linkerscript/valid-script-cli.objtxt new file mode 100644 index 000000000000..a7342c41f529 --- /dev/null +++ b/test/old-elf/linkerscript/valid-script-cli.objtxt @@ -0,0 +1,23 @@ +# Check that the linker script inputs are accepted properly. + +# RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor old-gnu -target x86_64 -T %p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor old-gnu -target x86_64 --script=%p/Inputs/valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +# RUN: lld -flavor old-gnu -target x86_64 -L%p/Inputs/ -l:valid.ls -r %s \ +# RUN: --output-filetype=yaml | FileCheck %s + +defined-atoms: + - name: main + scope: global + content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text + +# CHECK: _entry_point diff --git a/test/old-elf/loginputfiles.test b/test/old-elf/loginputfiles.test new file mode 100644 index 000000000000..f1b78558e9c5 --- /dev/null +++ b/test/old-elf/loginputfiles.test @@ -0,0 +1,28 @@ +# Tests functionality of -t +# +# Tests generated using the source files below +# main file +# int main() +# { +# fn(); +# return 0; +# } +# +# archive file +# int fn() +# { +# return 0; +# } +# +# int fn1() +# { +# return 0; +# } +# gcc -c main.c fn.c fn1.c + +RUN: lld -flavor old-gnu -target x86_64-linux \ +RUN: %p/Inputs/mainobj.x86_64 %p/Inputs/libfnarchive.a -t --noinhibit-exec 2>&1 | \ +RUN: FileCheck -check-prefix INPUTFILES %s + +#INPUTFILES: mainobj.x86_64 +#INPUTFILES: libfnarchive.a(fn.o) diff --git a/test/old-elf/mergeatoms.test b/test/old-elf/mergeatoms.test new file mode 100644 index 000000000000..ec83ac2b8849 --- /dev/null +++ b/test/old-elf/mergeatoms.test @@ -0,0 +1,6 @@ +# Tests that atoms are merged by testing it with --merge-strings option +RUN: lld -flavor old-gnu -target x86_64-linux --merge-strings -o %t1 \ +RUN: %p/Inputs/foo.o.x86-64 %p/Inputs/bar.o.x86-64 -e bar1 +RUN: llvm-objdump -s %t1 | FileCheck -check-prefix=mergeAtoms %s + +mergeAtoms: 62617200 666f6f00 bar.foo. diff --git a/test/old-elf/mergeconstants.test b/test/old-elf/mergeconstants.test new file mode 100644 index 000000000000..719ae8a8b24e --- /dev/null +++ b/test/old-elf/mergeconstants.test @@ -0,0 +1,20 @@ +# The test checks for mergeable strings that appear in the object file +RUN: lld -flavor old-gnu --merge-strings --output-filetype=yaml -target x86_64 \ +RUN: %p/Inputs/constants-merge.x86-64 --noinhibit-exec \ +RUN: | FileCheck -check-prefix=mergeAtoms %s + +mergeAtoms: - ref-name: [[CONSTANT:[-a-zA-Z0-9_]+]] +mergeAtoms: type: constant +mergeAtoms: content: [ 62, 61, 72, 66, 6F, 6F, 00 ] +mergeAtoms: merge: by-content +mergeAtoms: section-choice: custom-required +mergeAtoms: section-name: .rodata.str1.1 +mergeAtoms: - name: foo +mergeAtoms: scope: global +mergeAtoms: type: data +mergeAtoms: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +mergeAtoms: alignment: 8 +mergeAtoms: references: +mergeAtoms: - kind: R_X86_64_64 +mergeAtoms: offset: 3 +mergeAtoms: target: [[CONSTANT]] diff --git a/test/old-elf/mergeglobalatoms.test b/test/old-elf/mergeglobalatoms.test new file mode 100644 index 000000000000..bf8dbf7593f0 --- /dev/null +++ b/test/old-elf/mergeglobalatoms.test @@ -0,0 +1,11 @@ +# ELF files can have mergeable strings which are global!, treat them as global +# defined atoms +RUN: lld -flavor old-gnu --output-filetype=yaml %p/Inputs/globalconst.o.x86-64 \ +RUN: --noinhibit-exec -target x86_64 | FileCheck -check-prefix=globalatoms %s + +globalatoms: - name: mystr +globalatoms: scope: global +globalatoms: type: constant +globalatoms: content: [ 66, 6F, 6F, 62, 61, 72, 00 ] +globalatoms: section-choice: custom-required +globalatoms: section-name: .rodata.str1.1 diff --git a/test/old-elf/no-unique-section-names.test b/test/old-elf/no-unique-section-names.test new file mode 100644 index 000000000000..4c5f79588dbe --- /dev/null +++ b/test/old-elf/no-unique-section-names.test @@ -0,0 +1,19 @@ +# Check handling object files with non-unique named sections. + +RUN: lld -flavor old-gnu -target x86_64-linux -shared -o %t \ +RUN: %p/Inputs/no-unique-section-names.x86-64 +RUN: llvm-objdump -s %p/Inputs/no-unique-section-names.x86-64 %t \ +RUN: | FileCheck %s + +CHECK: Contents of section .group: +CHECK-NEXT: 0000 01000000 08000000 +CHECK-NEXT: Contents of section .text: +CHECK-NEXT: 0000 [[A1:[0-9a-f]+]] [[A2:[0-9a-f]+]] [[A3:[0-9a-f]+]] +CHECK-NEXT: Contents of section .group: +CHECK-NEXT: 0000 01000000 0a000000 +CHECK-NEXT: Contents of section .text: +CHECK-NEXT: 0000 [[B1:[0-9a-f]+]] [[B2:[0-9a-f]+]] [[B3:[0-9a-f]+]] + +CHECK: Contents of section .text: +CHECK: {{[0-9a-f]+}} [[A1]] [[A2]] [[A3]] +CHECK-NEXT: {{[0-9a-f]+}} [[B1]] [[B2]] [[B3]] diff --git a/test/old-elf/note.test b/test/old-elf/note.test new file mode 100644 index 000000000000..aff01c3e5b2a --- /dev/null +++ b/test/old-elf/note.test @@ -0,0 +1,50 @@ +# Check that the linker is not ignoring input sections. +# RUN: yaml2obj -format=elf %s > %t.obj +# RUN: lld -flavor old-gnu -target x86_64 %t.obj -o %t.exe --noinhibit-exec +# RUN: llvm-readobj -s %t.exe | FileCheck %s + +# CHECK: Section { +# CHECK: Name: .note +# CHECK-NEXT: Type: SHT_NOTE + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .note + Type: SHT_NOTE + AddressAlign: 0x0000000000000001 + Content: '00' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .note + Type: STT_SECTION + Section: .note +... diff --git a/test/old-elf/options/dynamic-linker.test b/test/old-elf/options/dynamic-linker.test new file mode 100644 index 000000000000..6b56f17c677d --- /dev/null +++ b/test/old-elf/options/dynamic-linker.test @@ -0,0 +1,17 @@ +# This tests the functionality of specifying dynamic-linker argument in the +# command line +RUN: lld -flavor old-gnu -target x86_64 --dynamic-linker="/xyz.so" \ +RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t +RUN: llvm-objdump -s %t | FileCheck -check-prefix=DYNAMICINTERP1 %s +RUN: lld -flavor old-gnu -target x86_64 --dynamic-linker="" \ +RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t1 +RUN: llvm-objdump -s %t1 | FileCheck -check-prefix=DYNAMICINTERP2 %s +RUN: lld -flavor old-gnu -target x86_64 -dynamic-linker /xyz.so \ +RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t2 +RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=DYNAMICINTERP1 %s + +DYNAMICINTERP1:Contents of section .interp: +DYNAMICINTERP1: 400158 2f78797a 2e736f00 /xyz.so. +DYNAMICINTERP2:Contents of section .interp: +DYNAMICINTERP2: 400158 00 + diff --git a/test/old-elf/options/target-specific-args.test b/test/old-elf/options/target-specific-args.test new file mode 100644 index 000000000000..ec5edf0ad62e --- /dev/null +++ b/test/old-elf/options/target-specific-args.test @@ -0,0 +1,5 @@ +# Test of target specific options +# RUN: lld -flavor old-gnu -target x86_64 --target1-rel \ +# RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t 2>&1 | FileCheck %s + +# CHECK: warning: ignoring unsupported ARM/ELF specific argument: --target1-rel diff --git a/test/old-elf/phdr.test b/test/old-elf/phdr.test new file mode 100644 index 000000000000..c8b3664d025f --- /dev/null +++ b/test/old-elf/phdr.test @@ -0,0 +1,99 @@ +# This test checks emission for program header for ELF binaries +RUN: lld -flavor old-gnu -target i386-linux -o %t1 -e main %p/Inputs/phdr.i386 \ +RUN: && llvm-readobj -program-headers %t1 | FileCheck -check-prefix=I386 %s +RUN: lld -flavor old-gnu -target x86_64-linux -o %t1 -e _start %p/Inputs/relocs.x86-64 -static \ +RUN: && llvm-objdump -p %t1 | FileCheck %s -check-prefix=X86_64 + + +I386: ProgramHeaders [ +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_PHDR (0x6) +I386-NEXT: Offset: 0x34 +I386-NEXT: VirtualAddress: 0x34 +I386-NEXT: PhysicalAddress: 0x34 +I386-NEXT: FileSize: 224 +I386-NEXT: MemSize: 224 +I386-NEXT: Flags [ (0x5) +I386-NEXT: PF_R (0x4) +I386-NEXT: PF_X (0x1) +I386-NEXT: ] +I386-NEXT: Alignment: 8 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_INTERP (0x3) +I386-NEXT: Offset: 0x114 +I386-NEXT: VirtualAddress: 0x114 +I386-NEXT: PhysicalAddress: 0x114 +I386-NEXT: FileSize: 28 +I386-NEXT: MemSize: 28 +I386-NEXT: Flags [ (0x4) +I386-NEXT: PF_R (0x4) +I386-NEXT: ] +I386-NEXT: Alignment: 1 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_LOAD (0x1) +I386-NEXT: Offset: 0x0 +I386-NEXT: VirtualAddress: 0x0 +I386-NEXT: PhysicalAddress: 0x0 +I386-NEXT: FileSize: 556 +I386-NEXT: MemSize: 556 +I386-NEXT: Flags [ (0x5) +I386-NEXT: PF_R (0x4) +I386-NEXT: PF_X (0x1) +I386-NEXT: ] +I386-NEXT: Alignment: 4096 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_LOAD (0x1) +I386-NEXT: Offset: 0x1000 +I386-NEXT: VirtualAddress: 0x1000 +I386-NEXT: PhysicalAddress: 0x1000 +I386-NEXT: FileSize: 260 +I386-NEXT: MemSize: 260 +I386-NEXT: Flags [ (0x6) +I386-NEXT: PF_R (0x4) +I386-NEXT: PF_W (0x2) +I386-NEXT: ] +I386-NEXT: Alignment: 4096 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_LOAD (0x1) +I386-NEXT: Offset: 0x4000 +I386-NEXT: VirtualAddress: 0x4000 +I386-NEXT: PhysicalAddress: 0x4000 +I386-NEXT: FileSize: 4 +I386-NEXT: MemSize: 8 +I386-NEXT: Flags [ (0x6) +I386-NEXT: PF_R (0x4) +I386-NEXT: PF_W (0x2) +I386-NEXT: ] +I386-NEXT: Alignment: 16384 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_DYNAMIC (0x2) +I386-NEXT: Offset: 0x1FC +I386-NEXT: VirtualAddress: 0x1FC +I386-NEXT: PhysicalAddress: 0x1FC +I386-NEXT: FileSize: 48 +I386-NEXT: MemSize: 48 +I386-NEXT: Flags [ (0x4) +I386-NEXT: PF_R (0x4) +I386-NEXT: ] +I386-NEXT: Alignment: 4 +I386-NEXT: } +I386-NEXT: ProgramHeader { +I386-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550) +I386-NEXT: Offset: 0x1F4 +I386-NEXT: VirtualAddress: 0x1F4 +I386-NEXT: PhysicalAddress: 0x1F4 +I386-NEXT: FileSize: 8 +I386-NEXT: MemSize: 8 +I386-NEXT: Flags [ (0x4) +I386-NEXT: PF_R (0x4) +I386-NEXT: ] +I386-NEXT: Alignment: 4 +I386-NEXT: } + +X86_64: LOAD off 0x0000000000000000 +X86_64: LOAD off 0x0000000000001000 diff --git a/test/old-elf/quickdata.test b/test/old-elf/quickdata.test new file mode 100644 index 000000000000..85ad23d0b8e9 --- /dev/null +++ b/test/old-elf/quickdata.test @@ -0,0 +1,15 @@ +RUN: lld -flavor old-gnu -target hexagon --output-filetype=yaml %p/Inputs/quickdata-test.elf-hexagon \ +RUN: --noinhibit-exec | FileCheck %s -check-prefix hexagon + +hexagon: - name: ac1 +hexagon: scope: global +hexagon: type: zero-fill-quick +hexagon: size: 1 +hexagon: merge: as-tentative +hexagon: - name: init +hexagon: scope: global +hexagon: type: quick-data +hexagon: - name: bss1 +hexagon: scope: global +hexagon: type: zero-fill-quick + diff --git a/test/old-elf/reloc.test b/test/old-elf/reloc.test new file mode 100644 index 000000000000..f8cb056e03da --- /dev/null +++ b/test/old-elf/reloc.test @@ -0,0 +1,38 @@ +RUN: lld -flavor old-gnu -target i386 --merge-strings -r --output-filetype=yaml \ +RUN: %p/Inputs/reloc-test.elf-i386 | FileCheck %s -check-prefix ELF-i386 + +ELF-i386: defined-atoms: +ELF-i386: - ref-name: [[STRNAMEA:[-a-zA-Z0-9_]+]] +ELF-i386: type: constant +ELF-i386: content: [ 68, 65, 6C, 6C, 6F, 20, 77, 6F, 72, 6C, 64, 00 ] +ELF-i386: merge: by-content +ELF-i386: - ref-name: [[STRNAMEB:[-a-zA-Z0-9_]+]] +ELF-i386: alignment: 16 +ELF-i386: section-choice: custom-required +ELF-i386: section-name: .text.startup +ELF-i386: references: +ELF-i386: - kind: layout-after +ELF-i386: offset: 0 +ELF-i386: target: main +ELF-i386: - name: main +ELF-i386: scope: global +ELF-i386: content: [ 55, 89, E5, 83, E4, F0, 83, EC, 10, C7, 04, 24, +ELF-i386: 00, 00, 00, 00, E8, FC, FF, FF, FF, 31, C0, C9, +ELF-i386: C3 ] +ELF-i386: alignment: 16 +ELF-i386: section-choice: custom-required +ELF-i386: section-name: .text.startup +ELF-i386: references: +ELF-i386: - kind: R_386_32 +ELF-i386: offset: 12 +ELF-i386: target: [[STRNAMEA]] +ELF-i386: - kind: R_386_PC32 +ELF-i386: offset: 17 +ELF-i386: target: puts +ELF-i386: addend: 252 +ELF-i386: undefined-atoms: +ELF-i386: - name: puts +ELF-i386: absolute-atoms: +ELF-i386: - name: test.c +ELF-i386: scope: static +ELF-i386: value: 0x0000000000000000 diff --git a/test/old-elf/responsefile.test b/test/old-elf/responsefile.test new file mode 100644 index 000000000000..89e9ffd015bd --- /dev/null +++ b/test/old-elf/responsefile.test @@ -0,0 +1,6 @@ +# RUN: not lld -flavor old-gnu --abc @%p/Inputs/responsefile --baz >& %t.log +# RUN: FileCheck %s < %t.log + +CHECK: warning: ignoring unknown argument: --abc +CHECK: warning: ignoring unknown argument: --inresponsefile +CHECK: warning: ignoring unknown argument: --baz diff --git a/test/old-elf/rodata.test b/test/old-elf/rodata.test new file mode 100644 index 000000000000..12d9abb2a194 --- /dev/null +++ b/test/old-elf/rodata.test @@ -0,0 +1,5 @@ +RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/constdata.x86-64 \ +RUN: -static -e _start +RUN: llvm-objdump -s %t | FileCheck %s + +CHECK: Hellooooooooo diff --git a/test/old-elf/rosegment.test b/test/old-elf/rosegment.test new file mode 100644 index 000000000000..675dc3861867 --- /dev/null +++ b/test/old-elf/rosegment.test @@ -0,0 +1,26 @@ +# Tests that the option --rosegment produces an output file with a separate +# segment created for read only data. +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o -o %t1.elf \ +RUN: --noinhibit-exec +RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o --rosegment -o %t2.elf \ +RUN: --noinhibit-exec +RUN: llvm-readobj -program-headers %t1.elf | FileCheck %s -check-prefix=NORO-SEGMENT +RUN: llvm-readobj -program-headers %t2.elf | FileCheck %s -check-prefix=RO-SEGMENT + +#NORO-SEGMENT: Type: PT_PHDR +#NORO-SEGMENT: Type: PT_INTERP +#NORO-SEGMENT: Type: PT_LOAD +#NORO-SEGMENT: Type: PT_LOAD +#NORO-SEGMENT: Type: PT_DYNAMIC +#NORO-SEGMENT: Type: PT_GNU_EH_FRAME + +#RO-SEGMENT: Type: PT_PHDR +#RO-SEGMENT: Type: PT_INTERP +#RO-SEGMENT: Type: PT_LOAD +#RO-SEGMENT: Type: PT_LOAD +#RO-SEGMENT: Flags [ +#RO-SEGMENT: PF_R (0x4) +#RO-SEGMENT: ] +#RO-SEGMENT: Type: PT_LOAD +#RO-SEGMENT: Type: PT_DYNAMIC +#RO-SEGMENT: Type: PT_GNU_EH_FRAME diff --git a/test/old-elf/sectionGroups/sectiongroup-new-members.test b/test/old-elf/sectionGroups/sectiongroup-new-members.test new file mode 100644 index 000000000000..dff1a96b07ee --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-new-members.test @@ -0,0 +1,151 @@ +# Checks that the linker picks the first group in the output file when the file +# have some members dont appear in the first group. +# 1a.s +# ------ +# +# .section .text,"axG",%progbits,foo_group,comdat +# .weak foo +#foo: +# .word 0 +# 1b.s +# ----- +# .section .text,"axG",%progbits,foo_group,comdat +# .global foo +# .global bar +#foo: +# .word 0 +#bar: +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS +#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS +#CHECKGROUP: - name: foo +#CHECKGROUP: scope: global +#CHECKGROUP: merge: as-weak +#CHECKGROUP: section-name: .text +#CHECKGROUP: - name: foo_group +#CHECKGROUP: scope: global +#CHECKGROUP: type: group-comdat +#CHECKGROUP: section-choice: custom-required +#CHECKGROUP: section-name: .group +#CHECKGROUP: permissions: --- +#CHECKGROUP: references: +#CHECKGROUP: - kind: group-child +#CHECKGROUP: offset: 0 +#CHECKGROUP: target: foo +#CHECKGROUPSECTIONS: Section { +#CHECKGROUPSECTIONS: Name: .text +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ (0x6) +#CHECKGROUPSECTIONS: SHF_ALLOC (0x2) +#CHECKGROUPSECTIONS: SHF_EXECINSTR (0x4) +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 2 +#CHECKGROUPSECTIONS: AddressAlignment: 1 +#CHECKGROUPSECTIONS: } +#CHECKSYMBOLS: Name: foo +#CHECKSYMBOLS: Type: Function +#CHECKSYMBOLS: Section: .text +#CHECKSYMBOLS-NOT: Name: bar +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: foo_group + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' +Symbols: + Local: + - Name: foo_group + Section: .group + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Weak: + - Name: foo + Section: .text +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: foo_group + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' +Symbols: + Local: + - Name: foo_group + Section: .group + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: bar + Section: .text + Value: 0x0000000000000002 + - Name: foo + Section: .text +... diff --git a/test/old-elf/sectionGroups/sectiongroup-simple.test b/test/old-elf/sectionGroups/sectiongroup-simple.test new file mode 100644 index 000000000000..57707f84475e --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-simple.test @@ -0,0 +1,144 @@ +# Checks that the linker picks the first group in the output file when the file +# have some members dont appear in the first group. +# 1a.s +# ------ +# .section .text,"axG",%progbits,foo_group,comdat +# .weak foo +#foo: +# .word 0 +# 1b.s +# ----- +# .section .text,"axG",%progbits,foo_group,comdat +# .global bar +#bar: +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS +#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS +#CHECKGROUP: - name: foo +#CHECKGROUP: scope: global +#CHECKGROUP: merge: as-weak +#CHECKGROUP: section-name: .text +#CHECKGROUP: - name: foo_group +#CHECKGROUP: scope: global +#CHECKGROUP: type: group-comdat +#CHECKGROUP: section-choice: custom-required +#CHECKGROUP: section-name: .group +#CHECKGROUP: permissions: --- +#CHECKGROUP: references: +#CHECKGROUP: - kind: group-child +#CHECKGROUP: offset: 0 +#CHECKGROUP: target: foo +#CHECKGROUPSECTIONS: Section { +#CHECKGROUPSECTIONS: Name: .text +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ (0x6) +#CHECKGROUPSECTIONS: SHF_ALLOC (0x2) +#CHECKGROUPSECTIONS: SHF_EXECINSTR (0x4) +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 2 +#CHECKGROUPSECTIONS: AddressAlignment: 1 +#CHECKGROUPSECTIONS: } +#CHECKSYMBOLS: Name: foo +#CHECKSYMBOLS: Type: Function +#CHECKSYMBOLS: Section: .text + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: foo_group + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' +Symbols: + Local: + - Name: foo_group + Section: .group + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Weak: + - Name: foo + Section: .text +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: foo_group + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: foo_group + Section: .group + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: bar + Section: .text +... diff --git a/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test b/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test new file mode 100644 index 000000000000..56595e59d8d6 --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test @@ -0,0 +1,156 @@ +# Tests that linker throws an error for an undefined symbol in the section +# group, which is the same as the signature in the next input file. +# comdat1.s +# ------------ +# .section .foo,"axG",@progbits,g1,comdat +# .word g1 +#comdat2.s +#----------- +# .global g1 +# .section .bar,"axG",@progbits,g1,comdat +#g2: +# nop +# .section .car,"axG",@progbits,g1,comdat +#g3: +# nop +# +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec -o %t2.out 2>&1 | FileCheck %s +#CHECK: Undefined symbol: {{.*}} g1 +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - SectionOrType: .rela.foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' + - Name: .rela.foo + Type: SHT_RELA + Flags: [ SHF_GROUP ] + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .foo + Relocations: + - Offset: 0x0000000000000000 + Symbol: g1 + Type: R_X86_64_16 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + - Name: .group + Type: STT_SECTION + Section: .group + Global: + - Name: g1 +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .bar + - SectionOrType: .car + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .bar + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '90' + - Name: .car + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '90' +Symbols: + Local: + - Name: g2 + Section: .bar + - Name: g3 + Section: .car + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .bar + Type: STT_SECTION + Section: .bar + - Name: .car + Type: STT_SECTION + Section: .car + - Name: .group + Type: STT_SECTION + Section: .group + Global: + - Name: g1 + Section: .group +... diff --git a/test/old-elf/sectionGroups/sectiongroup-undef-member.test b/test/old-elf/sectionGroups/sectiongroup-undef-member.test new file mode 100644 index 000000000000..65e9ec7632bf --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-undef-member.test @@ -0,0 +1,142 @@ +# Tests that linker throws an error for an undefined symbol in the section +# group. +# +#comdata.s +#------------ +# .section .foo,"axG",@progbits,g1,comdat +# .word g1 +# +#comdatb.s +#------------ +# .global g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# nop +# +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o +#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \ +#RUN: --noinhibit-exec -o %t2.out 2>&1 | FileCheck %s +#CHECK: Undefined symbol: {{.*}} g1 +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - SectionOrType: .rela.foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' + - Name: .rela.foo + Type: SHT_RELA + Flags: [ SHF_GROUP ] + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .foo + Relocations: + - Offset: 0x0000000000000000 + Symbol: g1 + Type: R_X86_64_16 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + - Name: .group + Type: STT_SECTION + Section: .group + Global: + - Name: g1 +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '90' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + - Name: .group + Type: STT_SECTION + Section: .group + Global: + - Name: g1 + Section: .foo +... diff --git a/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test b/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test new file mode 100644 index 000000000000..9f8f80c23605 --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test @@ -0,0 +1,250 @@ +# This tests that comdat weak symbol can be overridden by a global symbol. +# comdat1.s +#------------------------ +# .weak g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# nop +# .global g2 +#g2: +# nop +#! +# +#comdat2.s << \! +#----------------- +# .global g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# nop +# .global g2 +#g2: +# nop +# +#cat > g1.c << \! +#int g1() { +# return 0; +#} +# +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o +#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS +#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS +#CHECKGROUP: - name: g2 +#CHECKGROUP: content: [ 90 ] +#CHECKGROUP: section-choice: custom-required +#CHECKGROUP: section-name: .foo +#CHECKGROUP: - name: g1 +#CHECKGROUP: scope: global +#CHECKGROUP: content: [ 55, 48, 89, E5, 31, C0, 5D, C3 ] +#CHECKGROUP: alignment: 16 +#CHECKGROUP: section-name: .text +#CHECKGROUPSECTIONS: Name: .text +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ +#CHECKGROUPSECTIONS: SHF_ALLOC +#CHECKGROUPSECTIONS: SHF_EXECINSTR +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 8 +#CHECKGROUPSECTIONS: Name: .foo +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ +#CHECKGROUPSECTIONS: SHF_ALLOC +#CHECKGROUPSECTIONS: SHF_EXECINSTR +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 2 +#CHECKSYMBOLS: Name: g2 +#CHECKSYMBOLS: Section: .foo +#CHECKSYMBOLS: Name: g1 +#CHECKSYMBOLS: Section: .text +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '9090' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g2 + Section: .foo + Value: 0x0000000000000001 + Weak: + - Name: g1 + Section: .foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '9090' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g1 + Section: .foo + - Name: g2 + Section: .foo + Value: 0x0000000000000001 +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E531C05DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000000800000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: g1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: g1 + Type: STT_FUNC + Section: .text + Size: 0x0000000000000008 +... diff --git a/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test b/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test new file mode 100644 index 000000000000..0c5d65ad544f --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test @@ -0,0 +1,236 @@ +# This tests that comdat undef symbol is overridden by a global symbol. +# comdat1.s +#------------------------ +# .global g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# .word 5 +# +#comdat2.s << \! +#----------------- +# .global g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# nop +# +#g1.c +#----------- +#extern int g1; +#int fn() { return g1;} +# +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o +#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS +#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS +#CHECKGROUP: - name: g1 +#CHECKGROUP: scope: global +#CHECKGROUP: content: [ 05, 00 ] +#CHECKGROUP: section-name: .foo +#CHECKGROUPSECTIONS: Section { +#CHECKGROUPSECTIONS: Name: .foo +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ +#CHECKGROUPSECTIONS: SHF_ALLOC +#CHECKGROUPSECTIONS: SHF_EXECINSTR +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 2 +#CHECKGROUPSECTIONS: } +#CHECKSYMBOLS: Name: g1 +#CHECKSYMBOLS: Section: .foo +#CHECKSYMBOLS: Name: fn +#CHECKSYMBOLS: Section: .text +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0500' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g1 + Section: .foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '90' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g1 + Section: .foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E58B0425000000005DC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000007 + Symbol: g1 + Type: R_X86_64_32S + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000000D00000000410E108602430D0600000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: global-g1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: fn + Type: STT_FUNC + Section: .text + Size: 0x000000000000000D + - Name: g1 +... diff --git a/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test b/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test new file mode 100644 index 000000000000..83a69a3828b2 --- /dev/null +++ b/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test @@ -0,0 +1,219 @@ +# This tests that comdat undef symbol is overridden by a global symbol. +# comdat1.s +#------------------------ +# .section .foo,"axG",@progbits,g1,comdat +# word g1 +# +#comdat2.s << \! +#----------------- +# .global g1 +# .section .foo,"axG",@progbits,g1,comdat +#g1: +# nop +# +#global-g1.c +#----------- +#int g1=10; +# +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o +#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml +#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \ +#RUN: %t.g1.o --noinhibit-exec -o %t2.out +#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml +#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS +#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS +#CHECKGROUP: - name: g1 +#CHECKGROUP: scope: global +#CHECKGROUP: content: [ 0A, 00, 00, 00 ] +#CHECKGROUP: section-name: .data +#CHECKGROUPSECTIONS: Name: .foo +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ +#CHECKGROUPSECTIONS: SHF_ALLOC +#CHECKGROUPSECTIONS: SHF_EXECINSTR +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 2 +#CHECKGROUPSECTIONS: Name: .data +#CHECKGROUPSECTIONS: Type: SHT_PROGBITS +#CHECKGROUPSECTIONS: Flags [ +#CHECKGROUPSECTIONS: SHF_ALLOC +#CHECKGROUPSECTIONS: SHF_WRITE +#CHECKGROUPSECTIONS: ] +#CHECKGROUPSECTIONS: Size: 4 +#CHECKSYMBOLS: Name: g1 +#CHECKSYMBOLS: Section: .data +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - SectionOrType: .rela.foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '0000' + - Name: .rela.foo + Type: SHT_RELA + Flags: [ SHF_GROUP ] + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .foo + Relocations: + - Offset: 0x0000000000000000 + Symbol: g1 + Type: R_X86_64_16 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g1 +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: g1 + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '90' +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .foo + Type: STT_SECTION + Section: .foo + Global: + - Name: g1 + Section: .foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: 0A000000 + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' +Symbols: + Local: + - Name: global-g1.c + Type: STT_FILE + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + Global: + - Name: g1 + Type: STT_OBJECT + Section: .data + Size: 0x0000000000000004 +... diff --git a/test/old-elf/sections.test b/test/old-elf/sections.test new file mode 100644 index 000000000000..f36cad619186 --- /dev/null +++ b/test/old-elf/sections.test @@ -0,0 +1,142 @@ +# This test checks if sections are created properly in the output that appear in +# the input +RUN: lld -flavor old-gnu -target i386 -o %t1 %p/Inputs/section-test.i386 \ +RUN: -static -e baz +RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=OBJDUMP %s +RUN: llvm-readobj -h -s -t %t1 | FileCheck -check-prefix=READOBJ %s + +OBJDUMP: 0 00000000 0000000000000000 +OBJDUMP: 1 .text 0000000a 0000000000000074 TEXT DATA +OBJDUMP: 2 .data 00000004 0000000000001000 DATA +OBJDUMP: 3 .special 00000004 0000000000001004 DATA +OBJDUMP: 4 .anotherspecial 00000004 0000000000001008 DATA +OBJDUMP: 5 .bss 00000004 000000000000100c BSS +OBJDUMP: 6 .shstrtab {{[0-9a-f]+}} 0000000000000000 +OBJDUMP: 7 .symtab {{[0-9a-f]+}} 0000000000000000 +OBJDUMP: 8 .strtab {{[0-9a-f]+}} 0000000000000000 + +READOBJ: Format: ELF32-i386 +READOBJ: Arch: i386 +READOBJ: AddressSize: 32bit +READOBJ: ElfHeader { +READOBJ: Ident { +READOBJ: DataEncoding: LittleEndian (0x1) +READOBJ: } +READOBJ: Machine: EM_386 +READOBJ: } + +READOBJ: Sections [ +READOBJ: Section { +READOBJ: Index: 0 +READOBJ: Name: (0) +READOBJ: Type: SHT_NULL +READOBJ: Flags [ (0x0) +READOBJ: ] +READOBJ: Address: 0x0 +READOBJ: Size: 0 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 1 +READOBJ: Name: .text +READOBJ: Type: SHT_PROGBITS +READOBJ: Flags [ (0x6) +READOBJ: SHF_ALLOC +READOBJ: SHF_EXECINSTR +READOBJ: ] +READOBJ: Address: 0x74 +READOBJ: Size: 10 +READOBJ: AddressAlignment: 4 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 2 +READOBJ: Name: .data +READOBJ: Type: SHT_PROGBITS +READOBJ: Flags [ (0x3) +READOBJ: SHF_ALLOC +READOBJ: SHF_WRITE +READOBJ: ] +READOBJ: Address: 0x1000 +READOBJ: Size: 4 +READOBJ: AddressAlignment: 4 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 3 +READOBJ: Name: .special +READOBJ: Type: SHT_PROGBITS +READOBJ: Flags [ (0x3) +READOBJ: SHF_ALLOC +READOBJ: SHF_WRITE +READOBJ: ] +READOBJ: Address: 0x1004 +READOBJ: Size: 4 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 4 +READOBJ: Name: .anotherspecial +READOBJ: Type: SHT_PROGBITS +READOBJ: Flags [ (0x3) +READOBJ: SHF_ALLOC +READOBJ: SHF_WRITE +READOBJ: ] +READOBJ: Address: 0x1008 +READOBJ: Size: 4 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 5 +READOBJ: Name: .bss +READOBJ: Type: SHT_NOBITS +READOBJ: Flags [ (0x3) +READOBJ: SHF_ALLOC +READOBJ: SHF_WRITE +READOBJ: ] +READOBJ: Address: 0x100C +READOBJ: Size: 4 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 6 +READOBJ: Name: .shstrtab +READOBJ: Type: SHT_STRTAB +READOBJ: Flags [ (0x0) +READOBJ: ] +READOBJ: Address: 0x0 +READOBJ: Link: 0 +READOBJ: AddressAlignment: 1 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 7 +READOBJ: Name: .symtab +READOBJ: Type: SHT_SYMTAB +READOBJ: Flags [ (0x0) +READOBJ: ] +READOBJ: Address: 0x0 +READOBJ: Link: 8 +READOBJ: AddressAlignment: 4 +READOBJ: EntrySize: 16 +READOBJ: } +READOBJ: Section { +READOBJ: Index: 8 +READOBJ: Name: .strtab +READOBJ: Type: SHT_STRTAB +READOBJ: Flags [ (0x0) +READOBJ: ] +READOBJ: Address: 0x0 +READOBJ: } +READOBJ: ] + +READOBJ: Symbols [ +READOBJ: Symbol { +READOBJ: Name: baz +READOBJ: Value: 0x74 +READOBJ: Size: 10 +READOBJ: Binding: Global +READOBJ: Type: Function +READOBJ: Section: .text +READOBJ: } +READOBJ: Symbol { +READOBJ: Name: y +READOBJ: Value: 0x1004 +READOBJ: Size: 4 +READOBJ: Binding: Global +READOBJ: Type: Object +READOBJ: Section: .special +READOBJ: } diff --git a/test/old-elf/sh_addralign.test b/test/old-elf/sh_addralign.test new file mode 100644 index 000000000000..97ddd5f1030a --- /dev/null +++ b/test/old-elf/sh_addralign.test @@ -0,0 +1,37 @@ +# Check handling of section alignment. +# RUN: yaml2obj -format=elf %s > %t-obj +# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj +# RUN: llvm-objdump -h %t-exe | FileCheck %s + +# CHECK: 8 .data 00000000 0000000000402000 DATA + +!ELF +FileHeader: !FileHeader + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 + +Sections: +- Name: .text + Type: SHT_PROGBITS + Content: '' + AddressAlign: 0 + Flags: [SHF_ALLOC, SHF_EXECINSTR] +- Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 1 + Size: 0x1000 +- Name: .data + Type: SHT_PROGBITS + Content: '' + AddressAlign: 4096 + Flags: [SHF_ALLOC, SHF_WRITE] + +Symbols: + Global: + - Name: _start + Section: .text + Value: 0x0 + Size: 4 diff --git a/test/old-elf/shndx.test b/test/old-elf/shndx.test new file mode 100644 index 000000000000..c86fa3349b5f --- /dev/null +++ b/test/old-elf/shndx.test @@ -0,0 +1,18 @@ +Test that we can handle shndx. The test file has a shndx despite having only +a few sections. One might consider it invalid, but it has a clear interpretation +and avoids needing 65K sections to test the corresponding code path. + +RUN: lld -target x86_64-pc-linux -flavor old-gnu %p/Inputs/shndx.o-x86_64 -o %t.so -shared +RUN: llvm-readobj -s -t %t.so | FileCheck %s + +CHECK: Name: .text +CHECK-NEXT: Type: SHT_PROGBITS (0x1) +CHECK-NEXT: Flags [ (0x6) +CHECK-NEXT: SHF_ALLOC (0x2) +CHECK-NEXT: SHF_EXECINSTR (0x4) +CHECK-NEXT: ] +CHECK-NEXT: Address: [[ADDR:.*]] + +// CHECK: Symbol { +// CHECK: Name: foo +// CHECK-NEXT: Value: [[ADDR]] diff --git a/test/old-elf/soname.test b/test/old-elf/soname.test new file mode 100644 index 000000000000..b4dce9746d48 --- /dev/null +++ b/test/old-elf/soname.test @@ -0,0 +1,6 @@ +RUN: lld -flavor old-gnu -shared -target i386 -e main %p/Inputs/writersyms.o \ +RUN: -o %t -soname libtest.so +RUN: llvm-readobj -dynamic-table %t | FileCheck %s + +CHECK: LoadName: libtest.so +CHECK: 0x0000000E SONAME LibrarySoname (libtest.so) diff --git a/test/old-elf/start-stop-sym.test b/test/old-elf/start-stop-sym.test new file mode 100644 index 000000000000..62c16a91ee69 --- /dev/null +++ b/test/old-elf/start-stop-sym.test @@ -0,0 +1,108 @@ +# Check __start_XXX and __stop_XXX symbols handling where XXX +# is a section name which can be represented as a C identifier. + +# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o +# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o +# RUN: lld -flavor old-gnu -target mipsel -static -e T0 -o %t.exe %t1.o %t2.o +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 400080 a0004000 b4004000 00000000 00000000 +# ^ start of _csec section +# ^ end of _csec section +# CHECK-NEXT: 400090 a0004000 b4004000 +# CHECK-NEXT: Contents of section _csec: +# CHECK-NEXT: 4000a0 00000000 00000000 00000000 00000000 +# CHECK-NEXT: 4000b0 00000000 + +# CHECK: 004000a0 g *ABS* 00000000 __start__csec +# CHECK: 004000b4 g *ABS* 00000000 __stop__csec + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: __start__csec + Type: R_MIPS_32 + - Offset: 4 + Symbol: __stop__csec + Type: R_MIPS_32 + + - Name: _csec + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 16 + Size: 4 + +Symbols: + Weak: + - Name: __start__csec + - Name: __stop__csec + Global: + - Name: T0 + Type: STT_FUNC + Section: .text + Size: 8 + +--- +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32] + +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 16 + Size: 8 + + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 4 + Info: .text + Relocations: + - Offset: 0 + Symbol: __start__csec + Type: R_MIPS_32 + - Offset: 4 + Symbol: __stop__csec + Type: R_MIPS_32 + + - Name: _csec + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 16 + Size: 4 + +Symbols: + Weak: + - Name: __start__csec + - Name: __stop__csec + Global: + - Name: T1 + Type: STT_FUNC + Section: .text + Size: 8 +... diff --git a/test/old-elf/strip-all.test b/test/old-elf/strip-all.test new file mode 100644 index 000000000000..faf30349ec84 --- /dev/null +++ b/test/old-elf/strip-all.test @@ -0,0 +1,108 @@ +# Tests the --strip-all (-s) flag. +# We expect that .symtab and .strtab are stripped from the final executable. +# +# The following code was used to generate the object. +# $ clang -c blah.c -o blah +# +# void +# callMeMaybe(int *v) +# { +# *v += 1; +# } +# +# int +# main(void) +# { +# +# int blah = 42; +# callMeMaybe(&blah); +# } + +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main --strip-all -o %t1 +#RUN: llvm-objdump -section-headers %t1 | FileCheck %s + +#CHECK: 14 .shstrtab 0000007d 0000000000000000 +#CHECK-NOT: 15 .symtab 00000198 0000000000000000 +#CHECK-NOT: 16 .strtab 000000e4 0000000000000000 + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E548897DF8488B7DF88B07050100000089075DC3660F1F840000000000554889E54883EC10488D7DFCC745FC2A000000E8C8FFFFFFB8000000004883C4105DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000001700000000410E108602430D060000001800000038000000000000002300000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: callMeMaybe + Type: STT_FUNC + Section: .text + Size: 0x0000000000000017 + - Name: main + Type: STT_FUNC + Section: .text + Value: 0x0000000000000020 + Size: 0x0000000000000023 +... diff --git a/test/old-elf/stripped-empty.test b/test/old-elf/stripped-empty.test new file mode 100644 index 000000000000..ddf3b3899d10 --- /dev/null +++ b/test/old-elf/stripped-empty.test @@ -0,0 +1,4 @@ +RUN: lld -flavor old-gnu -shared -o test.so \ +RUN: -target x86_64 %p/Inputs/stripped-empty.x86_64 + +test that we handle files without a symbol table. diff --git a/test/old-elf/symbols.test b/test/old-elf/symbols.test new file mode 100644 index 000000000000..bcf399e86eb8 --- /dev/null +++ b/test/old-elf/symbols.test @@ -0,0 +1,33 @@ +# Tests the functionality of archive libraries reading +# and resolution +# Note: The binary files would not be required once we have support to generate +# binary archives from textual(yaml) input +# +# Tests generated using the source files below +# main file +# +#extern int __bss_start __attribute__ ((weak)); +#int a; +#int main() +#{ +# return 0; +#} +# + +RUN: lld -flavor old-gnu -target i386 -e main %p/Inputs/writersyms.o -o %t1 +RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSYMS %s +RUN: lld -flavor old-gnu -shared -target i386 -e main %p/Inputs/writersyms.o -o %t1 +RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSHAREDSYMS %s + +CHECKSYMS: {{[0-9a-f]+}} a 1.c +CHECKSYMS: {{[0-9a-f]+}} T main +CHECKSYMS: {{[0-9a-f]+}} A __bss_start +CHECKSYMS: {{[0-9a-f]+}} B a +CHECKSYMS: {{[0-9a-f]+}} A __bss_end +CHECKSYMS: {{[0-9a-f]+}} A _end +CHECKSYMS: {{[0-9a-f]+}} A end + +CHECKSHAREDSYMS: {{[0-9a-f]+}} a 1.c +CHECKSHAREDSYMS: {{[0-9a-f]+}} T main +CHECKSHAREDSYMS: {{[0-9a-f]+}} B a +CHECKSHAREDSYMS: {{[0-9a-f]+}} A _end diff --git a/test/old-elf/tls-tbss-size.test b/test/old-elf/tls-tbss-size.test new file mode 100644 index 000000000000..a7fd86cb7b43 --- /dev/null +++ b/test/old-elf/tls-tbss-size.test @@ -0,0 +1,176 @@ +# This test verify if external TLS non initialized variables (tbss) are +# accounted in TBSS segment size + +# The input file 'test/elf/Inputs/tls-tbss-size.yaml' declares: +# +# __thread int t0; +# __thread int t1; +# __thread int t2; +# __thread int t3; +# +# And the 'test/elf/tls-tbss-size.test' defines: +# +# __thread int t4; +# __thread int t5; +# __thread int t6; +# __thread int t7; +# +# __thread int t8 = 3; +# __thread int t9 = 4; +# __thread int t10 = 5; +# __thread int t11 = 6; + +#RUN: yaml2obj -format=elf -o=%t-t1.o %p/Inputs/tls-tbss-size.yaml +#RUN: yaml2obj -format=elf -o=%t-t0.o %s +#RUN: lld -flavor old-gnu -target x86_64-linux --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o +#RUN: llvm-readobj --sections %t.exe | FileCheck %s + +#CHECK: Sections [ +#CHECK: Section { +#CHECK: Index: 9 +#CHECK: Name: .tdata (71) +#CHECK: Size: 16 +#CHECK: } +#CHECK: Section { +#CHECK: Index: 10 +#CHECK: Name: .tbss (78) +#CHECK: Size: 32 +#CHECK: } + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 488B050000000064C70001000000488B050000000064C70002000000488B050000000064C70003000000488B050000000064C7000400000064C70425000000000500000064C70425000000000600000064C70425000000000700000064C70425000000000800000031C0C3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000003 + Symbol: t0 + Type: R_X86_64_GOTTPOFF + Addend: -4 + - Offset: 0x0000000000000011 + Symbol: t1 + Type: R_X86_64_GOTTPOFF + Addend: -4 + - Offset: 0x000000000000001F + Symbol: t2 + Type: R_X86_64_GOTTPOFF + Addend: -4 + - Offset: 0x000000000000002D + Symbol: t3 + Type: R_X86_64_GOTTPOFF + Addend: -4 + - Offset: 0x000000000000003C + Symbol: t4 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000048 + Symbol: t5 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000054 + Symbol: t6 + Type: R_X86_64_TPOFF32 + - Offset: 0x0000000000000060 + Symbol: t7 + Type: R_X86_64_TPOFF32 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .tdata + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Content: '03000000040000000500000006000000' + - Name: .tbss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ] + AddressAlign: 0x0000000000000004 + Size: 16 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C070890010000140000001C000000000000006B0000000000000000000000 +Symbols: + Local: + - Name: .tbss + Type: STT_TLS + Section: .tbss + - Name: .tdata + Type: STT_TLS + Section: .tdata + - Type: STT_SECTION + Section: .text + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000006B + - Name: t0 + Type: STT_TLS + - Name: t1 + Type: STT_TLS + - Name: t10 + Type: STT_TLS + Section: .tdata + Value: 0x0000000000000008 + Size: 0x0000000000000004 + - Name: t11 + Type: STT_TLS + Section: .tdata + Value: 0x000000000000000C + Size: 0x0000000000000004 + - Name: t2 + Type: STT_TLS + - Name: t3 + Type: STT_TLS + - Name: t4 + Type: STT_TLS + Section: .tbss + Size: 0x0000000000000004 + - Name: t5 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000004 + Size: 0x0000000000000004 + - Name: t6 + Type: STT_TLS + Section: .tbss + Value: 0x0000000000000008 + Size: 0x0000000000000004 + - Name: t7 + Type: STT_TLS + Section: .tbss + Value: 0x000000000000000C + Size: 0x0000000000000004 + - Name: t8 + Type: STT_TLS + Section: .tdata + Size: 0x0000000000000004 + - Name: t9 + Type: STT_TLS + Section: .tdata + Value: 0x0000000000000004 + Size: 0x0000000000000004 +... diff --git a/test/old-elf/tls.test b/test/old-elf/tls.test new file mode 100644 index 000000000000..6fb33941a88c --- /dev/null +++ b/test/old-elf/tls.test @@ -0,0 +1,43 @@ +# REQUIRES: x86 + +# This tests verifies that TLS variables have correct offsets +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 -static \ +RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s -check-prefix=YAML + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 -o %t \ +RUN: --noinhibit-exec -e main -static && llvm-objdump -d %t | FileCheck %s + +// Verify that the TLS accesses have the correct offsets. + +YAML: name: main +YAML: references: +YAML: kind: R_X86_64_TPOFF32 +YAML: offset: 9 +YAML: target: tls1 +YAML: kind: R_X86_64_TPOFF32 +YAML: offset: 17 +YAML: target: tls0 +YAML: kind: R_X86_64_TPOFF32 +YAML: offset: 25 +YAML: target: tls2 + +YAML: name: GOTTPOFF +YAML: kind: R_X86_64_GOTTPOFF +YAML: target: [[GOTNAME:[a-zA-Z0-9_]+]] + +YAML: type: got +YAML: references: +YAML: kind: R_X86_64_TPOFF64 +YAML: target: tls2 + +// main +CHECK: addl %fs:-4 +CHECK: addl %fs:-8 +CHECK: addl %fs:-12 + +// GOTTPOFF +CHECK: movq {{[0-9]+}}(%rip) + +// TLSLD +CHECK: movq %fs:0, %rax +CHECK: leaq -8(%rax), %rax diff --git a/test/old-elf/tlsAddr.test b/test/old-elf/tlsAddr.test new file mode 100644 index 000000000000..bcb089c504ed --- /dev/null +++ b/test/old-elf/tlsAddr.test @@ -0,0 +1,7 @@ +# This tests verifies that TLS variables have correct offsets +# and that TBSS doesn't occupy memory +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tlsAddr.x86-64 -static \ +RUN: -o %t --noinhibit-exec +RUN: llvm-objdump -section-headers %t | FileCheck -check-prefix=CHECKADDR %s + +CHECKADDR: {{[0-9]+}} .data 00000000 0000000000401008 DATA diff --git a/test/old-elf/undef-from-dso-to-main.test b/test/old-elf/undef-from-dso-to-main.test new file mode 100644 index 000000000000..c19a0197061e --- /dev/null +++ b/test/old-elf/undef-from-dso-to-main.test @@ -0,0 +1,52 @@ +# Tests that a reference from a DSO to a regular object +# forces the final executable to export the symbol. + +#RUN: yaml2obj -format=elf %p/Inputs/undef2-so.o.yaml -o=%t.o.so +#RUN: lld -flavor old-gnu -target x86_64 -shared %t.o.so -o %T/libundef2.so +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -L%T -lundef2 -o %t1 +#RUN: llvm-readobj -dyn-symbols %t1 | FileCheck -check-prefix CHECKSYMS %s + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: C3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Size: 4 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: myexportedsymbol + Type: STT_OBJECT + Section: .bss + Size: 0x0000000000000004 + - Name: _start + Section: .text + Size: 0x0000000000000001 + +#CHECKSYMS: myexportedsymbol diff --git a/test/old-elf/undef-from-main-dso.test b/test/old-elf/undef-from-main-dso.test new file mode 100644 index 000000000000..8722a55f672c --- /dev/null +++ b/test/old-elf/undef-from-main-dso.test @@ -0,0 +1,43 @@ +RUN: lld -flavor old-gnu -target x86_64 -e main -o %t -L%p/Inputs \ +RUN: %p/Inputs/undef.o -lundef +RUN: llvm-readobj -relocations -symbols -dyn-symbols %t | FileCheck %s + +RUN: lld -flavor old-gnu -target x86_64 -e main -o %t -L%p/Inputs \ +RUN: %p/Inputs/undef-pc32.o -lundef +RUN: llvm-readobj -relocations -symbols -dyn-symbols %t | FileCheck %s + +# DSO source code: +# int x[2] = { 1, 2 }; +# +# Main binary source code: +# +# extern int x[2]; +# +# int main(void) +# { +# x[0] = 2; +# } +# + +CHECK: Relocations [ +CHECK-NEXT: Section ({{[0-9]+}}) .rela.dyn { +CHECK-NEXT: 0x{{[1-9A-F][0-9A-F]*}} R_X86_64_COPY x 0x0 +CHECK-NEXT: } +CHECK-NEXT: ] + +CHECK: Name: x ({{[0-9]+}} +CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}} +CHECK-NEXT: Size: 8 +CHECK-NEXT: Binding: Global (0x1) +CHECK-NEXT: Type: Object (0x1) +CHECK-NEXT: Other: 0 +CHECK-NEXT: Section: .bss + +CHECK: Name: x@ ({{[0-9]+}} +CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}} +CHECK-NEXT: Size: 8 +CHECK-NEXT: Binding: Global (0x1) +CHECK-NEXT: Type: Object (0x1) +CHECK-NEXT: Other: 0 +CHECK-NEXT: Section: .bss + diff --git a/test/old-elf/weaksym.test b/test/old-elf/weaksym.test new file mode 100644 index 000000000000..59d997edc64c --- /dev/null +++ b/test/old-elf/weaksym.test @@ -0,0 +1,7 @@ +# Tests that a weak reference remains a weak reference, +# even if a shared library defines the symbol weak as well. + +RUN: lld -flavor old-gnu -target x86_64 -shared %p/Inputs/weaksym.o -L%p/Inputs -lweaksym -o %t1 +RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSYMS %s + +CHECKSYMS: w weaksym diff --git a/test/old-elf/wrap.test b/test/old-elf/wrap.test new file mode 100644 index 000000000000..427764970be8 --- /dev/null +++ b/test/old-elf/wrap.test @@ -0,0 +1,276 @@ +# This tests the functionality of using the --wrap option. +# The test case is extracted by compiling and linking the following code. +# +#cat > main.c << \! +#int main() { +# foo(); +# return 0; +#} +#! +# +#cat > wrapfoo.c << \! +#int __wrap_foo() { +# __real_foo(); +# return 0; +#} +#! +# +#cat > realfoo.c << \! +#int foo() { +# return 0; +#} +#! +# +#clang main.c wrapfoo.c realfoo.c -Xlinker --wrap -Xlinker foo +#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.main.o +#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.wrapfoo.o +#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.realfoo.o +#RUN: lld -flavor old-gnu -target x86_64 %t.main.o %t.wrapfoo.o %t.realfoo.o \ +#RUN: --wrap foo --wrap foo --noinhibit-exec --output-filetype=yaml -o %t2.out +#RUN: lld -flavor old-gnu -target x86_64 %t.main.o %t.wrapfoo.o \ +#RUN: --wrap foo --wrap foo --noinhibit-exec --output-filetype=yaml -o %t2.out.undef 2>&1 | \ +#RUN: FileCheck %s -check-prefix=CHECKUNDEF +#CHECKWRAP: - name: main +#CHECKWRAP: references: +#CHECKWRAP: - kind: R_X86_64_PC32 +#CHECKWRAP: target: __wrap_foo +#CHECKWRAP: - name: __wrap_foo +#CHECKWRAP: references: +#CHECKWRAP: - kind: R_X86_64_PC32 +#CHECKWRAP: target: foo +#CHECKUNDEF: Undefined symbol: {{.*}}main.o: foo +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 5031C0E80000000031C05AC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: foo + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000140000001C000000000000000C00000000410E1000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x000000000000000C + - Name: foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 5031C0E80000000031C05AC3 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000004 + Symbol: __real_foo + Type: R_X86_64_PC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000140000001C000000000000000C00000000410E1000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: __wrap_foo + Type: STT_FUNC + Section: .text + Size: 0x000000000000000C + - Name: __real_foo +... +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 31C0C3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000037A5200017810011B0C070890010000140000001C00000000000000030000000000000000000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: foo + Type: STT_FUNC + Section: .text + Size: 0x0000000000000003 +... diff --git a/test/old-elf/x86-64-dynamic-relocs.test b/test/old-elf/x86-64-dynamic-relocs.test new file mode 100644 index 000000000000..c5572d0aa3a3 --- /dev/null +++ b/test/old-elf/x86-64-dynamic-relocs.test @@ -0,0 +1,26 @@ +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/relocs-dynamic.x86-64 \ +RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s + +path: <linker-internal> +defined-atoms: + - name: main + scope: global + content: [ E8, 00, 00, 00, 00, C3 ] + alignment: 16 + section-choice: custom-required + section-name: .text + references: + - kind: R_X86_64_PLT32 + offset: 1 + target: foo + addend: -4 + - name: foo + scope: global + content: [ C3 ] + alignment: 6 mod 16 + section-choice: custom-required + section-name: .text + +# Don't generate a PLT/GOT entry for a PLT32 relocation to a non-shared symbol. +CHECK-NOT: got +CHECK-NOT: stub diff --git a/test/old-elf/x86-64-dynamic.test b/test/old-elf/x86-64-dynamic.test new file mode 100644 index 000000000000..d957e6ee85ee --- /dev/null +++ b/test/old-elf/x86-64-dynamic.test @@ -0,0 +1,79 @@ +# Checks that linking an object file with a shared object creates the necessary +# PLT/GOT Entries +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml -o %t1 --noinhibit-exec +RUN: FileCheck %s < %t1 + +RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared-32s.x86-64 \ +RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml --noinhibit-exec \ +RUN: | FileCheck %s --check-prefix=32S + +CHECK: - name: main +CHECK: scope: global +CHECK: references: +CHECK: - kind: R_X86_64_PC32 +CHECK: offset: 18 +CHECK: target: [[PLTNAME:[-a-zA-Z0-9_]+]] +CHECK: addend: -4 +CHECK: - kind: R_X86_64_GOTPCREL +CHECK: offset: 25 +CHECK: target: [[GOTNAME:[-a-zA-Z0-9_]+]] +CHECK: addend: -4 + + - name: .PLT0 +CHECK: type: stub +CHECK: content: [ FF, 35, 00, 00, 00, 00, FF, 25, 00, 00, 00, 00, +CHECK: 90, 90, 90, 90 ] +CHECK: alignment: 16 +CHECK: section-choice: custom-required +CHECK: section-name: .plt +CHECK: references: +CHECK: - kind: R_X86_64_PC32 +CHECK: offset: 2 + target: __got0 +CHECK: addend: -4 +CHECK: - kind: R_X86_64_PC32 +CHECK: offset: 8 + target: __got1 +CHECK: addend: -4 + - name: [[PLTNAME]] +CHECK: type: stub +CHECK: content: [ FF, 25, 00, 00, 00, 00, 68, 00, 00, 00, 00, E9, +CHECK: 00, 00, 00, 00 ] +CHECK: alignment: 16 +CHECK: section-choice: custom-required +CHECK: section-name: .plt +CHECK: references: +CHECK: - kind: R_X86_64_PC32 +CHECK: offset: 2 + target: __got_foo +CHECK: addend: -4 +CHECK: - kind: LLD_R_X86_64_GOTRELINDEX +CHECK: offset: 7 + target: __got_foo +CHECK: - kind: R_X86_64_PC32 +CHECK: offset: 12 + target: .PLT0 +CHECK: addend: -4 + +// Don't check the GOT and PLT names as they are only present in assert builds. +CHECK: type: got +CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] +CHECK: section-choice: custom-required +CHECK: section-name: .got +CHECK: permissions: rw- +CHECK: references: +CHECK: - kind: R_X86_64_GLOB_DAT +CHECK: offset: 0 +CHECK: target: i + +CHECK:shared-library-atoms: +CHECK: - name: foo +CHECK: load-name: shared.so-x86-64 + +32S: name: main +32S: kind: R_X86_64_PC32 +32S: target: func +32S: kind: R_X86_64_32S +32S: kind: R_X86_64_PC32 +32S: type: stub diff --git a/test/old-elf/x86.test b/test/old-elf/x86.test new file mode 100644 index 000000000000..3bc4a6963a50 --- /dev/null +++ b/test/old-elf/x86.test @@ -0,0 +1,38 @@ +# Source for input file: reloc-xb.x86 +# xb.S: +# .section .text, "ax", @progbits +# .align 0x4 +# .globl _start +# _start: +# .globl back +# back: +# call target +# +# Source for input file: reloc-xt.x86 +# xt.S: +# .section .text, "ax", @progbits +# +# .globl target +# target: +# call back +# +# Assembled with: "as --32" + +RUN: lld -flavor old-gnu -target i386 -e back --output-filetype=yaml %p/Inputs/reloc-xb.x86 %p/Inputs/reloc-xt.x86 | FileCheck %s -check-prefix x86-yaml + +x86-yaml: - name: back +x86-yaml: scope: global +x86-yaml: content: [ E8, FC, FF, FF, FF ] +x86-yaml: references: +x86-yaml: - kind: R_386_PC32 +x86-yaml: offset: 1 +x86-yaml: target: target + +x86-yaml: - name: target +x86-yaml: scope: global +x86-yaml: content: [ E8, FC, FF, FF, FF ] +x86-yaml: references: +x86-yaml: - kind: R_386_PC32 +x86-yaml: offset: 1 +x86-yaml: target: back + diff --git a/test/old-elf/x86_64-kinds.test b/test/old-elf/x86_64-kinds.test new file mode 100644 index 000000000000..111cea53bf0c --- /dev/null +++ b/test/old-elf/x86_64-kinds.test @@ -0,0 +1,23 @@ +REQUIRES: x86 + +RUN: lld -flavor old-gnu -target x86_64-linux -o %t1 %p/Inputs/relocs.x86-64 \ +RUN: -e _start -static +RUN: llvm-objdump -d %t1 | FileCheck %s -check-prefix=RELOCS + +RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -e _start -static \ +RUN: %p/Inputs/relocs.x86-64 | FileCheck %s -check-prefix=X86_64 + +RELOCS: ELF64-x86-64 + +// R_X86_64_32S +RELOCS: c7 04 25 +RELOCS-NOT: 00 00 00 00 +RELOCS: 05 00 00 00 movl + +// R_X86_64_PC32 +RELOCS: e8 +RELOCS-NOT: 00 00 00 00 +RELOCS: callq + +X86_64: R_X86_64_32S +X86_64: R_X86_64_PC32 diff --git a/test/old-elf/zoption_dtflags.test b/test/old-elf/zoption_dtflags.test new file mode 100644 index 000000000000..274981bb1360 --- /dev/null +++ b/test/old-elf/zoption_dtflags.test @@ -0,0 +1,89 @@ +# Test that -z {origin, now} options work. +# +#RUN: yaml2obj -format=elf %s -o=%t.o +#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main -z now -z origin -o %t1 +#RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s +# +#CHECK: 0x000000000000001E FLAGS ORIGIN BIND_NOW +#CHECK: 0x000000006FFFFFFB FLAGS_1 NOW ORIGIN + +--- +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E58B45FC5DC3 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + - Name: .comment + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200 + - Name: .note.GNU-stack + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000008 + Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000900000000410E108602430D06000000 + - Name: .rela.eh_frame + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .eh_frame + Relocations: + - Offset: 0x0000000000000020 + Symbol: .text + Type: R_X86_64_PC32 + - Offset: 0x000000000000003C + Symbol: .text + Type: R_X86_64_PC32 + Addend: 48 +Symbols: + Local: + - Name: local + Type: STT_FUNC + Section: .text + Value: 0x0000000000000030 + Size: 0x0000000000000009 + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + - Name: .comment + Type: STT_SECTION + Section: .comment + - Name: .note.GNU-stack + Type: STT_SECTION + Section: .note.GNU-stack + - Name: .eh_frame + Type: STT_SECTION + Section: .eh_frame + Global: + - Name: main + Type: STT_FUNC + Section: .text + Size: 0x0000000000000024 +... |
