[PATCH] D124266: [lld/elf] fix quote usage in section names
Roger via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 22 08:04:59 PDT 2022
royger created this revision.
royger added a reviewer: ruiu.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: MaskRay.
Herald added a project: All.
royger requested review of this revision.
Herald added subscribers: llvm-commits, StephenFan.
Herald added a project: LLVM.
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D124266
Files:
lld/ELF/ScriptParser.cpp
lld/test/ELF/linkerscript/section-quotes.test
Index: lld/test/ELF/linkerscript/section-quotes.test
===================================================================
--- /dev/null
+++ lld/test/ELF/linkerscript/section-quotes.test
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+## Test quotation when specifying section names.
+
+# RUN: echo '.globl _start; _start: ret; \
+# RUN: .data; .byte 0; \
+# RUN: .bss; .byte 0' | \
+# RUN: llvm-mc -filetype=obj -triple=x86_64 - -o %t.o
+# RUN: ld.lld -T %s %t.o -o %t 2>&1
+# RUN: llvm-readelf -S %t | 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-NEXT: .bss {{.*}}
+
+SECTIONS {
+ ".text" : AT(ADDR(".text")) {
+ LONG (ALIGNOF(".text"))
+ LONG (LOADADDR(".text"))
+ *(.text)
+ }
+ text_size = SIZEOF(".text");
+ .data : AT(ADDR(".data")) {
+ LONG (ALIGNOF(".data"))
+ LONG (LOADADDR(".data"))
+ *(.data)
+ }
+ data_size = SIZEOF(".data");
+ ".bss" : AT(ADDR(.bss)) {
+ LONG (ALIGNOF(.bss))
+ LONG (LOADADDR(.bss))
+ *(.bss)
+ }
+ bss_size = SIZEOF(.bss);
+}
Index: lld/ELF/ScriptParser.cpp
===================================================================
--- lld/ELF/ScriptParser.cpp
+++ lld/ELF/ScriptParser.cpp
@@ -581,7 +581,7 @@
if (SectionCommand *cmd = readAssignment(tok))
v.push_back(cmd);
else
- v.push_back(readOutputSectionDescription(tok));
+ v.push_back(readOutputSectionDescription(unquote(tok)));
}
script->sectionCommands.insert(script->sectionCommands.end(), v.begin(),
v.end());
@@ -1316,7 +1316,7 @@
};
}
if (tok == "ADDR") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
osec->usedInExpression = true;
return [=]() -> ExprValue {
@@ -1341,7 +1341,7 @@
};
}
if (tok == "ALIGNOF") {
- StringRef name = readParenLiteral();
+ StringRef name = unquote(readParenLiteral());
OutputSection *osec = &script->getOrCreateOutputSection(name)->osec;
return [=] {
checkIfExists(*osec, location);
@@ -1396,7 +1396,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 [=] {
@@ -1440,7 +1440,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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124266.424482.patch
Type: text/x-patch
Size: 3043 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220422/3306caf4/attachment.bin>
More information about the llvm-commits
mailing list