aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/emultempl/elf-x86.em1
-rw-r--r--ld/ld.h4
-rw-r--r--ld/ldexp.c5
-rw-r--r--ld/testsuite/ld-x86-64/pr18176.d1
4 files changed, 10 insertions, 1 deletions
diff --git a/ld/emultempl/elf-x86.em b/ld/emultempl/elf-x86.em
index f75521c..134e4e1 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, &params);
}
diff --git a/ld/ld.h b/ld/ld.h
index f3086bf..c7e4ca3 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 a38cec7..ab72407 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 a99ff15..728c15a 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