[PATCH] D113768: [ELF] Do not try to assign a memory region to a non-allocatable section

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 12 06:46:15 PST 2021


ikudrin created this revision.
ikudrin added reviewers: MaskRay, peter.smith.
ikudrin added a project: lld.
Herald added subscribers: arichardson, emaste.
ikudrin requested review of this revision.
Herald added a project: LLVM.

Non-allocatable sections are not part of the memory image of the program, so there is no need to find memory regions for them either matching properties or handling explicit assignments. The early test and return help to simplify `LinkerScript::findMemoryRegion()` a bit.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D113768

Files:
  lld/ELF/LinkerScript.cpp
  lld/test/ELF/linkerscript/memory-nonalloc.test


Index: lld/test/ELF/linkerscript/memory-nonalloc.test
===================================================================
--- /dev/null
+++ lld/test/ELF/linkerscript/memory-nonalloc.test
@@ -0,0 +1,45 @@
+REQUIRES: x86
+
+RUN: split-file %s %ts
+RUN: llvm-mc -filetype=obj -triple=x86_64 %ts/s -o %t.o
+
+## Check that a non-allocatable section is not assigned to a memory region by
+## matching the section/region properties. Previously, that could lead to an
+## "error: section '.nonalloc' will not fit in region 'RAM'".
+
+RUN: ld.lld -o %t -T %ts/t %t.o
+
+## Check that an explicit assignment is ignored for a non-allocatable section.
+## Previously, that also could lead to the same error.
+
+RUN: ld.lld -o %t2 -T %ts/t2 %t.o 2>&1 | FileCheck %s --check-prefix=WARN
+
+WARN: warning: ignoring memory region assignment for non-allocatable section '.nonalloc'
+
+#--- s
+  ## Note: a "writable" section is used because lld does not fully support
+  ## memory region attribute "r" at the moment.
+  .section .nonalloc,"w"
+  .zero 0x1000
+
+#--- t
+MEMORY
+{
+  RAM (rwx) : ORIGIN = 0x8000, LENGTH = 0x100
+}
+
+SECTIONS
+{
+  .nonalloc : { *(.nonalloc) }
+}
+
+#--- t2
+MEMORY
+{
+  RAM (rwx) : ORIGIN = 0x8000, LENGTH = 0x100
+}
+
+SECTIONS
+{
+  .nonalloc : { *(.nonalloc) } > RAM
+}
Index: lld/ELF/LinkerScript.cpp
===================================================================
--- lld/ELF/LinkerScript.cpp
+++ lld/ELF/LinkerScript.cpp
@@ -887,6 +887,14 @@
 // subsequent call of this method.
 std::pair<MemoryRegion *, MemoryRegion *>
 LinkerScript::findMemoryRegion(OutputSection *sec, MemoryRegion *hint) {
+  // Non-allocatable sections are not part of the process image.
+  if (!(sec->flags & SHF_ALLOC)) {
+    if (!sec->memoryRegionName.empty())
+      warn("ignoring memory region assignment for non-allocatable section '" +
+           sec->name + "'");
+    return {nullptr, nullptr};
+  }
+
   // If a memory region name was specified in the output section command,
   // then try to find that region first.
   if (!sec->memoryRegionName.empty()) {
@@ -902,8 +910,8 @@
   if (memoryRegions.empty())
     return {nullptr, nullptr};
 
-  // An allocatable orphan section should continue the previous memory region.
-  if (sec->sectionIndex == UINT32_MAX && (sec->flags & SHF_ALLOC) && hint)
+  // An orphan section should continue the previous memory region.
+  if (sec->sectionIndex == UINT32_MAX && hint)
     return {hint, hint};
 
   // See if a region can be found by matching section flags.
@@ -914,8 +922,7 @@
   }
 
   // Otherwise, no suitable region was found.
-  if (sec->flags & SHF_ALLOC)
-    error("no memory region specified for section '" + sec->name + "'");
+  error("no memory region specified for section '" + sec->name + "'");
   return {nullptr, nullptr};
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113768.386835.patch
Type: text/x-patch
Size: 2806 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211112/ed24b68a/attachment.bin>


More information about the llvm-commits mailing list