[lld] [lld][ELF] Allow `.data.rel.ro.unlikely` to be RELRO (PR #148920)

Mingming Liu via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 18 15:54:29 PDT 2025


https://github.com/mingmingl-llvm updated https://github.com/llvm/llvm-project/pull/148920

>From 00b0ddb3aff9dde6ad9857e2eae55783c33c0b2a Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Mon, 14 Jul 2025 23:55:11 -0700
Subject: [PATCH 1/5] allow data.rel.ro.unlikely as an relro section

---
 lld/ELF/Writer.cpp                 |  6 ++--
 lld/test/ELF/relro-data-unlikely.s | 50 ++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100644 lld/test/ELF/relro-data-unlikely.s

diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 15909daf51ab6..dc7f620b9170e 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -629,9 +629,9 @@ static bool isRelroSection(Ctx &ctx, const OutputSection *sec) {
   // magic section names.
   StringRef s = sec->name;
 
-  bool abiAgnostic = s == ".data.rel.ro" || s == ".bss.rel.ro" ||
-                     s == ".ctors" || s == ".dtors" || s == ".jcr" ||
-                     s == ".eh_frame" || s == ".fini_array" ||
+  bool abiAgnostic = s == ".data.rel.ro" || s == ".data.rel.ro.unlikely" ||
+                     s == ".bss.rel.ro" || s == ".ctors" || s == ".dtors" ||
+                     s == ".jcr" || s == ".eh_frame" || s == ".fini_array" ||
                      s == ".init_array" || s == ".preinit_array";
 
   bool abiSpecific =
diff --git a/lld/test/ELF/relro-data-unlikely.s b/lld/test/ELF/relro-data-unlikely.s
new file mode 100644
index 0000000000000..951ed59fb0ef2
--- /dev/null
+++ b/lld/test/ELF/relro-data-unlikely.s
@@ -0,0 +1,50 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+
+# RUN: echo "SECTIONS { \
+# RUN:  .data.rel.ro : { .data.rel.ro } \
+# RUN:  .data.rel.ro.unlikely : { *(.data.rel.ro.unlikely) } \
+# RUN: } INSERT AFTER .text " > %t.script
+
+# RUN: ld.lld --script=%t.script %t.o -o %t
+# RUN: llvm-readelf -l %t | FileCheck --check-prefix=SEG %s
+# RUN: llvm-readelf -S %t | FileCheck %s
+
+# There are 2 RW PT_LOAD segments. p_offset p_vaddr p_paddr p_filesz of the first
+# should match PT_GNU_RELRO.
+# The .data.rel.ro.unlikely section is in PT_GNU_RELRO segment.
+
+#           Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
+# SEG:      LOAD           0x0001c8 0x00000000002011c8 0x00000000002011c8 0x000001 0x000001 R E 0x1000
+# SEG-NEXT: LOAD           0x0001c9 0x00000000002021c9 0x00000000002021c9 0x001001 0x001e37 RW  0x1000
+# SEG-NEXT: LOAD           0x0011ca 0x00000000002041ca 0x00000000002041ca 0x000001 0x000002 RW  0x1000
+# SEG-NEXT: GNU_RELRO      0x0001c9 0x00000000002021c9 0x00000000002021c9 0x001001 0x001e37 R   0x1
+# SEG-NEXT: GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x0
+
+# SEG:      .text
+# SEG-NEXT: .data.rel.ro .data.rel.ro.unlikely .relro_padding
+# SEG-NEXT: .data .bss
+
+#        [Nr] Name                    Type            Address          Off    Size
+# CHECK:      .data.rel.ro            PROGBITS        00000000002021c9 0001c9 000001
+# CHECK-NEXT: .data.rel.ro.unlikely   PROGBITS        00000000002021ca 0001ca 001000
+# CHECK-NEXT: .relro_padding          NOBITS          00000000002031ca 0011ca 000e36
+# CHECK-NEXT: .data                   PROGBITS        00000000002041ca 0011ca 000001
+# CHECK-NEXT: .bss                    NOBITS          00000000002041cb 0011cb 000001
+
+.globl _start
+_start:
+  ret
+
+
+.section .data.rel.ro, "aw"
+.space 1
+
+.section .data.rel.ro.unlikely, "aw"
+.space 4096
+
+.section .data, "aw"
+.space 1
+
+.section .bss, "aw"
+.space 1

>From 9cdf86dca74a7341693bb2ad58ba818335765add Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Tue, 15 Jul 2025 16:48:03 -0700
Subject: [PATCH 2/5] regard both .hot and .unlikely as section suffix if lld
 option keep-data-section-prefix is true

---
 lld/ELF/Config.h                   |  1 +
 lld/ELF/Driver.cpp                 |  2 ++
 lld/ELF/Writer.cpp                 | 22 +++++++++++++++++++---
 lld/test/ELF/relro-data-unlikely.s |  2 +-
 4 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 4c771e47a0e72..ae7de6417c3b9 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -405,6 +405,7 @@ struct Config {
   bool zInitfirst;
   bool zInterpose;
   bool zKeepTextSectionPrefix;
+  bool zKeepDataSectionPrefix;
   bool zLrodataAfterBss;
   bool zNoBtCfi;
   bool zNodefaultlib;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index a194ae71d559a..16ef4e7b0aeea 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1627,6 +1627,8 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.zInterpose = hasZOption(args, "interpose");
   ctx.arg.zKeepTextSectionPrefix = getZFlag(
       args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
+  ctx.arg.zKeepDataSectionPrefix = getZFlag(
+      args, "keep-data-section-prefix", "nokeep-data-section-prefix", false);
   ctx.arg.zLrodataAfterBss =
       getZFlag(args, "lrodata-after-bss", "nolrodata-after-bss", false);
   ctx.arg.zNoBtCfi = hasZOption(args, "nobtcfi");
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index dc7f620b9170e..dad072a8d2df5 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -553,6 +553,22 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
   }
 }
 
+// Returns true if the section is a data section that's read only and
+// relocatable.
+static bool isRelRoDataSection(Ctx &ctx, StringRef SectionName) {
+  // If -z keep-data-section-prefix is given, '<section>.hot' and
+  // '<section>.unlikely' is considered a split of '<section>' based on hotness.
+  // They should share the same section attributes.
+  if (ctx.arg.zKeepDataSectionPrefix) {
+    if (SectionName.ends_with(".hot"))
+      SectionName = SectionName.drop_back(4);
+    else if (SectionName.ends_with(".unlikely"))
+      SectionName = SectionName.drop_back(9);
+  }
+
+  return SectionName == ".data.rel.ro";
+}
+
 // Today's loaders have a feature to make segments read-only after
 // processing dynamic relocations to enhance security. PT_GNU_RELRO
 // is defined for that.
@@ -629,9 +645,9 @@ static bool isRelroSection(Ctx &ctx, const OutputSection *sec) {
   // magic section names.
   StringRef s = sec->name;
 
-  bool abiAgnostic = s == ".data.rel.ro" || s == ".data.rel.ro.unlikely" ||
-                     s == ".bss.rel.ro" || s == ".ctors" || s == ".dtors" ||
-                     s == ".jcr" || s == ".eh_frame" || s == ".fini_array" ||
+  bool abiAgnostic = isRelRoDataSection(ctx, s) || s == ".bss.rel.ro" ||
+                     s == ".ctors" || s == ".dtors" || s == ".jcr" ||
+                     s == ".eh_frame" || s == ".fini_array" ||
                      s == ".init_array" || s == ".preinit_array";
 
   bool abiSpecific =
diff --git a/lld/test/ELF/relro-data-unlikely.s b/lld/test/ELF/relro-data-unlikely.s
index 951ed59fb0ef2..981b30a42bc91 100644
--- a/lld/test/ELF/relro-data-unlikely.s
+++ b/lld/test/ELF/relro-data-unlikely.s
@@ -6,7 +6,7 @@
 # RUN:  .data.rel.ro.unlikely : { *(.data.rel.ro.unlikely) } \
 # RUN: } INSERT AFTER .text " > %t.script
 
-# RUN: ld.lld --script=%t.script %t.o -o %t
+# RUN: ld.lld -z keep-data-section-prefix --script=%t.script %t.o -o %t
 # RUN: llvm-readelf -l %t | FileCheck --check-prefix=SEG %s
 # RUN: llvm-readelf -S %t | FileCheck %s
 

>From 27778e560ac7752f36e8fee279620b362a83e7cf Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Wed, 16 Jul 2025 10:48:57 -0700
Subject: [PATCH 3/5] resolve comments

---
 lld/ELF/Config.h                        |  2 +-
 lld/ELF/Driver.cpp                      |  4 +-
 lld/ELF/Writer.cpp                      | 13 ++--
 lld/test/ELF/keep-text-section-prefix.s | 89 +++++++++++++++++++++++++
 lld/test/ELF/relro-data-unlikely.s      | 50 --------------
 5 files changed, 99 insertions(+), 59 deletions(-)
 create mode 100644 lld/test/ELF/keep-text-section-prefix.s
 delete mode 100644 lld/test/ELF/relro-data-unlikely.s

diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index ae7de6417c3b9..92fce3b81c352 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -404,8 +404,8 @@ struct Config {
   bool zIfuncNoplt;
   bool zInitfirst;
   bool zInterpose;
-  bool zKeepTextSectionPrefix;
   bool zKeepDataSectionPrefix;
+  bool zKeepTextSectionPrefix;
   bool zLrodataAfterBss;
   bool zNoBtCfi;
   bool zNodefaultlib;
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 16ef4e7b0aeea..de1d78bf999d4 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1625,10 +1625,10 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.zIfuncNoplt = hasZOption(args, "ifunc-noplt");
   ctx.arg.zInitfirst = hasZOption(args, "initfirst");
   ctx.arg.zInterpose = hasZOption(args, "interpose");
-  ctx.arg.zKeepTextSectionPrefix = getZFlag(
-      args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
   ctx.arg.zKeepDataSectionPrefix = getZFlag(
       args, "keep-data-section-prefix", "nokeep-data-section-prefix", false);
+  ctx.arg.zKeepTextSectionPrefix = getZFlag(
+      args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
   ctx.arg.zLrodataAfterBss =
       getZFlag(args, "lrodata-after-bss", "nolrodata-after-bss", false);
   ctx.arg.zNoBtCfi = hasZOption(args, "nobtcfi");
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index dad072a8d2df5..380f62347acb1 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -554,11 +554,12 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
 }
 
 // Returns true if the section is a data section that's read only and
-// relocatable.
-static bool isRelRoDataSection(Ctx &ctx, StringRef SectionName) {
-  // If -z keep-data-section-prefix is given, '<section>.hot' and
-  // '<section>.unlikely' is considered a split of '<section>' based on hotness.
-  // They should share the same section attributes.
+// relocatable per its section name. Note this function doesn't look at section
+// sh_type or sh_flags.
+static bool isRelRoDataSectionByName(Ctx &ctx, StringRef SectionName) {
+  //  If  -z keep-data-section-prefix is given, '<section>.hot' and
+  //  '<section>.unlikely' is considered a split of '<section>' based on
+  //  hotness. They should share the same section attributes.
   if (ctx.arg.zKeepDataSectionPrefix) {
     if (SectionName.ends_with(".hot"))
       SectionName = SectionName.drop_back(4);
@@ -645,7 +646,7 @@ static bool isRelroSection(Ctx &ctx, const OutputSection *sec) {
   // magic section names.
   StringRef s = sec->name;
 
-  bool abiAgnostic = isRelRoDataSection(ctx, s) || s == ".bss.rel.ro" ||
+  bool abiAgnostic = isRelRoDataSectionByName(ctx, s) || s == ".bss.rel.ro" ||
                      s == ".ctors" || s == ".dtors" || s == ".jcr" ||
                      s == ".eh_frame" || s == ".fini_array" ||
                      s == ".init_array" || s == ".preinit_array";
diff --git a/lld/test/ELF/keep-text-section-prefix.s b/lld/test/ELF/keep-text-section-prefix.s
new file mode 100644
index 0000000000000..f598545f0f7eb
--- /dev/null
+++ b/lld/test/ELF/keep-text-section-prefix.s
@@ -0,0 +1,89 @@
+# REQUIRES: x86
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux input.s -o a.o
+
+# RUN: ld.lld -z keep-data-section-prefix -T linker-script.lds a.o -o a.out
+# RUN: llvm-readelf -l a.out | FileCheck --check-prefixes=SEG,LS %s
+# RUN: llvm-readelf -S a.out | FileCheck %s --check-prefix=CHECK-LS
+
+# RUN: ld.lld -z keep-data-section-prefix a.o -o b.out
+# RUN: llvm-readelf -l b.out | FileCheck --check-prefixes=SEG,PRE %s
+# RUN: llvm-readelf -S b.out | FileCheck %s --check-prefix=CHECK-PRE
+
+# RUN: ld.lld a.o -o c.out
+# RUN: llvm-readelf -l c.out | FileCheck --check-prefixes=SEG,PRE %s
+# RUN: llvm-readelf -S c.out | FileCheck %s --check-prefix=CHECK-PRE
+
+# RUN: not ld.lld -T linker-script.lds a.o -o d.out 2>&1 | FileCheck %s
+# CHECK: error: section: .relro_padding is not contiguous with other relro sections
+
+## The first PW PT_LOAD segment has FileSiz 0x126f (0x1000 + 0x200 + 0x60 + 0xf),
+## and its p_offset p_vaddr p_paddr p_filesz should match PT_GNU_RELRO.
+#           Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
+# SEG:      LOAD           0x0001c8 0x00000000002011c8 0x00000000002011c8 0x000001 0x000001 R E 0x1000
+# SEG-NEXT: LOAD           0x0001c9 0x00000000002021c9 0x00000000002021c9 0x00126f 0x001e37 RW  0x1000
+# SEG-NEXT: LOAD           0x001438 0x0000000000204438 0x0000000000204438 0x000001 0x000002 RW  0x1000
+# SEG-NEXT: GNU_RELRO      0x0001c9 0x00000000002021c9 0x00000000002021c9 0x00126f 0x001e37 R   0x1
+# SEG-NEXT: GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x0
+
+## Input to output mapping per linker script
+##   .data.rel.ro.split -> .data.rel.ro
+##   .data.rel.ro -> .data.rel.ro
+##   .data.rel.ro.hot -> .data.rel.ro.hot
+##   .data.rel.ro.unlikely -> .data.rel.ro.unlikely 
+# LS:      .text
+# LS-NEXT: .data.rel.ro.hot .data.rel.ro .data.rel.ro.unlikely .relro_padding
+# LS-NEXT: .data .bss
+
+#        [Nr] Name                    Type            Address          Off    Size
+# CHECK-LS:      .data.rel.ro.hot        PROGBITS        00000000002021c9 0001c9 00000f
+# CHECK-LS-NEXT: .data.rel.ro            PROGBITS        00000000002021d8 0001d8 000260
+# CHECK-LS-NEXT: .data.rel.ro.unlikely   PROGBITS        0000000000202438 000438 001000
+# CHECK-LS-NEXT: .relro_padding          NOBITS          0000000000203438 001438 000bc8
+# CHECK-LS-NEXT: .data                   PROGBITS        0000000000204438 001438 000001
+# CHECK-LS-NEXT: .bss                    NOBITS          0000000000204439 001439 000001
+
+## Linker script is not provided to map data sections.
+## So all input sections with prefix .data.rel.ro will map to .data.rel.ro in the output.
+# PRE:      .text
+# PRE-NEXT: .data.rel.ro .relro_padding
+# PRE-NEXT: .data .bss
+
+#        [Nr] Name                    Type            Address          Off    Size
+# CHECK-PRE:      .data.rel.ro            PROGBITS        00000000002021c9 0001c9 00126f
+# CHECK-PRE-NEXT: .relro_padding          NOBITS          0000000000203438 001438 000bc8
+# CHECK-PRE-NEXT: .data                   PROGBITS        0000000000204438 001438 000001
+# CHECK-PRE-NEXT: .bss                    NOBITS          0000000000204439 001439 000001
+
+#--- linker-script.lds
+SECTIONS {
+  .data.rel.ro.hot : { *(.data.rel.ro.hot) }
+  .data.rel.ro : { .data.rel.ro }
+  .data.rel.ro.unlikely : { *(.data.rel.ro.unlikely) } 
+} INSERT AFTER .text
+
+
+#--- input.s
+.globl _start
+_start:
+  ret
+
+.section .data.rel.ro.hot, "aw"
+.space 15
+
+.section .data.rel.ro, "aw"
+.space 96
+
+.section .data.rel.ro.split,"aw"
+.space 512
+
+.section .data.rel.ro.unlikely, "aw"
+.space 4096
+
+.section .data, "aw"
+.space 1
+
+.section .bss, "aw"
+.space 1
diff --git a/lld/test/ELF/relro-data-unlikely.s b/lld/test/ELF/relro-data-unlikely.s
deleted file mode 100644
index 981b30a42bc91..0000000000000
--- a/lld/test/ELF/relro-data-unlikely.s
+++ /dev/null
@@ -1,50 +0,0 @@
-# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-
-# RUN: echo "SECTIONS { \
-# RUN:  .data.rel.ro : { .data.rel.ro } \
-# RUN:  .data.rel.ro.unlikely : { *(.data.rel.ro.unlikely) } \
-# RUN: } INSERT AFTER .text " > %t.script
-
-# RUN: ld.lld -z keep-data-section-prefix --script=%t.script %t.o -o %t
-# RUN: llvm-readelf -l %t | FileCheck --check-prefix=SEG %s
-# RUN: llvm-readelf -S %t | FileCheck %s
-
-# There are 2 RW PT_LOAD segments. p_offset p_vaddr p_paddr p_filesz of the first
-# should match PT_GNU_RELRO.
-# The .data.rel.ro.unlikely section is in PT_GNU_RELRO segment.
-
-#           Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
-# SEG:      LOAD           0x0001c8 0x00000000002011c8 0x00000000002011c8 0x000001 0x000001 R E 0x1000
-# SEG-NEXT: LOAD           0x0001c9 0x00000000002021c9 0x00000000002021c9 0x001001 0x001e37 RW  0x1000
-# SEG-NEXT: LOAD           0x0011ca 0x00000000002041ca 0x00000000002041ca 0x000001 0x000002 RW  0x1000
-# SEG-NEXT: GNU_RELRO      0x0001c9 0x00000000002021c9 0x00000000002021c9 0x001001 0x001e37 R   0x1
-# SEG-NEXT: GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x0
-
-# SEG:      .text
-# SEG-NEXT: .data.rel.ro .data.rel.ro.unlikely .relro_padding
-# SEG-NEXT: .data .bss
-
-#        [Nr] Name                    Type            Address          Off    Size
-# CHECK:      .data.rel.ro            PROGBITS        00000000002021c9 0001c9 000001
-# CHECK-NEXT: .data.rel.ro.unlikely   PROGBITS        00000000002021ca 0001ca 001000
-# CHECK-NEXT: .relro_padding          NOBITS          00000000002031ca 0011ca 000e36
-# CHECK-NEXT: .data                   PROGBITS        00000000002041ca 0011ca 000001
-# CHECK-NEXT: .bss                    NOBITS          00000000002041cb 0011cb 000001
-
-.globl _start
-_start:
-  ret
-
-
-.section .data.rel.ro, "aw"
-.space 1
-
-.section .data.rel.ro.unlikely, "aw"
-.space 4096
-
-.section .data, "aw"
-.space 1
-
-.section .bss, "aw"
-.space 1

>From eb439b12c28e05607a92c45cb1f010d9921ca064 Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Wed, 16 Jul 2025 20:31:55 -0700
Subject: [PATCH 4/5] omit ByName as suggested

---
 lld/ELF/Writer.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 380f62347acb1..ce739eba0d60d 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -554,9 +554,8 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
 }
 
 // Returns true if the section is a data section that's read only and
-// relocatable per its section name. Note this function doesn't look at section
-// sh_type or sh_flags.
-static bool isRelRoDataSectionByName(Ctx &ctx, StringRef SectionName) {
+// relocatable per its section name.
+static bool isRelRoDataSection(Ctx &ctx, StringRef SectionName) {
   //  If  -z keep-data-section-prefix is given, '<section>.hot' and
   //  '<section>.unlikely' is considered a split of '<section>' based on
   //  hotness. They should share the same section attributes.
@@ -646,7 +645,7 @@ static bool isRelroSection(Ctx &ctx, const OutputSection *sec) {
   // magic section names.
   StringRef s = sec->name;
 
-  bool abiAgnostic = isRelRoDataSectionByName(ctx, s) || s == ".bss.rel.ro" ||
+  bool abiAgnostic = isRelRoDataSection(ctx, s) || s == ".bss.rel.ro" ||
                      s == ".ctors" || s == ".dtors" || s == ".jcr" ||
                      s == ".eh_frame" || s == ".fini_array" ||
                      s == ".init_array" || s == ".preinit_array";

>From 3b23fde82ecb698c3f8c280b18ee61a6a99c88b2 Mon Sep 17 00:00:00 2001
From: Mingming Liu <mingmingl at google.com>
Date: Fri, 18 Jul 2025 15:54:19 -0700
Subject: [PATCH 5/5] apply suggestions

Co-authored-by: Sam Elliott <quic_aelliott at quicinc.com>
---
 lld/test/ELF/keep-text-section-prefix.s | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lld/test/ELF/keep-text-section-prefix.s b/lld/test/ELF/keep-text-section-prefix.s
index f598545f0f7eb..0fea26355c679 100644
--- a/lld/test/ELF/keep-text-section-prefix.s
+++ b/lld/test/ELF/keep-text-section-prefix.s
@@ -19,7 +19,7 @@
 # RUN: not ld.lld -T linker-script.lds a.o -o d.out 2>&1 | FileCheck %s
 # CHECK: error: section: .relro_padding is not contiguous with other relro sections
 
-## The first PW PT_LOAD segment has FileSiz 0x126f (0x1000 + 0x200 + 0x60 + 0xf),
+## The first RW PT_LOAD segment has FileSiz 0x126f (0x1000 + 0x200 + 0x60 + 0xf),
 ## and its p_offset p_vaddr p_paddr p_filesz should match PT_GNU_RELRO.
 #           Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
 # SEG:      LOAD           0x0001c8 0x00000000002011c8 0x00000000002011c8 0x000001 0x000001 R E 0x1000



More information about the llvm-commits mailing list