1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
# REQUIRES: x86
# RUN: rm -rf %t && split-file --leading-lines %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
## There is no main linker script. OVERWRITE_SECTIONS defines output section
## descriptions and follows the usual orphan placement rules.
# RUN: ld.lld %t/overwrite1.lds %t/a.o -o %t1
# RUN: llvm-readelf -S %t1 | FileCheck %s --check-prefix=CHECK1
# CHECK1: Name Type Address Off Size ES Flg Lk Inf Al
# CHECK1-NEXT: NULL [[#%x,]] [[#%x,]] 000000
# CHECK1-NEXT: .text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 4
# CHECK1-NEXT: .foo.text PROGBITS [[#%x,]] [[#%x,]] 000002 00 WAX 0 0 8
# CHECK1-NEXT: .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK1-NEXT: .comment PROGBITS {{.*}}
# RUN: ld.lld %t/overwrite1.lds %t/overwrite1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=WARN1
# WARN1: warning: OVERWRITE_SECTIONS specifies duplicate .foo.text
## The output section description order (.foo.data .foo.text) does not affect
## the output order.
# RUN: ld.lld %t/overwrite2.lds %t/a.o -o %t2
# RUN: llvm-readelf -S -s %t2 | FileCheck %s --check-prefix=CHECK2
# CHECK2: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# CHECK2-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000
# CHECK2-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 4
# CHECK2-NEXT: [ 2] .foo.text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 1
# CHECK2-NEXT: [ 3] .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK2-NEXT: [ 4] .foo.data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK2-NEXT: [ 5] .comment PROGBITS {{.*}}
# CHECK2: Num: Value Size Type Bind Vis Ndx Name
# CHECK2: [[#]]: [[#%x,ADDR:]] 0 NOTYPE GLOBAL DEFAULT 4 FOO_DATA_START
# CHECK2-NEXT: [[#]]: {{0*}}[[#ADDR+1]] 0 NOTYPE GLOBAL DEFAULT 4 FOO_DATA_END
# CHECK2-NEXT: [[#]]: [[#%x,ADDR:]] 0 NOTYPE GLOBAL DEFAULT 2 FOO_TEXT_START
# CHECK2-NEXT: [[#]]: {{0*}}[[#ADDR+1]] 0 NOTYPE GLOBAL DEFAULT 2 FOO_TEXT_END
## OVERWRITE_SECTIONS is processed before the main script. The main script
## specifies the output order. The alignment of .foo.text is specified by
## OVERWRITE_SECTIONS insteaad of the main script.
# RUN: ld.lld -T %t/main.lds %t/overwrite1.lds %t/a.o -o %t3 2>&1 | count 0
# RUN: llvm-readelf -S %t3 | FileCheck %s --check-prefix=CHECK3
# RUN: ld.lld %t/overwrite1.lds -T %t/main.lds %t/a.o -o %t3 2>&1 | count 0
# RUN: llvm-readelf -S %t3 | FileCheck %s --check-prefix=CHECK3
# CHECK3: Name Type Address Off Size ES Flg Lk Inf Al
# CHECK3-NEXT: NULL [[#%x,]] [[#%x,]] 000000
# CHECK3-NEXT: .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK3-NEXT: .text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 4
# CHECK3-NEXT: .foo.text PROGBITS [[#%x,]] [[#%x,]] 000002 00 WAX 0 0 8
# CHECK3-NEXT: .comment PROGBITS {{.*}}
# RUN: ld.lld -T %t/main.lds %t/overwrite1.lds %t/a.o -o %t3 --verbose 2>&1 | FileCheck %s --check-prefix=VERBOSE3
# VERBOSE3: {{.*}}overwrite1.lds:[[#]] overwrites .foo.text
## If INSERT commands are specified, INSERT commands are processed after overwrite sections.
# RUN: ld.lld %t/insert.lds %t/overwrite2.lds %t/a.o -o %t4
# RUN: llvm-readelf -S -s %t4 | FileCheck %s --check-prefix=CHECK4
# CHECK4: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# CHECK4-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000
# CHECK4-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 4
# CHECK4-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK4-NEXT: [ 3] .foo.data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK4-NEXT: [ 4] .foo.text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 1
# CHECK4-NEXT: [ 5] .comment PROGBITS {{.*}}
# CHECK4: Num: Value Size Type Bind Vis Ndx Name
# CHECK4: [[#]]: [[#%x,ADDR:]] 0 NOTYPE GLOBAL DEFAULT 4 FOO_TEXT_START
# CHECK4-NEXT: [[#]]: {{0*}}[[#ADDR+1]] 0 NOTYPE GLOBAL DEFAULT 4 FOO_TEXT_END
# CHECK4-NEXT: [[#]]: [[#%x,ADDR:]] 0 NOTYPE GLOBAL DEFAULT 3 FOO_DATA_START
# CHECK4-NEXT: [[#]]: {{0*}}[[#ADDR+1]] 0 NOTYPE GLOBAL DEFAULT 3 FOO_DATA_END
## OVERWRITE_SECTIONS describes a section used as an anchor of an insert command.
## Place .foo.data as an orphan, then insert .foo.text after .foo.data.
# RUN: ld.lld %t/insert.lds %t/overwrite3.lds %t/a.o -o %t5
# RUN: llvm-readelf -S -s %t4 | FileCheck %s --check-prefix=CHECK5
# CHECK5: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
# CHECK5-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000
# CHECK5-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 4
# CHECK5-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK5-NEXT: [ 3] .foo.data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
# CHECK5-NEXT: [ 4] .foo.text PROGBITS [[#%x,]] [[#%x,]] 000001 00 AX 0 0 1
# CHECK5-NEXT: [ 5] .comment PROGBITS {{.*}}
#--- a.s
.globl _start
_start:
.section .foo.text,"ax"; .byte 1
.section .foo.data,"aw"; .byte 2
.section .text.1,"ax"; .byte 3
.section .data.1,"aw"; .byte 4
#--- main.lds
SECTIONS {
.data : { *(.data*) }
.foo.data : { *(.foo.data) }
.text : { *(.text*) }
.foo.text : ALIGN(16) { *(.foo.text) }
}
#--- overwrite1.lds
OVERWRITE_SECTIONS {
.foo.text : ALIGN(8) { *(.foo.data .foo.text) }
}
#--- overwrite2.lds
OVERWRITE_SECTIONS {
.foo.data : { FOO_DATA_START = .; *(.foo.data) FOO_DATA_END = .; }
.foo.text : { FOO_TEXT_START = .; *(.foo.text) FOO_TEXT_END = .; }
}
#--- overwrite3.lds
OVERWRITE_SECTIONS {
.foo.data : {}
}
#--- insert.lds
SECTIONS { .foo.text : {} } INSERT AFTER .foo.data;
#--- err1.lds
## TODO Fix the diagnostic 'malformed number'
# RUN: not ld.lld %t/err1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s -DFILE=%t/err1.lds --check-prefix=ERR1
# ERR1: error: [[FILE]]:[[#@LINE+2]]: malformed number: =
OVERWRITE_SECTIONS {
A = 1;
}
|