| # REQUIRES: x86 | |
| # RUN: rm -rf %t && split-file %s %t && cd %t | |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o | |
| # RUN: ld.lld --default-script=def.t b.t -T a.t a.o -o out | |
| # RUN: llvm-readelf -Ss out | FileCheck %s | |
| # CHECK: Name | |
| # CHECK: .foo2 | |
| # CHECK-NEXT: .foo0 | |
| # CHECK-NEXT: .foo1 | |
| # CHECK: 1: 000000000000000c 0 NOTYPE GLOBAL DEFAULT 4 _start | |
| # CHECK-NEXT: 2: 000000000000002a 0 NOTYPE GLOBAL DEFAULT ABS b | |
| # CHECK-NEXT: 3: 000000000000002a 0 NOTYPE GLOBAL DEFAULT ABS a | |
| # CHECK-EMPTY: | |
| ## In the absence of --script options, the default linker script is read. | |
| # RUN: ld.lld --default-script def.t b.t a.o -o out1 | |
| # RUN: llvm-readelf -Ss out1 | FileCheck %s --check-prefix=CHECK1 | |
| # RUN: ld.lld -dT def.t b.t a.o -o out1a && cmp out1 out1a | |
| ## If multiple -dT options are specified, the last -dT wins. | |
| # RUN: ld.lld -dT a.t -dT def.t b.t a.o -o out1a && cmp out1 out1a | |
| # RUN: mkdir d && cp def.t d/default.t | |
| # RUN: ld.lld -L d -dT default.t b.t a.o -o out1a && cmp out1 out1a | |
| # CHECK1: Name | |
| # CHECK1: .foo2 | |
| # CHECK1-NEXT: .foo1 | |
| # CHECK1-NEXT: .foo0 | |
| # CHECK1: 1: 000000000000000c 0 NOTYPE GLOBAL DEFAULT 4 _start | |
| # CHECK1-NEXT: 2: 000000000000002a 0 NOTYPE GLOBAL DEFAULT ABS b | |
| # CHECK1-NEXT: 3: 000000000000002a 0 NOTYPE GLOBAL DEFAULT ABS def | |
| # CHECK1-EMPTY: | |
| # RUN: not ld.lld --default-script not-exist.t b.t -T a.t a.o 2>&1 | FileCheck %s --check-prefix=ERR | |
| # ERR: error: cannot find linker script not-exist.t | |
| #--- a.s | |
| .globl _start | |
| _start: | |
| .section .foo0,"a"; .long 0 | |
| .section .foo1,"a"; .long 0 | |
| .section .foo2,"a"; .long 0 | |
| #--- a.t | |
| a = 42; | |
| SECTIONS { | |
| .foo2 : {} | |
| .foo0 : {} | |
| .foo1 : {} | |
| } | |
| #--- b.t | |
| b = 42; | |
| #--- def.t | |
| def = 42; | |
| SECTIONS { | |
| .foo2 : {} | |
| .foo1 : {} | |
| .foo0 : {} | |
| } |