[lld] 7cab385 - [lld/elf] support quote usage in section names

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 5 14:56:19 PDT 2023


Author: Roger Pau Monne
Date: 2023-07-05T14:56:16-07:00
New Revision: 7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0

URL: https://github.com/llvm/llvm-project/commit/7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0
DIFF: https://github.com/llvm/llvm-project/commit/7cab385a8f4af4ad9bae712bbd33817ff0cdf5d0.diff

LOG: [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

Added: 
    lld/test/ELF/linkerscript/section-quotes.test

Modified: 
    lld/ELF/ScriptParser.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 85cee08999cd3a..1ed516637269ba 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 00000000000000..d50f4496aa4c76
--- /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");
+}


        


More information about the llvm-commits mailing list