@ -5056,17 +5056,23 @@ lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions)
{
/* If DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END pair was seen, try
to put expld . dataseg . relro on a ( common ) page boundary . */
bfd_vma old_ min_base, relro_end , maxpage ;
bfd_vma min_base , old _base , relro_end , maxpage ;
expld . dataseg . phase = exp_dataseg_relro_adjust ;
old_min_base = expld . dataseg . min_base ;
maxpage = expld . dataseg . maxpagesize ;
/* MIN_BASE is the absolute minimum address we are allowed to start the
read - write segment ( byte before will be mapped read - only ) . */
min_base = ( expld . dataseg . min_base + maxpage - 1 ) & ~ ( maxpage - 1 ) ;
/* OLD_BASE is the address for a feasible minimum address which will
still not cause a data overlap inside MAXPAGE causing file offset skip
by MAXPAGE . */
old_base = expld . dataseg . base ;
expld . dataseg . base + = ( - expld . dataseg . relro_end
& ( expld . dataseg . pagesize - 1 ) ) ;
/* Compute the expected PT_GNU_RELRO segment end. */
relro_end = ( ( expld . dataseg . relro_end + expld . dataseg . pagesize - 1 )
& ~ ( expld . dataseg . pagesize - 1 ) ) ;
if ( old_min_base + maxpage < expld . dataseg . base )
if ( min_base + maxpage < expld . dataseg . base )
{
expld . dataseg . base - = maxpage ;
relro_end - = maxpage ;
@ -5077,7 +5083,8 @@ lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions)
{
/* The alignment of sections between DATA_SEGMENT_ALIGN
and DATA_SEGMENT_RELRO_END caused huge padding to be
inserted at DATA_SEGMENT_RELRO_END . Try some other base . */
inserted at DATA_SEGMENT_RELRO_END . Try to start a bit lower so
that the section alignments will fit in . */
asection * sec ;
unsigned int max_alignment_power = 0 ;
@ -5091,8 +5098,7 @@ lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions)
if ( ( ( bfd_vma ) 1 < < max_alignment_power ) < expld . dataseg . pagesize )
{
if ( expld . dataseg . base - ( 1 < < max_alignment_power )
< old_min_base )
if ( expld . dataseg . base - ( 1 < < max_alignment_power ) < old_base )
expld . dataseg . base + = expld . dataseg . pagesize ;
expld . dataseg . base - = ( 1 < < max_alignment_power ) ;
lang_reset_memory_regions ( ) ;