aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorRoger Pau Monne <roger.pau@citrix.com>2023-07-05 14:56:15 -0700
committerFangrui Song <i@maskray.me>2023-07-05 14:56:16 -0700
commit7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0 (patch)
tree420e99ab4cc6f2fbaa3532c92162f34568722461 /lld
parenta1ca3af31eeec61cfb9d619f55b655b0eb0b9494 (diff)
downloadllvm-7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0.zip
llvm-7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0.tar.gz
llvm-7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0.tar.bz2
[lld/elf] support quote usage in section names
Section names used in ELF linker scripts can be quoted, but such quotes must not be propagated to the binary ELF section names. As such strip the quotes from the section names when processing them, and also strip them from linker script functions that take section names as parameters. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D124266
Diffstat (limited to 'lld')
-rw-r--r--lld/ELF/ScriptParser.cpp10
-rw-r--r--lld/test/ELF/linkerscript/section-quotes.test47
2 files changed, 52 insertions, 5 deletions
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 85cee08..1ed5166 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -587,7 +587,7 @@ void ScriptParser::readSections() {
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 @@ Expr ScriptParser::readPrimary() {
};
}
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 @@ Expr ScriptParser::readPrimary() {
};
}
if (tok == "ALIGNOF") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
return [=] {
checkIfExists(*osec, location);
@@ -1466,7 +1466,7 @@ Expr ScriptParser::readPrimary() {
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 @@ Expr ScriptParser::readPrimary() {
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
index 0000000..d50f4496
--- /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");
+}