From 52b082c2f5bb3e9c77f1064680bb3b9209954ce1 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 13 Jun 2024 17:14:07 +0100 Subject: [PATCH] Add --rosegment option to BFD linker. --- binutils-ld-rosegment.patch | 1816 +++++++++++++++++++++++++++++++++++ binutils.spec | 8 +- 2 files changed, 1822 insertions(+), 2 deletions(-) create mode 100644 binutils-ld-rosegment.patch diff --git a/binutils-ld-rosegment.patch b/binutils-ld-rosegment.patch new file mode 100644 index 0000000..db4c7fc --- /dev/null +++ b/binutils-ld-rosegment.patch @@ -0,0 +1,1816 @@ +diff -rupN binutils.orig/bfd/elf.c binutils-2.41/bfd/elf.c +--- binutils.orig/bfd/elf.c 2024-06-13 15:12:09.941469205 +0100 ++++ binutils-2.41/bfd/elf.c 2024-06-13 15:15:52.653310471 +0100 +@@ -5344,7 +5344,9 @@ _bfd_elf_map_sections_to_segments (bfd * + thus not executable, and the first section is + executable then put the file and program headers in + their own PT_LOAD. */ +- separate_phdr = true; ++ if (!info->one_rosegment) ++ separate_phdr = true; ++ + if ((((phdr_lma + phdr_size - 1) & addr_mask & -maxpagesize) + == (sections[0]->lma & addr_mask & -maxpagesize))) + { +diff -rupN binutils.orig/include/bfdlink.h binutils-2.41/include/bfdlink.h +--- binutils.orig/include/bfdlink.h 2024-06-13 15:12:12.208465462 +0100 ++++ binutils-2.41/include/bfdlink.h 2024-06-13 15:15:52.653310471 +0100 +@@ -423,6 +423,9 @@ struct bfd_link_info + /* TRUE if separate code segment should be created. */ + unsigned int separate_code: 1; + ++ /* TRUE if only one read-only, non-code segment should be created. */ ++ unsigned int one_rosegment: 1; ++ + /* Nonzero if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment + should be created. 1 for DWARF2 tables, 2 for compact tables. */ + unsigned int eh_frame_hdr_type: 2; +diff -rupN binutils.orig/ld/NEWS binutils-2.41/ld/NEWS +--- binutils.orig/ld/NEWS 2024-06-13 15:12:13.177463862 +0100 ++++ binutils-2.41/ld/NEWS 2024-06-13 15:15:52.653310471 +0100 +@@ -1,5 +1,9 @@ + -*- text -*- + ++* Add --rosegment option which changes the -z separate-code option so that ++ only one read-only segment is created (instead of two). (The option name ++ is misleading, but it matches the name used by LLD and GOLD). ++ + * Add --section-ordering-file option to add extra mapping of input + sections to output sections. + +diff -rupN binutils.orig/ld/config.in binutils-2.41/ld/config.in +--- binutils.orig/ld/config.in 2024-06-13 15:12:13.182463854 +0100 ++++ binutils-2.41/ld/config.in 2024-06-13 15:15:52.653310471 +0100 +@@ -45,6 +45,10 @@ + default. */ + #undef DEFAULT_LD_WARN_RWX_SEGMENTS + ++/* Define to 1 if you want to enable --rosegment in the ELF linker by ++ default. */ ++#undef DEFAULT_LD_ROSEGMENT ++ + /* Define to 1 if you want to enable -z relro in ELF linker by default. */ + #undef DEFAULT_LD_Z_RELRO + +diff -rupN binutils.orig/ld/configure binutils-2.41/ld/configure +--- binutils.orig/ld/configure 2024-06-13 15:12:13.182463854 +0100 ++++ binutils-2.41/ld/configure 2024-06-13 15:18:15.402877779 +0100 +@@ -847,6 +847,7 @@ enable_new_dtags + enable_relro + enable_textrel_check + enable_separate_code ++enable_rosegment + enable_warn_execstack + enable_error_execstack + enable_warn_rwx_segments +@@ -1536,6 +1537,7 @@ Optional Features: + --enable-textrel-check=[yes|no|warning|error] + enable DT_TEXTREL check in ELF linker + --enable-separate-code enable -z separate-code in ELF linker by default ++ --enable-rosegment enable --rosegment in the ELF linker by default + --enable-warn-execstack enable warnings when creating an executable stack + --enable-warn-rwx-segments + enable warnings when creating segements with RWX +@@ -15627,6 +15629,16 @@ esac + fi + + ++# Decide if --rosegment should be enabled in the ELF linker by default. ++ac_default_ld_rosegment=unset ++# Check whether --enable-rosegment was given. ++if test "${enable_rosegment+set}" = set; then : ++ enableval=$enable_rosegment; case "${enableval}" in ++ yes) ac_default_ld_rosegment=1 ;; ++ no) ac_default_ld_rosegment=0 ;; ++esac ++fi ++ + + # By default warn when an executable stack is created due to object files + # requesting such, not when the user specifies -z execstack. +@@ -17457,6 +17469,13 @@ cat >>confdefs.h <<_ACEOF + _ACEOF + + ++if test "${ac_default_ld_rosegment}" = unset; then ++ ac_default_ld_rosegment=0 ++fi ++ ++cat >>confdefs.h <<_ACEOF ++#define DEFAULT_LD_ROSEGMENT $ac_default_ld_rosegment ++_ACEOF + + + cat >>confdefs.h <<_ACEOF +diff -rupN binutils.orig/ld/configure.ac binutils-2.41/ld/configure.ac +--- binutils.orig/ld/configure.ac 2024-06-13 15:12:13.182463854 +0100 ++++ binutils-2.41/ld/configure.ac 2024-06-13 15:17:02.889589604 +0100 +@@ -213,6 +213,15 @@ AC_ARG_ENABLE(separate-code, + no) ac_default_ld_z_separate_code=0 ;; + esac]) + ++# Decide if --rosegment should be enabled in the ELF linker by default. ++ac_default_ld_rosegment=unset ++AC_ARG_ENABLE(rosegment, ++ AS_HELP_STRING([--enable-rosegment], ++ [enable --rosegment in the ELF linker by default]), ++[case "${enableval}" in ++ yes) ac_default_ld_rosegment=1 ;; ++ no) ac_default_ld_rosegment=0 ;; ++esac]) + + # By default warn when an executable stack is created due to object files + # requesting such, not when the user specifies -z execstack. +@@ -581,6 +590,12 @@ AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_SEPARATE + $ac_default_ld_z_separate_code, + [Define to 1 if you want to enable -z separate-code in ELF linker by default.]) + ++if test "${ac_default_ld_rosegment}" = unset; then ++ ac_default_ld_rosegment=0 ++fi ++AC_DEFINE_UNQUOTED(DEFAULT_LD_ROSEGMENT, ++ $ac_default_ld_rosegment, ++ [Define to 1 if you want to enable --rosegment in the ELF linker by default.]) + + AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_EXECSTACK, + $ac_default_ld_warn_execstack, +diff -rupN binutils.orig/ld/emultempl/elf.em binutils-2.41/ld/emultempl/elf.em +--- binutils.orig/ld/emultempl/elf.em 2024-06-13 15:12:12.354465221 +0100 ++++ binutils-2.41/ld/emultempl/elf.em 2024-06-13 15:15:52.661310503 +0100 +@@ -92,6 +92,7 @@ EOF + fi + fragment <> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c ++ + echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c ++ + if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else +-echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c +-sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c ++ echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c ++ sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c + fi ++ + if test -n "$GENERATE_PIE_SCRIPT" ; then + if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xdwer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdwe >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xdceor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdceo >> e${EMULATION_NAME}.c ++ + fi ++ ++echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xdcer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdce >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdco >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xdeor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdeo >> e${EMULATION_NAME}.c ++ + fi ++ + fi ++ ++echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xder >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xde >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xdo >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else if (bfd_link_pie (&link_info)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c + fi ++ + if test -n "$GENERATE_SHLIB_SCRIPT" ; then + if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xswer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xswe >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xsceor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xsceo >> e${EMULATION_NAME}.c ++ + fi ++ ++echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xscer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xsce >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xsco >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xseor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xseo >> e${EMULATION_NAME}.c ++ + fi ++ + fi ++ ++echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xser >> e${EMULATION_NAME}.c ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xse >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xso >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else if (bfd_link_dll (&link_info)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c ++ + fi ++ + if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then ++ + echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xwe >> e${EMULATION_NAME}.c ++ ++echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xwer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro' >> e${EMULATION_NAME}.c + echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xceor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xceo >> e${EMULATION_NAME}.c ++ + fi ++ ++echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xcer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xce >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xco >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c ++ + fi ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ ++echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment' >> e${EMULATION_NAME}.c ++echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xeor >> e${EMULATION_NAME}.c ++ + echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c + echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xeo >> e${EMULATION_NAME}.c ++ + fi ++ ++echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c ++echo ' && link_info.one_rosegment) return' >> e${EMULATION_NAME}.c ++sed $sc ldscripts/${EMULATION_NAME}.xer >> e${EMULATION_NAME}.c ++ + echo ' ; else if (link_info.separate_code) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xe >> e${EMULATION_NAME}.c ++ + if test -n "$GENERATE_RELRO_SCRIPT" ; then ++ + echo ' ; else if (link_info.relro) return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.xo >> e${EMULATION_NAME}.c ++ + fi ++ + echo ' ; else return' >> e${EMULATION_NAME}.c + sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c + echo '; }' >> e${EMULATION_NAME}.c +@@ -390,7 +543,12 @@ fragment < ldscripts/${EMULATION_NAME}.xe + ++LD_FLAG=rotextonly ++( echo "/* Script for -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xer ++ + if test -n "$GENERATE_RELRO_SCRIPT"; then +- LD_FLAG= + RELRO=" " ++ ++ LD_FLAG= + ( echo "/* Script for -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xo ++ + LD_FLAG=textonly + ( echo "/* Script for -z separate-code -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xeo ++ ++ LD_FLAG=rotextonly ++ ( echo "/* Script for -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xeor ++ + unset RELRO + fi ++ + LD_FLAG=n + DATA_ALIGNMENT=${DATA_ALIGNMENT_n} + ( echo "/* Script for -n */" +@@ -368,6 +401,7 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc + rm -f ${COMBRELOC} ++ + LD_FLAG=ctextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xce.tmp + ( echo "/* Script for -z combreloc -z separate-code */" +@@ -375,7 +409,17 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xce + rm -f ${COMBRELOC} ++ ++ LD_FLAG=roctextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xcer.tmp ++ ( echo "/* Script for -z combreloc -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xcer ++ rm -f ${COMBRELOC} ++ + RELRO_NOW=" " ++ + LD_FLAG=w + COMBRELOC=ldscripts/${EMULATION_NAME}.xw.tmp + ( echo "/* Script for -z combreloc -z relro -z now */" +@@ -383,6 +427,7 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xw + rm -f ${COMBRELOC} ++ + LD_FLAG=wtextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xwe.tmp + ( echo "/* Script for -z combreloc -z separate-code -z relro -z now */" +@@ -391,16 +436,29 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xwe + rm -f ${COMBRELOC} + COMBRELOC= ++ ++ LD_FLAG=rowtextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xwer.tmp ++ ( echo "/* Script for -z combreloc -z separate-code -z relro -z now -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xwer ++ rm -f ${COMBRELOC} ++ COMBRELOC= ++ + unset RELRO_NOW ++ + if test -n "$GENERATE_RELRO_SCRIPT"; then +- LD_FLAG=c + RELRO=" " ++ ++ LD_FLAG=c + COMBRELOC=ldscripts/${EMULATION_NAME}.xco.tmp + ( echo "/* Script for -z combreloc -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xco + rm -f ${COMBRELOC} ++ + LD_FLAG=ctextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xceo.tmp + ( echo "/* Script for -z combreloc -z separate-code -z relro */" +@@ -409,38 +467,66 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT"; + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xceo + rm -f ${COMBRELOC} + COMBRELOC= ++ ++ LD_FLAG=roctextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xceor.tmp ++ ( echo "/* Script for -z combreloc -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xceor ++ rm -f ${COMBRELOC} ++ COMBRELOC= ++ + unset RELRO + fi + fi + + if test -n "$GENERATE_SHLIB_SCRIPT"; then +- DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} + CREATE_SHLIB=" " ++ DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} ++ + LD_FLAG=shared + ( echo "/* Script for -shared */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs ++ + LD_FLAG=sharedtextonly + ( echo "/* Script for -shared -z separate-code */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xse + ++ LD_FLAG=rosharedtextonly ++ ( echo "/* Script for -shared -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xser ++ + if test -n "$GENERATE_RELRO_SCRIPT"; then + RELRO=" " ++ + LD_FLAG=shared + ( echo "/* Script for -shared -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xso ++ + LD_FLAG=sharedtextonly + ( echo "/* Script for -shared -z separate-code -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xseo ++ ++ LD_FLAG=rosharedtextonly ++ ( echo "/* Script for -shared -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xseor ++ + unset RELRO + fi ++ + if test -n "$GENERATE_COMBRELOC_SCRIPT"; then + DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} + LD_FLAG=cshared +@@ -450,6 +536,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc + rm -f ${COMBRELOC} ++ + LD_FLAG=csharedtextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xsce.tmp + ( echo "/* Script for -shared -z combreloc -z separate-code */" +@@ -457,7 +544,17 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsce + rm -f ${COMBRELOC} ++ ++ LD_FLAG=rocsharedtextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xscer.tmp ++ ( echo "/* Script for -shared -z combreloc -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xscer ++ rm -f ${COMBRELOC} ++ + RELRO_NOW=" " ++ + LD_FLAG=wshared + COMBRELOC=ldscripts/${EMULATION_NAME}.xsw.tmp + ( echo "/* Script for -shared -z combreloc -z relro -z now */" +@@ -465,6 +562,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsw + rm -f ${COMBRELOC} ++ + LD_FLAG=wsharedtextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xswe.tmp + ( echo "/* Script for -shared -z combreloc -z separate-code -z relro -z now */" +@@ -472,17 +570,28 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xswe + rm -f ${COMBRELOC} ++ ++ LD_FLAG=rowsharedtextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xswe.tmp ++ ( echo "/* Script for -shared -z combreloc -z separate-code -z relro -z now -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xswer ++ rm -f ${COMBRELOC} ++ + unset RELRO_NOW + + if test -n "$GENERATE_RELRO_SCRIPT"; then +- LD_FLAG=wshared + RELRO=" " ++ ++ LD_FLAG=wshared + COMBRELOC=ldscripts/${EMULATION_NAME}.xsco.tmp + ( echo "/* Script for -shared -z combreloc -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsco + rm -f ${COMBRELOC} ++ + LD_FLAG=wsharedtextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xsceo.tmp + ( echo "/* Script for -shared -z combreloc -z separate-code -z relro */" +@@ -490,40 +599,70 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsceo + rm -f ${COMBRELOC} ++ ++ LD_FLAG=rowsharedtextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xsceor.tmp ++ ( echo "/* Script for -shared -z combreloc -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsceor ++ rm -f ${COMBRELOC} ++ + unset RELRO + fi ++ + COMBRELOC= + fi ++ + unset CREATE_SHLIB + fi + + if test -n "$GENERATE_PIE_SCRIPT"; then +- DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} + CREATE_PIE=" " ++ ++ DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} + LD_FLAG=pie + ( echo "/* Script for -pie */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd ++ + LD_FLAG=pietextonly + ( echo "/* Script for -pie -z separate-code */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xde ++ ++ LD_FLAG=ropietextonly ++ ( echo "/* Script for -pie -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xder ++ + if test -n "$GENERATE_RELRO_SCRIPT"; then + RELRO=" " ++ + LD_FLAG=pie + ( echo "/* Script for -pie -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdo ++ + LD_FLAG=pietextonly + ( echo "/* Script for -pie -z separate-code -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdeo ++ ++ LD_FLAG=ropietextonly ++ ( echo "/* Script for -pie -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdeor ++ + unset RELRO + fi ++ + if test -n "$GENERATE_COMBRELOC_SCRIPT"; then + DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} + COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp +@@ -533,6 +672,7 @@ if test -n "$GENERATE_PIE_SCRIPT"; then + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc + rm -f ${COMBRELOC} ++ + LD_FLAG=cpietextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xdce.tmp + ( echo "/* Script for -pie -z combreloc -z separate-code */" +@@ -540,7 +680,17 @@ if test -n "$GENERATE_PIE_SCRIPT"; then + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdce + rm -f ${COMBRELOC} ++ ++ LD_FLAG=rocpietextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xdcer.tmp ++ ( echo "/* Script for -pie -z combreloc -z separate-code -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdcer ++ rm -f ${COMBRELOC} ++ + RELRO_NOW=" " ++ + LD_FLAG=wpie + COMBRELOC=ldscripts/${EMULATION_NAME}.xdw.tmp + ( echo "/* Script for -pie -z combreloc -z relro -z now */" +@@ -548,6 +698,7 @@ if test -n "$GENERATE_PIE_SCRIPT"; then + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdw + rm -f ${COMBRELOC} ++ + LD_FLAG=wpietextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xdwe.tmp + ( echo "/* Script for -pie -z combreloc -z separate-code -z relro -z now */" +@@ -555,17 +706,28 @@ if test -n "$GENERATE_PIE_SCRIPT"; then + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdwe + rm -f ${COMBRELOC} ++ ++ LD_FLAG=rowpietextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xdwer.tmp ++ ( echo "/* Script for -pie -z combreloc -z separate-code -z relro -z now -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdwer ++ rm -f ${COMBRELOC} ++ + unset RELRO_NOW + + if test -n "$GENERATE_RELRO_SCRIPT"; then +- LD_FLAG=wpie + RELRO=" " ++ ++ LD_FLAG=wpie + COMBRELOC=ldscripts/${EMULATION_NAME}.xdco.tmp + ( echo "/* Script for -pie -z combreloc -z relro */" + source_sh ${CUSTOMIZER_SCRIPT} + source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdco + rm -f ${COMBRELOC} ++ + LD_FLAG=wpietextonly + COMBRELOC=ldscripts/${EMULATION_NAME}.xdceo.tmp + ( echo "/* Script for -pie -z combreloc -z separate-code -z relro */" +@@ -574,10 +736,20 @@ if test -n "$GENERATE_PIE_SCRIPT"; then + ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdceo + rm -f ${COMBRELOC} + ++ LD_FLAG=rowpietextonly ++ COMBRELOC=ldscripts/${EMULATION_NAME}.xdceor.tmp ++ ( echo "/* Script for -pie -z combreloc -z separate-code -z relro -z one-rosegment */" ++ source_sh ${CUSTOMIZER_SCRIPT} ++ source_sh ${srcdir}/scripttempl/${SCRIPT_NAME}.sc ++ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdceor ++ rm -f ${COMBRELOC} ++ + unset RELRO + fi ++ + COMBRELOC= + fi ++ + unset CREATE_PIE + fi + +diff -rupN binutils.orig/ld/ld.texi binutils-2.41/ld/ld.texi +--- binutils.orig/ld/ld.texi 2024-06-13 15:12:13.178463860 +0100 ++++ binutils-2.41/ld/ld.texi 2024-06-13 15:15:52.662310507 +0100 +@@ -1108,6 +1108,21 @@ For compatibility with other ELF linkers + followed by a directory name, rather than a file name, it is treated as + the @option{-rpath} option. + ++@item --rosegment ++@itemx --no-rosegment ++Attempt to ensure that only a single read-only, non-code segment is ++created. Only useful when used in conjunction with the @option{-z ++separate-code} option. The resulting binaries should be smaller than ++if @option{-z separate-code} is used on its own. Without this option, ++or if @option{--no-rosegment} is specified, the @option{-z separate-code} ++option will create two read-only segments, one before the code segment ++and one after it. ++ ++The name of the options are misleading, but they have been chosen in ++order for the linker to be compatible with the LLD and GOLD linkers. ++ ++Thse options are only supported by ELF targets. ++ + @kindex -s + @kindex --strip-all + @cindex strip all symbols +diff -rupN binutils.orig/ld/ldint.texi binutils-2.41/ld/ldint.texi +--- binutils.orig/ld/ldint.texi 2024-06-13 15:12:12.364465204 +0100 ++++ binutils-2.41/ld/ldint.texi 2024-06-13 15:15:52.662310507 +0100 +@@ -252,18 +252,23 @@ Here is the list of values assigned to @ + @item (empty) + The script generated is used by default (when none of the following + cases apply). The output has an extension of @file{.x}. ++ + @item n + The script generated is used when the linker is invoked with the + @code{-n} option. The output has an extension of @file{.xn}. ++ + @item N + The script generated is used when the linker is invoked with the + @code{-N} option. The output has an extension of @file{.xbn}. ++ + @item r + The script generated is used when the linker is invoked with the + @code{-r} option. The output has an extension of @file{.xr}. ++ + @item u + The script generated is used when the linker is invoked with the + @code{-Ur} option. The output has an extension of @file{.xu}. ++ + @item shared + The @file{scripttempl} script is only invoked with @code{LD_FLAG} set to + this value if @code{GENERATE_SHLIB_SCRIPT} is defined in the +@@ -271,14 +276,15 @@ this value if @code{GENERATE_SHLIB_SCRIP + this script at the appropriate time, normally when the linker is invoked + with the @code{-shared} option. The output has an extension of + @file{.xs}. ++ + @item c + The @file{scripttempl} script is only invoked with @code{LD_FLAG} set to + this value if @code{GENERATE_COMBRELOC_SCRIPT} is defined in the + @file{emulparams} file or if @code{SCRIPT_NAME} is @code{elf}. The + @file{emultempl} script must arrange to use this script at the appropriate + time, normally when the linker is invoked with the @code{-z combreloc} +-option. The output has an extension of +-@file{.xc}. ++option. The output has an extension of @file{.xc}. ++ + @item cshared + The @file{scripttempl} script is only invoked with @code{LD_FLAG} set to + this value if @code{GENERATE_COMBRELOC_SCRIPT} is defined in the +@@ -287,6 +293,62 @@ this value if @code{GENERATE_COMBRELOC_S + The @file{emultempl} script must arrange to use this script at the + appropriate time, normally when the linker is invoked with the @code{-shared + -z combreloc} option. The output has an extension of @file{.xsc}. ++ ++@item wshared ++Like @emph{cshared} but in addition to needing the @option{-shared} ++and @option {-z combreloc} options, it also needs the ++@option{-z relro} option. If the @option{-z now} option is also used ++then the output has an extension of @file{.xsw}, otherwise it is ++@file{.xsco}. ++ ++@item pie ++The @file{scripttempl} script is only invoked with @code{LD_FLAG} set to ++this value if @code{GENERATE_PIE_SCRIPT} is defined in the ++@file{emulparams} file. The @file{emultempl} script must arrange to use ++this script at the appropriate time, normally when the linker is invoked ++with the @code{-pie} option. The output has an extension of ++@file{.xd}. ++ ++In addition if the @file{scripttempl} script is also invoked with ++@code{GENERATE_RELRO_SCRIPT} defined then a second script is created ++with an extension of @file{.xdo} to match the @option{-pie} and ++@option{-z relro} options. ++ ++@item cpie ++Like @code{pie} but this version is used when the @file{scripttempl} ++script is invoked with both @code{GENERATE_PIE_SCRIPT} and ++@code{GENERATE_COMBRELOC_SCRIPT} defined. The @file{emultempl} script ++must arrange to use this script at the appropriate time, normally when ++the linker is invoked with the @code{-pie} and @option{-z combreloc} ++options. The output has an extension of @file{.xdc}. ++ ++@item wpie ++Like @code{cpie}, but in addition the @option{-z relro} and ++@option{-z now} options need to be defined. The output has an ++extension of @file{.xdw}. ++ ++@item textonly ++@item pietextonly ++@item cpietextonly ++@item wpietextonly ++ ++@item ctextonly ++@item wtextonly ++@item sharedtextonly ++@item csharedtextonly ++@item wsharedtextonly ++ ++@item rotextonly ++@item roctextonly ++@item rowtextonly ++@item rosharedtextonly ++@item rocsharedtextonly ++@item rowsharedtextonly ++@item ropietextonly ++@item rocpietextonly ++@item rowpietextonly ++ ++ + @item auto_import + The @file{scripttempl} script is only invoked with @code{LD_FLAG} set to + this value if @code{GENERATE_AUTO_IMPORT_SCRIPT} is defined in the +@@ -294,8 +356,10 @@ this value if @code{GENERATE_AUTO_IMPORT + use this script at the appropriate time, normally when the linker is + invoked with the @code{--enable-auto-import} option. The output has + an extension of @file{.xa}. ++ + @end table + ++ + Besides the shell variables set by the @file{emulparams} script, and the + @code{LD_FLAG} variable, the @file{genscripts.sh} script will set + certain variables for each run of the @file{scripttempl} script. +diff -rupN binutils.orig/ld/ldlex.h binutils-2.41/ld/ldlex.h +--- binutils.orig/ld/ldlex.h 2024-06-13 15:12:13.182463854 +0100 ++++ binutils-2.41/ld/ldlex.h 2024-06-13 15:19:07.065081570 +0100 +@@ -182,6 +182,8 @@ enum option_values + OPTION_DISABLE_LINKER_VERSION, + OPTION_REMAP_INPUTS, + OPTION_REMAP_INPUTS_FILE, ++ OPTION_ROSEGMENT, ++ OPTION_NO_ROSEGMENT, + }; + + /* The initial parser states. */ +diff -rupN binutils.orig/ld/lexsup.c binutils-2.41/ld/lexsup.c +--- binutils.orig/ld/lexsup.c 2024-06-13 15:12:13.182463854 +0100 ++++ binutils-2.41/ld/lexsup.c 2024-06-13 15:15:52.662310507 +0100 +@@ -2228,6 +2228,17 @@ elf_shlib_list_options (FILE *file) + fprintf (file, _("\ + -z noseparate-code Don't create separate code program header (default)\n")); + #endif ++#if DEFAULT_LD_ROSEGMENT ++ fprintf (file, _("\ ++ --rosegment With -z separate-code, create a single read-only segment (default)\n")); ++ fprintf (file, _("\ ++ --no-rosegment With -z separate-code, creste two read-only segments\n")); ++#else ++ fprintf (file, _("\ ++ --rosegment With -z separate-code, create a single read-only segment\n")); ++ fprintf (file, _("\ ++ --no-rosegment With -z separate-code, creste two read-only segments (default)\n")); ++#endif + fprintf (file, _("\ + -z common Generate common symbols with STT_COMMON type\n")); + fprintf (file, _("\ +diff -rupN binutils.orig/ld/scripttempl/elf.sc binutils-2.41/ld/scripttempl/elf.sc +--- binutils.orig/ld/scripttempl/elf.sc 2024-06-13 15:12:12.541464912 +0100 ++++ binutils-2.41/ld/scripttempl/elf.sc 2024-06-13 15:19:59.546231450 +0100 +@@ -78,6 +78,8 @@ + # USER_LABEL_PREFIX - prefix to add to user-visible symbols. + # RODATA_NAME, SDATA_NAME, SBSS_NAME, BSS_NAME - base parts of names + # for standard sections, without initial "." or suffixes. ++# ALL_TEXT_BEFORE_RO - put all code sections before read-only ++# sections + # + # When adding sections, do note that the names of some sections are used + # when specifying the start address of the next. +@@ -357,6 +359,11 @@ SHLIB_TEXT_START_ADDR="SEGMENT_START(\"t + # between .plt and .text. + if test -z "$TINY_READONLY_SECTION"; then + case "$LD_FLAG" in ++ *ro*textonly*) ++ ALL_TEXT_BEFORE_RO=" " ++ SEPARATE_TEXT=" " ++ TEXT_SEGMENT_ALIGN= ++ ;; + *textonly*) + SEPARATE_TEXT=" " + TEXT_SEGMENT_ALIGN=". = ALIGN(${MAXPAGESIZE});" +@@ -377,6 +384,11 @@ else + test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}" + fi + ++# =========================================================================== ++# Functions for generating parts of the linker script ++ ++emit_header() ++{ + cat < ldscripts/dyntmp.$$ <> ldscripts/dyntmp.$$ < - 2.41-42 +- Add --rosegment option to BFD linker. + * Fri May 31 2024 Nick Clifton - 2.41-41 - Add support for RELR relocs to the AArch64 target. (RHEL-31846)