diff --git a/binutils-relro.patch b/binutils-relro.patch new file mode 100644 index 0000000..e60472e --- /dev/null +++ b/binutils-relro.patch @@ -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 diff --git a/binutils.spec b/binutils.spec index bf2b63d..ae0dd3a 100644 --- a/binutils.spec +++ b/binutils.spec @@ -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 - 2.35.2-49 +- Remove the gap between LOAD segments when using RELRO. (RHEL-45873) + * Thu Jun 27 2024 Nick Clifton - 2.35.2-48 - Add missing test driver for section-alignment patch. (RHEL-30268)