Remove the gap between LOAD segments when using RELRO.
Resolves: RHEL-45873
This commit is contained in:
parent
37ce9d87ff
commit
f8f459207e
86
binutils-relro.patch
Normal file
86
binutils-relro.patch
Normal file
@ -0,0 +1,86 @@
|
||||
diff -rup binutils.orig/ld/ldexp.c binutils-2.35.2/ld/ldexp.c
|
||||
--- binutils.orig/ld/ldexp.c 2024-07-11 14:49:42.844809806 +0100
|
||||
+++ binutils-2.35.2/ld/ldexp.c 2024-07-11 15:36:22.841888968 +0100
|
||||
@@ -468,7 +468,8 @@ fold_segment_align (seg_align_type *seg,
|
||||
}
|
||||
else
|
||||
{
|
||||
- expld.result.value += expld.dot & (maxpage - 1);
|
||||
+ if (!link_info.relro)
|
||||
+ expld.result.value += expld.dot & (maxpage - 1);
|
||||
if (seg->phase == exp_seg_done)
|
||||
{
|
||||
/* OK. */
|
||||
@@ -477,8 +478,9 @@ fold_segment_align (seg_align_type *seg,
|
||||
{
|
||||
seg->phase = exp_seg_align_seen;
|
||||
seg->base = expld.result.value;
|
||||
- seg->pagesize = commonpage;
|
||||
+ seg->commonpagesize = commonpage;
|
||||
seg->maxpagesize = maxpage;
|
||||
+ seg->relropagesize = maxpage;
|
||||
seg->relro_end = 0;
|
||||
}
|
||||
else
|
||||
@@ -507,10 +509,10 @@ fold_segment_relro_end (seg_align_type *
|
||||
seg->relro_end = lhs->value + expld.result.value;
|
||||
|
||||
if (seg->phase == exp_seg_relro_adjust
|
||||
- && (seg->relro_end & (seg->pagesize - 1)))
|
||||
+ && (seg->relro_end & (seg->relropagesize - 1)))
|
||||
{
|
||||
- seg->relro_end += seg->pagesize - 1;
|
||||
- seg->relro_end &= ~(seg->pagesize - 1);
|
||||
+ seg->relro_end += seg->relropagesize - 1;
|
||||
+ seg->relro_end &= ~(seg->relropagesize - 1);
|
||||
expld.result.value = seg->relro_end - expld.result.value;
|
||||
}
|
||||
else
|
||||
Only in binutils-2.35.2/ld: ldexp.c.orig
|
||||
diff -rup binutils.orig/ld/ldexp.h binutils-2.35.2/ld/ldexp.h
|
||||
--- binutils.orig/ld/ldexp.h 2024-07-11 14:49:42.845809808 +0100
|
||||
+++ binutils-2.35.2/ld/ldexp.h 2024-07-11 15:36:22.841888968 +0100
|
||||
@@ -136,7 +136,10 @@ enum relro_enum {
|
||||
typedef struct {
|
||||
enum phase_enum phase;
|
||||
|
||||
- bfd_vma base, relro_offset, relro_end, end, pagesize, maxpagesize;
|
||||
+ bfd_vma base, relro_offset, relro_end, end;
|
||||
+ /* MAXPAGESIZE and COMMMONPAGESIZE as passed to DATA_SEGMENT_ALIGN.
|
||||
+ relropagesize sets the alignment of the end of the relro segment. */
|
||||
+ bfd_vma maxpagesize, commonpagesize, relropagesize;
|
||||
|
||||
enum relro_enum relro;
|
||||
|
||||
diff -rup binutils.orig/ld/ldlang.c binutils-2.35.2/ld/ldlang.c
|
||||
--- binutils.orig/ld/ldlang.c 2024-07-11 14:49:42.968810127 +0100
|
||||
+++ binutils-2.35.2/ld/ldlang.c 2024-07-11 15:36:22.842888972 +0100
|
||||
@@ -6251,12 +6251,12 @@ lang_size_segment (seg_align_type *seg)
|
||||
a page could be saved in the data segment. */
|
||||
bfd_vma first, last;
|
||||
|
||||
- first = -seg->base & (seg->pagesize - 1);
|
||||
- last = seg->end & (seg->pagesize - 1);
|
||||
+ first = -seg->base & (seg->commonpagesize - 1);
|
||||
+ last = seg->end & (seg->commonpagesize - 1);
|
||||
if (first && last
|
||||
- && ((seg->base & ~(seg->pagesize - 1))
|
||||
- != (seg->end & ~(seg->pagesize - 1)))
|
||||
- && first + last <= seg->pagesize)
|
||||
+ && ((seg->base & ~(seg->commonpagesize - 1))
|
||||
+ != (seg->end & ~(seg->commonpagesize - 1)))
|
||||
+ && first + last <= seg->commonpagesize)
|
||||
{
|
||||
seg->phase = exp_seg_adjust;
|
||||
return TRUE;
|
||||
@@ -6273,8 +6273,7 @@ lang_size_relro_segment_1 (seg_align_typ
|
||||
asection *sec;
|
||||
|
||||
/* Compute the expected PT_GNU_RELRO/PT_LOAD segment end. */
|
||||
- relro_end = ((seg->relro_end + seg->pagesize - 1)
|
||||
- & ~(seg->pagesize - 1));
|
||||
+ relro_end = (seg->relro_end + seg->relropagesize - 1) & -seg->relropagesize;
|
||||
|
||||
/* Adjust by the offset arg of XXX_SEGMENT_RELRO_END. */
|
||||
desired_end = relro_end - seg->relro_offset;
|
||||
Only in binutils-2.35.2/ld: ldlang.c.orig
|
@ -2,7 +2,7 @@
|
||||
Summary: A GNU collection of binary utilities
|
||||
Name: binutils%{?_with_debug:-debug}
|
||||
Version: 2.35.2
|
||||
Release: 48%{?dist}
|
||||
Release: 49%{?dist}
|
||||
License: GPLv3+
|
||||
URL: https://sourceware.org/binutils
|
||||
|
||||
@ -457,6 +457,10 @@ Patch69: binutils-gnu.debuglto_.patch
|
||||
# Lifetime: Fixed in 2.37
|
||||
Patch70: binutils-prune-lto-messages.patch
|
||||
|
||||
# Purpose: Remove the gap between LOAD segments when using RELRO
|
||||
# Lifetime: Fixed in 2.38
|
||||
Patch71: binutils-relro.patch
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
Provides: bundled(libiberty)
|
||||
@ -1297,6 +1301,9 @@ exit 0
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
%changelog
|
||||
* Thu Jul 11 2024 Nick Clifton <nickc@redhat.com> - 2.35.2-49
|
||||
- Remove the gap between LOAD segments when using RELRO. (RHEL-45873)
|
||||
|
||||
* Thu Jun 27 2024 Nick Clifton <nickc@redhat.com> - 2.35.2-48
|
||||
- Add missing test driver for section-alignment patch. (RHEL-30268)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user