forked from OSchip/llvm-project
[LLD][ELF] - Linkerscript: fix FILL() expressions handling.
D64130 introduced a bug described in the following message: https://reviews.llvm.org/D64130#1571560 The problem can happen with the following script: SECTIONS { .out : { ... FILL(0x10101010) *(.aaa) ... } The current code tries to read (0x10101010) as an expression and does not break when meets *, what results in a script parsing error. In this patch, I verify that FILL command's expression always wrapped in (). And at the same time =<fillexp> expression can be both wrapped or unwrapped. I checked it matches to bfd/gold. Differential revision: https://reviews.llvm.org/D64476 llvm-svn: 365635
This commit is contained in:
parent
d5214dfa7b
commit
c44a23f8f4
|
@ -828,7 +828,9 @@ OutputSection *ScriptParser::readOutputSectionDescription(StringRef outSec) {
|
|||
// We handle the FILL command as an alias for =fillexp section attribute,
|
||||
// which is different from what GNU linkers do.
|
||||
// https://sourceware.org/binutils/docs/ld/Output-Section-Data.html
|
||||
expect("(");
|
||||
cmd->filler = readFill();
|
||||
expect(")");
|
||||
} else if (tok == "SORT") {
|
||||
readSort();
|
||||
} else if (tok == "INCLUDE") {
|
||||
|
|
|
@ -7,6 +7,7 @@ SECTIONS {
|
|||
.out : {
|
||||
FILL(0x11111111)
|
||||
. += 2;
|
||||
FILL(0x10101010)
|
||||
*(.aaa)
|
||||
. += 4;
|
||||
*(.bbb)
|
||||
|
@ -18,3 +19,7 @@ SECTIONS {
|
|||
|
||||
# CHECK: Contents of section .out:
|
||||
# CHECK-NEXT: 2222aa22 222222bb 22222222 22222222
|
||||
|
||||
# RUN: echo 'SECTIONS { .out : { FILL 0x11111111 } }' > %t.script
|
||||
# RUN: not ld.lld -o /dev/null --script %t.script 2>&1 | FileCheck %s --check-prefix=ERR
|
||||
# ERR: ( expected, but got 0x11111111
|
||||
|
|
|
@ -7,11 +7,16 @@
|
|||
# RUN: llvm-objdump -s %t.out | FileCheck -check-prefix=YES %s
|
||||
# YES: 66000011 22000011 22000011 22000011
|
||||
|
||||
# RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =0x1100+0x22 }" > %t.script
|
||||
# RUN: ld.lld -o %t.out --script %t.script %t
|
||||
# RUN: llvm-objdump -s %t.out | FileCheck -check-prefix=YES2 %s
|
||||
# YES2: 66000011 22000011 22000011 22000011
|
||||
|
||||
## Confirming that address was correct:
|
||||
# RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =0x99887766 }" > %t.script
|
||||
# RUN: ld.lld -o %t.out --script %t.script %t
|
||||
# RUN: llvm-objdump -s %t.out | FileCheck -check-prefix=YES2 %s
|
||||
# YES2: 66998877 66998877 66998877 66998877
|
||||
# RUN: llvm-objdump -s %t.out | FileCheck -check-prefix=YES3 %s
|
||||
# YES3: 66998877 66998877 66998877 66998877
|
||||
|
||||
## Default padding value is 0x00:
|
||||
# RUN: echo "SECTIONS { .mysec : { *(.mysec*) } }" > %t.script
|
||||
|
@ -51,7 +56,7 @@
|
|||
# RUN: ld.lld -o %t.out --script %t.script %t
|
||||
# RUN: llvm-objdump -s %t.out | FileCheck -check-prefix=YES %s
|
||||
|
||||
## Check we report an error if expression value is larger that 32-bits.
|
||||
## Check we report an error if expression value is larger than 32-bits.
|
||||
# RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =(0x11 << 32) }" > %t.script
|
||||
# RUN: not ld.lld -o %t.out --script %t.script %t 2>&1 | FileCheck --check-prefix=ERR3 %s
|
||||
# ERR3: filler expression result does not fit 32-bit: 0x1100000000
|
||||
|
|
Loading…
Reference in New Issue