| # 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; | |
| } |