1# REQUIRES: x86 2## TYPE=<value> customizes the output section type. 3 4# RUN: rm -rf %t && split-file %s %t 5# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/a.s -o %t/a.o 6# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/mismatch.s -o %t/mismatch.o 7# RUN: ld.lld -T %t/a.lds %t/a.o -o %t/a 8# RUN: llvm-readelf -S %t/a | FileCheck %s 9 10# RUN: ld.lld -r -T %t/a.lds %t/a.o -o %t/a.ro 11# RUN: llvm-readelf -S %t/a.ro | FileCheck %s 12 13# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al 14# CHECK-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0 15# CHECK-NEXT: [ 1] progbits PROGBITS [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 16# CHECK-NEXT: [ 2] note NOTE [[#%x,]] [[#%x,]] 000002 00 A 0 0 1 17# CHECK-NEXT: [ 3] nobits NOBITS [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 18# CHECK-NEXT: [ 4] init_array INIT_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 19# CHECK-NEXT: [ 5] fini_array FINI_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 20# CHECK-NEXT: [ 6] preinit_array PREINIT_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 21# CHECK-NEXT: [ 7] group GROUP [[#%x,]] [[#%x,]] 000004 00 A [[#SYMTAB:]] 0 1 22# CHECK-NEXT: [ 8] expr 0x42: <unknown> [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 23# CHECK: [[[#SYMTAB]]] .symtab SYMTAB 24 25# RUN: not ld.lld -T %t/a.lds %t/a.o %t/mismatch.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR1 26 27# ERR1: error: section type mismatch for progbits 28# ERR1-NEXT: >>> {{.*}}.o:(progbits): SHT_NOTE 29# ERR1-NEXT: >>> output section progbits: SHT_PROGBITS 30# ERR1: error: section type mismatch for expr 31# ERR1-NEXT: >>> {{.*}}.o:(expr): Unknown 32# ERR1-NEXT: >>> output section expr: Unknown 33 34# RUN: ld.lld -T %t/a.lds %t/a.o %t/mismatch.o -o %t/mismatch --noinhibit-exec 35# RUN: llvm-readelf -S %t/mismatch | FileCheck %s --check-prefix=MISMATCH 36 37## Mismatched progbits and expr are changed to SHT_PROGBITS. 38# MISMATCH: progbits PROGBITS 39# MISMATCH: note NOTE 40# MISMATCH: expr 0x42: <unknown> 41 42# RUN: not ld.lld -T %t/unknown1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=UNKNOWN1 43# UNKNOWN1: error: {{.*}}.lds:1: symbol not found: foo 44 45## For a symbol named SHT_*, give a better diagnostic. 46# RUN: not ld.lld -T %t/unknown2.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=UNKNOWN2 47# UNKNOWN2: error: {{.*}}.lds:1: unknown section type SHT_DYNAMIC 48 49# RUN: not ld.lld -T %t/parseerr1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=PARSEERR1 50# PARSEERR1: error: {{.*}}.lds:1: = expected, but got ) 51 52#--- a.s 53.globl _start, myinit 54_start: 55 ret 56myinit: 57 ret 58 59## Compatible with TYPE = SHT_NOTE below. 60.section note,"a",@note 61.byte 0 62 63#--- a.lds 64SECTIONS { 65 progbits (TYPE=SHT_PROGBITS) : { BYTE(1) } 66 note (TYPE = SHT_NOTE) : { BYTE(7) *(note) } 67 nobits ( TYPE=SHT_NOBITS) : { BYTE(8) } 68 init_array (TYPE=SHT_INIT_ARRAY ) : { QUAD(myinit) } 69 fini_array (TYPE=SHT_FINI_ARRAY) : { QUAD(15) } 70 preinit_array (TYPE=SHT_PREINIT_ARRAY) : { QUAD(16) } 71 group (TYPE=17) : { LONG(17) } 72 expr (TYPE=0x41+1) : { BYTE(0x42) *(expr) } 73} 74 75#--- mismatch.s 76.section progbits,"a",@note 77.byte 0 78 79.section expr,"a",@12345 80.byte 0 81 82#--- unknown1.lds 83SECTIONS { err (TYPE=foo) : {} } 84 85#--- unknown2.lds 86SECTIONS { err (TYPE=SHT_DYNAMIC) : {} } 87 88#--- parseerr1.lds 89SECTIONS { err (TYPE) : {} } 90