aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-05-27 20:00:11 +0930
committerAlan Modra <amodra@gmail.com>2019-05-28 10:55:21 +0930
commita7b34aba62ce347b4e64ca197a5c8b997e3b72df (patch)
treeb9385b316cffcab665d9c580d6353bba23859770
parent0eb32b6e1dee07ac199b4bba855205e4de099213 (diff)
downloadgdb-a7b34aba62ce347b4e64ca197a5c8b997e3b72df.zip
gdb-a7b34aba62ce347b4e64ca197a5c8b997e3b72df.tar.gz
gdb-a7b34aba62ce347b4e64ca197a5c8b997e3b72df.tar.bz2
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.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/aout-tic30.c98
-rw-r--r--bfd/config.bfd1
3 files changed, 75 insertions, 32 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3460d78..254ebcb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,14 @@
2019-05-28 Alan Modra <amodra@gmail.com>
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 <amodra@gmail.com>
+
+ PR 24596
* dwarf2.c (save_section_vma, section_vma_same): Check for NULL
end of section list as well as section_count.
* xcofflink.c (xcoff_link_add_symbols): Fix temporarily changed
diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c
index c872e9b..4946318 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);
- }
- else
- obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
+ obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4);
- if (obj_datasec (abfd)->vma < vma)
- 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;
+ 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;
+ }
/* 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;
-
- /* BSS. */
- obj_bsssec (abfd)->vma = vma;
- obj_bsssec (abfd)->user_set_vma = 1;
+ if (obj_bsssec (abfd) != NULL)
+ {
+ int pad;
+
+ 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 8bc330e..c6b04ea 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