From a7b34aba62ce347b4e64ca197a5c8b997e3b72df Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 27 May 2019 20:00:11 +0930 Subject: [PATCH] Obsolete tic30-aout, and linker segmentation faults See also the FIXME. tic30-aout linker support is so bad (and has been that way since the initial tic30-aout commit) that I'm obsoleting the target. This patch fixes numerous linker testsuite segmentation faults. PR 24596 * aout-tic30.c (MY_bfd_final_link): Don't segfault on missing create_object_symbols_section, obj_textsec, obj_datasec or obj_bsssec. Fix other errors in placement. * config.bfd: Obsolete tic30-aout. --- bfd/ChangeLog | 8 ++++ bfd/aout-tic30.c | 98 ++++++++++++++++++++++++++++++++---------------- bfd/config.bfd | 1 + 3 files changed, 75 insertions(+), 32 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3460d78f3f..254ebcb2cd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2019-05-28 Alan Modra + + PR 24596 + * aout-tic30.c (MY_bfd_final_link): Don't segfault on missing + create_object_symbols_section, obj_textsec, obj_datasec or + obj_bsssec. Fix other errors in placement. + * config.bfd: Obsolete tic30-aout. + 2019-05-28 Alan Modra PR 24596 diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index c872e9b416..49463181f0 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -710,53 +710,87 @@ static bfd_boolean MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) { struct internal_exec *execp = exec_hdr (abfd); + asection *objsym_section; file_ptr pos; bfd_vma vma = 0; - int pad; /* Set the executable header size to 0, as we don't want one for an - output. */ + output. FIXME: Really? tic30_aout_object_p doesn't accept such + an executable! */ adata (abfd).exec_bytes_size = 0; + pos = adata (abfd).exec_bytes_size; + /* ??? Why are we looking at create_object_symbols_section? */ + objsym_section = info->create_object_symbols_section; + if (objsym_section != NULL) + vma = objsym_section->vma; + /* Text. */ - vma = info->create_object_symbols_section->vma; - pos += vma; - obj_textsec (abfd)->filepos = pos; - obj_textsec (abfd)->vma = vma; - obj_textsec (abfd)->user_set_vma = 1; - pos += obj_textsec (abfd)->size; - vma += obj_textsec (abfd)->size; + if (obj_textsec (abfd) != NULL) + { + pos += vma; + obj_textsec (abfd)->filepos = pos; + obj_textsec (abfd)->vma = vma; + obj_textsec (abfd)->user_set_vma = 1; + execp->a_text = obj_textsec (abfd)->size; + pos += obj_textsec (abfd)->size; + vma += obj_textsec (abfd)->size; + } /* Data. */ - if (abfd->flags & D_PAGED) + if (obj_datasec (abfd) != NULL) { - if (info->create_object_symbols_section->next->vma > 0) - obj_datasec (abfd)->vma = info->create_object_symbols_section->next->vma; + if (abfd->flags & D_PAGED) + { + if (objsym_section != NULL + && objsym_section->next != NULL + && objsym_section->next->vma != 0) + obj_datasec (abfd)->vma = objsym_section->next->vma; + else + obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); + } else - obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); + obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); + + if (obj_datasec (abfd)->vma < vma) + obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); + + pos += obj_datasec (abfd)->vma - vma; + obj_datasec (abfd)->filepos = pos; + obj_datasec (abfd)->user_set_vma = 1; + + vma = obj_datasec (abfd)->vma; + if (obj_textsec (abfd) != NULL) + { + execp->a_text = vma - obj_textsec (abfd)->vma; + obj_textsec (abfd)->size = execp->a_text; + } + execp->a_data = obj_datasec (abfd)->size; + vma += obj_datasec (abfd)->size; } - else - obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); - - if (obj_datasec (abfd)->vma < vma) - obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); - - obj_datasec (abfd)->user_set_vma = 1; - vma = obj_datasec (abfd)->vma; - obj_datasec (abfd)->filepos = vma + adata (abfd).exec_bytes_size; - execp->a_text = vma - obj_textsec (abfd)->vma; - obj_textsec (abfd)->size = execp->a_text; /* Since BSS follows data immediately, see if it needs alignment. */ - vma += obj_datasec (abfd)->size; - pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma; - obj_datasec (abfd)->size += pad; - pos += obj_datasec (abfd)->size; - execp->a_data = obj_datasec (abfd)->size; + if (obj_bsssec (abfd) != NULL) + { + int pad; - /* BSS. */ - obj_bsssec (abfd)->vma = vma; - obj_bsssec (abfd)->user_set_vma = 1; + pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma; + if (obj_datasec (abfd) != NULL) + { + obj_datasec (abfd)->size += pad; + execp->a_data += pad; + } + else if (obj_textsec (abfd) != NULL) + { + obj_textsec (abfd)->size += pad; + execp->a_text += pad; + } + + /* BSS. */ + vma += pad; + obj_bsssec (abfd)->vma = vma; + obj_bsssec (abfd)->user_set_vma = 1; + } /* We are fully resized, so don't readjust in final_link. */ adata (abfd).magic = z_magic; diff --git a/bfd/config.bfd b/bfd/config.bfd index 8bc330e41a..c6b04ea4a5 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -53,6 +53,7 @@ case $targ in echo "*** Use or1k-*-elf or or1k-*-linux as the target instead" >&2 exit 1 ;; + c30-*-*aout* | tic30-*-*aout* | \ null) if test "x$enable_obsolete" != xyes; then echo "*** Configuration $targ is obsolete." >&2