diff options
Diffstat (limited to 'system/binutils/srec.patch')
-rw-r--r-- | system/binutils/srec.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/system/binutils/srec.patch b/system/binutils/srec.patch new file mode 100644 index 000000000..ce3eac10b --- /dev/null +++ b/system/binutils/srec.patch @@ -0,0 +1,127 @@ +X-Git-Url: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blobdiff_plain;f=bfd%2Fmerge.c;h=632c852390355829f95e149b7d72f0982a1a0b2b;hp=fb7c0858bebb27b5375564054c148b2b68124554;hb=ebd2263ba9a9124d93bbc0ece63d7e0fae89b40e;hpb=65d8004072ccb15441c143c380949d785a8446cd + +diff --git a/bfd/merge.c b/bfd/merge.c +index fb7c085..632c852 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 bfd_boolean ++static struct sec_merge_sec_info * + 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 FALSE; ++ return NULL; + + for (e = sinfo->htab->first, a = array; e; e = e->next) + if (e->alignment) +@@ -703,11 +703,6 @@ 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. */ +@@ -724,7 +719,7 @@ merge_strings (struct sec_merge_info *sinfo) + e->u.index = e->u.suffix->u.index + (e->u.suffix->len - e->len); + } + } +- return TRUE; ++ return secinfo; + } + + /* This function is called once after all SEC_MERGE sections are registered +@@ -740,7 +735,8 @@ _bfd_merge_sections (bfd *abfd, + + for (sinfo = (struct sec_merge_info *) xsinfo; sinfo; sinfo = sinfo->next) + { +- struct sec_merge_sec_info * secinfo; ++ struct sec_merge_sec_info *secinfo; ++ bfd_size_type align; + + if (! sinfo->chain) + continue; +@@ -751,6 +747,7 @@ _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) + { +@@ -758,18 +755,25 @@ _bfd_merge_sections (bfd *abfd, + if (remove_hook) + (*remove_hook) (abfd, secinfo->sec); + } +- else if (! record_section (sinfo, secinfo)) +- return FALSE; +- +- if (secinfo) +- continue; ++ 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; ++ } ++ } + + if (sinfo->htab->first == NULL) + continue; + + if (sinfo->htab->strings) + { +- if (!merge_strings (sinfo)) ++ secinfo = merge_strings (sinfo); ++ if (!secinfo) + return FALSE; + } + else +@@ -789,8 +793,7 @@ _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; +@@ -798,11 +801,16 @@ _bfd_merge_sections (bfd *abfd, + secinfo->sec->size = size; + } + +- /* 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; ++ /* 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; + } + + return TRUE; |