From 7a8213503e25998e2610d5a8c0b19eefb5e41596 Mon Sep 17 00:00:00 2001 From: Romain Naour Date: Sat, 30 Nov 2019 03:12:37 +0100 Subject: [PATCH] Revert "PR24311, FAIL: S-records with constructors" This reverts commit ebd2263ba9a9124d93bbc0ece63d7e0fae89b40e. Revert this patch since it prevent booting a sh4 system under Qemu as reported on the Binutils mailing list [1]. This commit is not related to sh4, it's weird that it is the only affected architecture. [1] https://sourceware.org/ml/binutils/2019-10/msg00105.html [2] https://sourceware.org/ml/binutils/2019-11/msg00407.html Signed-off-by: Romain Naour --- bfd/merge.c | 52 ++++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/bfd/merge.c b/bfd/merge.c index 632c8523903..fb7c0858beb 100644 --- a/bfd/merge.c +++ b/bfd/merge.c @@ -621,7 +621,7 @@ is_suffix (const struct sec_merge_hash_entry *A, /* This is a helper function for _bfd_merge_sections. It attempts to merge strings matching suffixes of longer strings. */ -static struct sec_merge_sec_info * +static bfd_boolean merge_strings (struct sec_merge_info *sinfo) { struct sec_merge_hash_entry **array, **a, *e; @@ -633,7 +633,7 @@ merge_strings (struct sec_merge_info *sinfo) amt = sinfo->htab->size * sizeof (struct sec_merge_hash_entry *); array = (struct sec_merge_hash_entry **) bfd_malloc (amt); if (array == NULL) - return NULL; + return FALSE; for (e = sinfo->htab->first, a = array; e; e = e->next) if (e->alignment) @@ -703,6 +703,11 @@ merge_strings (struct sec_merge_info *sinfo) } } secinfo->sec->size = size; + if (secinfo->sec->alignment_power != 0) + { + bfd_size_type align = (bfd_size_type) 1 << secinfo->sec->alignment_power; + secinfo->sec->size = (secinfo->sec->size + align - 1) & -align; + } /* And now adjust the rest, removing them from the chain (but not hashtable) at the same time. */ @@ -719,7 +724,7 @@ merge_strings (struct sec_merge_info *sinfo) e->u.index = e->u.suffix->u.index + (e->u.suffix->len - e->len); } } - return secinfo; + return TRUE; } /* This function is called once after all SEC_MERGE sections are registered @@ -735,8 +740,7 @@ _bfd_merge_sections (bfd *abfd, for (sinfo = (struct sec_merge_info *) xsinfo; sinfo; sinfo = sinfo->next) { - struct sec_merge_sec_info *secinfo; - bfd_size_type align; + struct sec_merge_sec_info * secinfo; if (! sinfo->chain) continue; @@ -747,7 +751,6 @@ _bfd_merge_sections (bfd *abfd, secinfo->next = NULL; /* Record the sections into the hash table. */ - align = 1; for (secinfo = sinfo->chain; secinfo; secinfo = secinfo->next) if (secinfo->sec->flags & SEC_EXCLUDE) { @@ -755,25 +758,18 @@ _bfd_merge_sections (bfd *abfd, if (remove_hook) (*remove_hook) (abfd, secinfo->sec); } - else - { - if (!record_section (sinfo, secinfo)) - return FALSE; - if (align) - { - align = (bfd_size_type) 1 << secinfo->sec->alignment_power; - if ((secinfo->sec->size & (align - 1)) != 0) - align = 0; - } - } + else if (! record_section (sinfo, secinfo)) + return FALSE; + + if (secinfo) + continue; if (sinfo->htab->first == NULL) continue; if (sinfo->htab->strings) { - secinfo = merge_strings (sinfo); - if (!secinfo) + if (!merge_strings (sinfo)) return FALSE; } else @@ -793,7 +789,8 @@ _bfd_merge_sections (bfd *abfd, e->secinfo->first_str = e; size = 0; } - size = (size + e->alignment - 1) & ~((bfd_vma) e->alignment - 1); + size = (size + e->alignment - 1) + & ~((bfd_vma) e->alignment - 1); e->u.index = size; size += e->len; secinfo = e->secinfo; @@ -801,16 +798,11 @@ _bfd_merge_sections (bfd *abfd, secinfo->sec->size = size; } - /* If the input sections were padded according to their alignments, - then pad the output too. */ - if (align) - secinfo->sec->size = (secinfo->sec->size + align - 1) & -align; - - /* Finally remove all input sections which have not made it into - the hash table at all. */ - for (secinfo = sinfo->chain; secinfo; secinfo = secinfo->next) - if (secinfo->first_str == NULL) - secinfo->sec->flags |= SEC_EXCLUDE | SEC_KEEP; + /* Finally remove all input sections which have not made it into + the hash table at all. */ + for (secinfo = sinfo->chain; secinfo; secinfo = secinfo->next) + if (secinfo->first_str == NULL) + secinfo->sec->flags |= SEC_EXCLUDE | SEC_KEEP; } return TRUE; -- 2.23.0