aboutsummaryrefslogtreecommitdiff
path: root/ld/ldexp.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-04-01 19:19:27 +1030
committerAlan Modra <amodra@gmail.com>2015-04-01 19:37:58 +1030
commit6c1aca3e2d408ef4874bd882a7f0e2cd944bbf09 (patch)
tree873fa01252fa3f880772a894a9ca15bf8b1e43c8 /ld/ldexp.c
parent269e9c185f67d477a99574f53ead904d50fddfda (diff)
downloadgdb-6c1aca3e2d408ef4874bd882a7f0e2cd944bbf09.zip
gdb-6c1aca3e2d408ef4874bd882a7f0e2cd944bbf09.tar.gz
gdb-6c1aca3e2d408ef4874bd882a7f0e2cd944bbf09.tar.bz2
Start of relro segment adjustment
Adjusting the start of the relro segment in order to make it end exactly on a page boundary runs into difficulties when sections in the relro segment are aligned; Adjusting the start by (next_page - end) sometimes results in more than that adjustment occurring at the end, overrunning the page boundary. So when that occurs we try a new lower start position by masking the adjusted start with the maximum section alignment. However, we didn't consider that this masked start address may in fact be before the initial relro base, which is silly since that can only increase padding at the relro end. I've also moved some calculations closer to where they are used, and comments closer to the relevant statements. * ldlang.c (lang_size_sections): When alignment of sections results in relro base adjustment being too large, don't go lower than the initial value. * ldexp.c (fold_binary <DATA_SEGMENT_RELRO_END>): Comment. * scripttempl/elf.sc (DATA_SEGMENT_ALIGN): Omit SEGMENT_SIZE alignment when SEGMENT_SIZE is the same as MAXPAGESIZE.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r--ld/ldexp.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/ld/ldexp.c b/ld/ldexp.c
index ac66cc0..9cd9e29 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -588,6 +588,8 @@ fold_binary (etree_type *tree)
break;
case DATA_SEGMENT_RELRO_END:
+ /* Operands swapped! DATA_SEGMENT_RELRO_END(offset,exp)
+ has offset in expld.result and exp in lhs. */
expld.dataseg.relro = exp_dataseg_relro_end;
if (expld.phase == lang_first_phase_enum
|| expld.section != bfd_abs_section_ptr)