[LinkerScript] Adding test cases for SECTIONS semantics
llvm-svn: 232404
This commit is contained in:
parent
4da7a29a11
commit
8dd680dcb1
|
@ -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: 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
|
||||||
|
Content: ''
|
||||||
|
- 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
|
||||||
|
...
|
|
@ -0,0 +1,89 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
Content: ''
|
||||||
|
- 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
|
||||||
|
...
|
|
@ -0,0 +1,52 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
Content: ''
|
||||||
|
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
|
||||||
|
...
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
|
@ -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 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
|
||||||
|
*/
|
Loading…
Reference in New Issue