From ccded9db34d062ebea2abd43e021ad1a985b1991 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 19 Nov 2015 15:00:13 +1030 Subject: [PATCH] Account for .tbss alignment when adjusting start of relro Another option might be to not bump "dot" for .tbss alignment in the main section sizing loop, but that could leak some of the following section into the TLS segment. Leakage shouldn't matter since it will be to bytes past the end of .tdata, but for now this is a safer option. PR ld/19264 * ldlang.c (lang_size_sections): Don't ignore .tbss when adjusting start of relro region. --- ld/ChangeLog | 8 ++++++++ ld/ldlang.c | 15 ++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 252d5c9966e..63ae72a0324 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2015-12-10 Alan Modra + + Apply from master. + 2015-11-19 Alan Modra + PR ld/19264 + * ldlang.c (lang_size_sections): Don't ignore .tbss when + adjusting start of relro region. + 2015-11-13 Tristan Gingold * configure: Regenerate. diff --git a/ld/ldlang.c b/ld/ldlang.c index 3841afc75f8..c45b9128f43 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -5457,18 +5457,23 @@ lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions) /* For sections in the relro segment.. */ for (sec = link_info.output_bfd->section_last; sec; sec = sec->prev) - if (!IGNORE_SECTION (sec) + if ((sec->flags & SEC_ALLOC) != 0 && sec->vma >= expld.dataseg.base && sec->vma < expld.dataseg.relro_end - expld.dataseg.relro_offset) { /* Where do we want to put this section so that it ends as desired? */ - bfd_vma start = sec->vma; - bfd_vma end = start + sec->size; - bfd_vma bump = desired_end - end; + bfd_vma start, end, bump; + + end = start = sec->vma; + if ((sec->flags & SEC_HAS_CONTENTS) != 0 + || (sec->flags & SEC_THREAD_LOCAL) == 0) + end += sec->size; + bump = desired_end - end; /* We'd like to increase START by BUMP, but we must heed alignment so the increase might be less than optimum. */ - start += bump & ~(((bfd_vma) 1 << sec->alignment_power) - 1); + start += bump; + start &= ~(((bfd_vma) 1 << sec->alignment_power) - 1); /* This is now the desired end for the previous section. */ desired_end = start; } -- 2.47.3