From 1e597a89971e781f5c33d75009b2cbf26323d2a5 Mon Sep 17 00:00:00 2001 From: Tuckker Date: Fri, 28 Aug 2020 13:27:16 +0100 Subject: [PATCH] Prevent the linker from overestimating the alignment requirement of common symbols on targets with octets that are larger than one byte. PR 26543 * linker.c (bfd_generic_define_common_symbol): Force the alignment to 1 if the section has now alignment requirement. --- bfd/ChangeLog | 6 ++++++ bfd/linker.c | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6fa6ee0f316..bf082fc4cb6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-08-28 Tuckker + + PR 26543 + * linker.c (bfd_generic_define_common_symbol): Force the alignment + to 1 if the section has now alignment requirement. + 2020-08-28 Cooper Qu * elf32-csky.c (csky_archs): Fix arch names. diff --git a/bfd/linker.c b/bfd/linker.c index d4057461a3f..13571684568 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -3095,8 +3095,13 @@ bfd_generic_define_common_symbol (bfd *output_bfd, section = h->u.c.p->section; /* Increase the size of the section to align the common symbol. - The alignment must be a power of two. */ - alignment = bfd_octets_per_byte (output_bfd, section) << power_of_two; + The alignment must be a power of two. But if the section does + not have any alignment requirement then do not increase the + alignment unnecessarily. */ + if (power_of_two) + alignment = bfd_octets_per_byte (output_bfd, section) << power_of_two; + else + alignment = 1; BFD_ASSERT (alignment != 0 && (alignment & -alignment) == alignment); section->size += alignment - 1; section->size &= -alignment; -- 2.30.2