| # REQUIRES: x86 |
| ## TYPE=<value> customizes the output section type. |
| |
| # RUN: rm -rf %t && split-file %s %t |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/a.s -o %t/a.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/mismatch.s -o %t/mismatch.o |
| # RUN: ld.lld -T %t/a.lds %t/a.o -o %t/a |
| # RUN: llvm-readelf -S %t/a | FileCheck %s |
| |
| # RUN: ld.lld -r -T %t/a.lds %t/a.o -o %t/a.ro |
| # RUN: llvm-readelf -S %t/a.ro | FileCheck %s |
| |
| # CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al |
| # CHECK-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0 |
| # CHECK-NEXT: [ 1] progbits PROGBITS [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 |
| # CHECK-NEXT: [ 2] note NOTE [[#%x,]] [[#%x,]] 000002 00 A 0 0 1 |
| # CHECK-NEXT: [ 3] nobits NOBITS [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 |
| # CHECK-NEXT: [ 4] init_array INIT_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 |
| # CHECK-NEXT: [ 5] fini_array FINI_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 |
| # CHECK-NEXT: [ 6] preinit_array PREINIT_ARRAY [[#%x,]] [[#%x,]] 000008 00 A 0 0 1 |
| # CHECK-NEXT: [ 7] group GROUP [[#%x,]] [[#%x,]] 000004 00 A [[#SYMTAB:]] 0 1 |
| # CHECK-NEXT: [ 8] expr 0x42: <unknown> [[#%x,]] [[#%x,]] 000001 00 A 0 0 1 |
| # CHECK: [[[#SYMTAB]]] .symtab SYMTAB |
| |
| # RUN: not ld.lld -T %t/a.lds %t/a.o %t/mismatch.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR1 |
| |
| # ERR1: error: section type mismatch for progbits |
| # ERR1-NEXT: >>> {{.*}}.o:(progbits): SHT_NOTE |
| # ERR1-NEXT: >>> output section progbits: SHT_PROGBITS |
| # ERR1: error: section type mismatch for expr |
| # ERR1-NEXT: >>> {{.*}}.o:(expr): Unknown |
| # ERR1-NEXT: >>> output section expr: Unknown |
| |
| # RUN: ld.lld -T %t/a.lds %t/a.o %t/mismatch.o -o %t/mismatch --noinhibit-exec |
| # RUN: llvm-readelf -S %t/mismatch | FileCheck %s --check-prefix=MISMATCH |
| |
| ## Mismatched progbits and expr are changed to SHT_PROGBITS. |
| # MISMATCH: progbits PROGBITS |
| # MISMATCH: note NOTE |
| # MISMATCH: expr 0x42: <unknown> |
| |
| # RUN: not ld.lld -T %t/unknown1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=UNKNOWN1 |
| # UNKNOWN1: error: {{.*}}.lds:1: symbol not found: foo |
| |
| ## For a symbol named SHT_*, give a better diagnostic. |
| # RUN: not ld.lld -T %t/unknown2.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=UNKNOWN2 |
| # UNKNOWN2: error: {{.*}}.lds:1: unknown section type SHT_DYNAMIC |
| |
| # RUN: not ld.lld -T %t/parseerr1.lds %t/a.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=PARSEERR1 |
| # PARSEERR1: error: {{.*}}.lds:1: = expected, but got ) |
| |
| #--- a.s |
| .globl _start, myinit |
| _start: |
| ret |
| myinit: |
| ret |
| |
| ## Compatible with TYPE = SHT_NOTE below. |
| .section note,"a",@note |
| .byte 0 |
| |
| #--- a.lds |
| SECTIONS { |
| progbits (TYPE=SHT_PROGBITS) : { BYTE(1) } |
| note (TYPE = SHT_NOTE) : { BYTE(7) *(note) } |
| nobits ( TYPE=SHT_NOBITS) : { BYTE(8) } |
| init_array (TYPE=SHT_INIT_ARRAY ) : { QUAD(myinit) } |
| fini_array (TYPE=SHT_FINI_ARRAY) : { QUAD(15) } |
| preinit_array (TYPE=SHT_PREINIT_ARRAY) : { QUAD(16) } |
| group (TYPE=17) : { LONG(17) } |
| expr (TYPE=0x41+1) : { BYTE(0x42) *(expr) } |
| } |
| |
| #--- mismatch.s |
| .section progbits,"a",@note |
| .byte 0 |
| |
| .section expr,"a",@0x60000000 |
| .byte 0 |
| |
| #--- unknown1.lds |
| SECTIONS { err (TYPE=foo) : {} } |
| |
| #--- unknown2.lds |
| SECTIONS { err (TYPE=SHT_DYNAMIC) : {} } |
| |
| #--- parseerr1.lds |
| SECTIONS { err (TYPE) : {} } |