diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -587,7 +587,7 @@ if (SectionCommand *cmd = readAssignment(tok)) v.push_back(cmd); else - v.push_back(readOutputSectionDescription(tok)); + v.push_back(readOutputSectionDescription(unquote(tok))); } // If DATA_SEGMENT_RELRO_END is absent, for sections after DATA_SEGMENT_ALIGN, @@ -1383,7 +1383,7 @@ }; } if (tok == "ADDR") { - StringRef name = readParenLiteral(); + StringRef name = unquote(readParenLiteral()); OutputSection *osec = &script->getOrCreateOutputSection(name)->osec; osec->usedInExpression = true; return [=]() -> ExprValue { @@ -1408,7 +1408,7 @@ }; } if (tok == "ALIGNOF") { - StringRef name = readParenLiteral(); + StringRef name = unquote(readParenLiteral()); OutputSection *osec = &script->getOrCreateOutputSection(name)->osec; return [=] { checkIfExists(*osec, location); @@ -1466,7 +1466,7 @@ return script->memoryRegions[name]->length; } if (tok == "LOADADDR") { - StringRef name = readParenLiteral(); + StringRef name = unquote(readParenLiteral()); OutputSection *osec = &script->getOrCreateOutputSection(name)->osec; osec->usedInExpression = true; return [=] { @@ -1510,7 +1510,7 @@ return [=] { return e(); }; } if (tok == "SIZEOF") { - StringRef name = readParenLiteral(); + StringRef name = unquote(readParenLiteral()); OutputSection *cmd = &script->getOrCreateOutputSection(name)->osec; // Linker script does not create an output section if its content is empty. // We want to allow SIZEOF(.foo) where .foo is a section which happened to diff --git a/lld/test/ELF/linkerscript/section-quotes.test b/lld/test/ELF/linkerscript/section-quotes.test new file mode 100644 --- /dev/null +++ b/lld/test/ELF/linkerscript/section-quotes.test @@ -0,0 +1,47 @@ +# REQUIRES: x86 +## Test quotation when specifying section names. + +# 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 -T a.t a.o +# RUN: llvm-readelf -S -s a.out | FileCheck %s + +# CHECK: Name Type Address Off Size ES Flg Lk Inf Al +# CHECK-NEXT: NULL 0000000000000000 000000 000000 00 0 0 0 +# CHECK-NEXT: .text {{.*}} +# CHECK-NEXT: .data {{.*}} +# CHECK: Num: Value Size Type Bind Vis Ndx Name +# CHECK-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +# CHECK-NEXT: 1: 0000000000000009 0 NOTYPE GLOBAL DEFAULT ABS text_size +# CHECK-NEXT: 2: 0000000000000009 0 NOTYPE GLOBAL DEFAULT ABS data_size + +#--- a.s + .text + nop + + .data + .byte 0 + +#--- a.t +SECTIONS { + ## Check quoted section names are accepted and quotes are removed in the + ## output binary section name. + ## + ## Also check that functions taking a section name as parameter work correctly + ## when quoted section names are provided as inputs. + ".text" : AT(ADDR(".text")) { + LONG (ALIGNOF(".text")) + LONG (LOADADDR(".text")) + *(.text) + } + text_size = SIZEOF(".text"); + + ## Check that functions that take a section name can correctly match a quoted + ## section name input parameter against a non-quoted section definition. + .data : AT(ADDR(".data")) { + LONG (ALIGNOF(".data")) + LONG (LOADADDR(".data")) + *(.data) + } + data_size = SIZEOF(".data"); +}