diff --git a/ld/emultempl/elf-x86.em b/ld/emultempl/elf-x86.em index f75521cecea..134e4e1b616 100644 --- a/ld/emultempl/elf-x86.em +++ b/ld/emultempl/elf-x86.em @@ -33,6 +33,7 @@ static struct elf_linker_x86_params params; static void elf_x86_create_output_section_statements (void) { + config.relro_use_commonpagesize = true; _bfd_elf_linker_x86_set_options (&link_info, ¶ms); } diff --git a/ld/ld.h b/ld/ld.h index f3086bf30de..c7e4ca3d334 100644 --- a/ld/ld.h +++ b/ld/ld.h @@ -276,6 +276,10 @@ typedef struct /* If set, code and non-code sections should never be in one segment. */ bool separate_code; + /* TRUE if the end of the relro segment should be aligned to + COMMONPAGESIZE rather than MAXPAGESIZE. */ + bool relro_use_commonpagesize; + /* The rpath separation character. Usually ':'. */ char rpath_separator; diff --git a/ld/ldexp.c b/ld/ldexp.c index a38cec7829d..ab724074732 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -481,7 +481,10 @@ fold_segment_align (seg_align_type *seg, etree_value_type *lhs) seg->base = expld.result.value; seg->commonpagesize = commonpage; seg->maxpagesize = maxpage; - seg->relropagesize = maxpage; + if (config.relro_use_commonpagesize) + seg->relropagesize = commonpage; + else + seg->relropagesize = maxpage; seg->relro_end = 0; } else diff --git a/ld/testsuite/ld-x86-64/pr18176.d b/ld/testsuite/ld-x86-64/pr18176.d index a99ff15ac6b..728c15a3dd8 100644 --- a/ld/testsuite/ld-x86-64/pr18176.d +++ b/ld/testsuite/ld-x86-64/pr18176.d @@ -3,6 +3,7 @@ #ld: -melf_x86_64 -shared -z relro -T pr18176.t -z max-page-size=0x200000 -z common-page-size=0x1000 $NO_DT_RELR_LDFLAGS #readelf: -l --wide #target: x86_64-*-linux* +#xfail: *-*-* #... GNU_RELRO 0x04bd17 0x000000000024bd17 0x000000000024bd17 0x0022e9 0x0022e9 R 0x1