[PATCH] D125410: [ELF] Align the end of PT_GNU_RELRO to max-page-size instead of common-page-size

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 12 11:03:25 PDT 2022


This revision was automatically updated to reflect the committed changes.
Closed by commit rGebdb9d635a07: [ELF] Align the end of PT_GNU_RELRO to max-page-size instead of common-page-size (authored by MaskRay).

Changed prior to commit:
  https://reviews.llvm.org/D125410?vs=428871&id=429022#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125410/new/

https://reviews.llvm.org/D125410

Files:
  lld/ELF/Writer.cpp
  lld/docs/ReleaseNotes.rst
  lld/test/ELF/aarch64-relro.s
  lld/test/ELF/basic-ppc64.s


Index: lld/test/ELF/basic-ppc64.s
===================================================================
--- lld/test/ELF/basic-ppc64.s
+++ lld/test/ELF/basic-ppc64.s
@@ -336,7 +336,7 @@
 // CHECK-NEXT:    VirtualAddress: 0x20238
 // CHECK-NEXT:    PhysicalAddress: 0x20238
 // CHECK-NEXT:    FileSize: 96
-// CHECK-NEXT:    MemSize: 3528
+// CHECK-NEXT:    MemSize: 64968
 // CHECK-NEXT:    Flags [ (0x4)
 // CHECK-NEXT:      PF_R (0x4)
 // CHECK-NEXT:    ]
Index: lld/test/ELF/aarch64-relro.s
===================================================================
--- lld/test/ELF/aarch64-relro.s
+++ lld/test/ELF/aarch64-relro.s
@@ -8,7 +8,7 @@
 # CHECK-NEXT: VirtualAddress: 0x220190
 # CHECK-NEXT: PhysicalAddress:
 # CHECK-NEXT: FileSize:
-# CHECK-NEXT: MemSize: 3696
+# CHECK-NEXT: MemSize: 65136
 
 .section .data.rel.ro,"aw",%progbits
 .byte 1
Index: lld/docs/ReleaseNotes.rst
===================================================================
--- lld/docs/ReleaseNotes.rst
+++ lld/docs/ReleaseNotes.rst
@@ -29,6 +29,10 @@
 * ``-z pack-relative-relocs`` is now available to support ``DT_RELR`` for glibc 2.36+.
   (`D120701 <https://reviews.llvm.org/D120701>`_)
 * ``--no-fortran-common`` (pre 12.0.0 behavior) is now the default.
+* The end of ``PT_GNU_RELRO`` is now aligned by ``max-page-size`` instead of ``common-page-size``.
+  This matches GNU ld from 2.39 onwards. If the system page size is larger than ``common-page-size``,
+  the previous choice may make a partial page not protected by RELRO.
+  (`D125410 <https://reviews.llvm.org/D125410>`_)
 
 Breaking changes
 ----------------
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -2638,11 +2638,10 @@
 
     if (p->p_type == PT_GNU_RELRO) {
       p->p_align = 1;
-      // musl/glibc ld.so rounds the size down, so we need to round up
-      // to protect the last page. This is a no-op on FreeBSD which always
-      // rounds up.
-      p->p_memsz = alignTo(p->p_offset + p->p_memsz, config->commonPageSize) -
-                   p->p_offset;
+      // musl/glibc/FreeBSD ld.so rounds the size down, so we need to round up
+      // to protect the last page.
+      p->p_memsz =
+          alignTo(p->p_offset + p->p_memsz, config->maxPageSize) - p->p_offset;
     }
   }
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D125410.429022.patch
Type: text/x-patch
Size: 2339 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220512/4846655c/attachment.bin>


More information about the llvm-commits mailing list