diff options
author | Alan Modra <amodra@gmail.com> | 2019-05-27 15:38:55 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-05-28 10:05:02 +0930 |
commit | 0eb32b6e1dee07ac199b4bba855205e4de099213 (patch) | |
tree | 88dc12d092aaa765abbad027322f67724abbb457 /bfd/xcofflink.c | |
parent | 58db964680f0f17197849a714c30430deafb8bc7 (diff) | |
download | gdb-0eb32b6e1dee07ac199b4bba855205e4de099213.zip gdb-0eb32b6e1dee07ac199b4bba855205e4de099213.tar.gz gdb-0eb32b6e1dee07ac199b4bba855205e4de099213.tar.bz2 |
XCOFF linker segmentation fault
The XCOFF linker temporarily trims the output bfd section list,
without adjusting section_count to suit. This is a little rude, but
the dwarf line number code can easily cope with this situation. So
check for a NULL end of list as well as limiting the saved section
VMAs to the first section_count list entries.
Also fixes
-FAIL: Weak test 3 (main, static) (32-bit)
-FAIL: Weak test 3 (main, static) (64-bit)
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
section list before returning error.
Diffstat (limited to 'bfd/xcofflink.c')
-rw-r--r-- | bfd/xcofflink.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index e7f50d1..f9c12e4 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -1882,7 +1882,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) if (EXTERN_SYM_P (sym.n_sclass)) { - bfd_boolean copy; + bfd_boolean copy, ok; flagword flags; BFD_ASSERT (section != NULL); @@ -2022,12 +2022,12 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) BFD_ASSERT (last_real->next == first_csect); last_real->next = NULL; flags = (sym.n_sclass == C_EXT ? BSF_GLOBAL : BSF_WEAK); - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, name, flags, section, value, - NULL, copy, TRUE, - (struct bfd_link_hash_entry **) sym_hash))) - goto error_return; + ok = (_bfd_generic_link_add_one_symbol + (info, abfd, name, flags, section, value, NULL, copy, TRUE, + (struct bfd_link_hash_entry **) sym_hash)); last_real->next = first_csect; + if (!ok) + goto error_return; if (smtyp == XTY_CM) { |