From 759388538d1339f6a634b2777e24f46427dd9c96 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 18 Aug 2014 09:33:35 +0930 Subject: [PATCH] Return error status from bfd_elf_discard_info. bfd/ * elflink.c (bfd_elf_discard_info): Return int error status. * stabs.c (_bfd_discard_section_stabs): Comment typo fix. * bfd-in.h (bfd_elf_discard_info): Updata prototype. * bfd-in2.h: Regenerate. ld/ * emultempl/aarch64elf.em (gld${EMULATION_NAME}_after_allocation): Handle error status from bfd_elf_discard_info. * emultempl/armelf.em: Likewise. * emultempl/elf32.em: Likewise. * emultempl/hppaelf.em: Likewise. * emultempl/metagelf.em: Likewise. * emultempl/nios2elf.em: Likewise. * emultempl/ppc64elf.em: Likewise. * emultempl/tic6xdsbt.em: Likewise. * emultempl/vms.em: Likewise. --- bfd/ChangeLog | 7 +++++++ bfd/bfd-in.h | 2 +- bfd/bfd-in2.h | 2 +- bfd/elflink.c | 28 ++++++++++++++-------------- bfd/stabs.c | 2 +- ld/ChangeLog | 13 +++++++++++++ ld/emultempl/aarch64elf.em | 15 +++++++++++---- ld/emultempl/armelf.em | 13 ++++++++++--- ld/emultempl/elf32.em | 9 ++++++--- ld/emultempl/hppaelf.em | 14 ++++++++++---- ld/emultempl/metagelf.em | 14 ++++++++++---- ld/emultempl/nios2elf.em | 14 ++++++++++---- ld/emultempl/ppc64elf.em | 12 ++++++++++-- ld/emultempl/tic6xdsbt.em | 9 ++++++++- ld/emultempl/vms.em | 9 ++++++--- 15 files changed, 118 insertions(+), 45 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a23a2c3b8f3..508a20a2a9c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2014-08-18 Alan Modra + + * elflink.c (bfd_elf_discard_info): Return int error status. + * stabs.c (_bfd_discard_section_stabs): Comment typo fix. + * bfd-in.h (bfd_elf_discard_info): Updata prototype. + * bfd-in2.h: Regenerate. + 2014-08-14 Alan Modra * peXXigen.c (pe_print_reloc): Protect against access past end diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 83f125bd8e5..bcb9fdc5f93 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -658,7 +658,7 @@ extern int bfd_elf_get_dyn_lib_class (bfd *); extern struct bfd_link_needed_list *bfd_elf_get_runpath_list (bfd *, struct bfd_link_info *); -extern bfd_boolean bfd_elf_discard_info +extern int bfd_elf_discard_info (bfd *, struct bfd_link_info *); extern unsigned int _bfd_elf_default_action_discarded (struct bfd_section *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 8c77c813093..27fc3fea2eb 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -665,7 +665,7 @@ extern int bfd_elf_get_dyn_lib_class (bfd *); extern struct bfd_link_needed_list *bfd_elf_get_runpath_list (bfd *, struct bfd_link_info *); -extern bfd_boolean bfd_elf_discard_info +extern int bfd_elf_discard_info (bfd *, struct bfd_link_info *); extern unsigned int _bfd_elf_default_action_discarded (struct bfd_section *); diff --git a/bfd/elflink.c b/bfd/elflink.c index 5e5af3265fe..d20f357e2cc 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -12629,21 +12629,21 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie) } /* Discard unneeded references to discarded sections. - Returns TRUE if any section's size was changed. */ -/* This function assumes that the relocations are in sorted order, - which is true for all known assemblers. */ + Returns -1 on error, 1 if any section's size was changed, 0 if + nothing changed. This function assumes that the relocations are in + sorted order, which is true for all known assemblers. */ -bfd_boolean +int bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) { struct elf_reloc_cookie cookie; asection *o; bfd *abfd; - bfd_boolean ret = FALSE; + int changed = 0; if (info->traditional_format || !is_elf_hash_table (info->hash)) - return FALSE; + return 0; o = bfd_get_section_by_name (output_bfd, ".stab"); if (o != NULL) @@ -12662,13 +12662,13 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) continue; if (!init_reloc_cookie_for_section (&cookie, info, i)) - return FALSE; + return -1; if (_bfd_discard_section_stabs (abfd, i, elf_section_data (i)->sec_info, bfd_elf_reloc_symbol_deleted_p, &cookie)) - ret = TRUE; + changed = 1; fini_reloc_cookie_for_section (&cookie, i); } @@ -12692,13 +12692,13 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) continue; if (!init_reloc_cookie_for_section (&cookie, info, i)) - return FALSE; + return -1; _bfd_elf_parse_eh_frame (abfd, info, i, &cookie); if (_bfd_elf_discard_section_eh_frame (abfd, info, i, bfd_elf_reloc_symbol_deleted_p, &cookie)) - ret = TRUE; + changed = 1; fini_reloc_cookie_for_section (&cookie, i); } @@ -12717,10 +12717,10 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) if (bed->elf_backend_discard_info != NULL) { if (!init_reloc_cookie (&cookie, info, abfd)) - return FALSE; + return -1; if ((*bed->elf_backend_discard_info) (abfd, &cookie, info)) - ret = TRUE; + changed = 1; fini_reloc_cookie (&cookie, abfd); } @@ -12729,9 +12729,9 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) if (info->eh_frame_hdr && !info->relocatable && _bfd_elf_discard_section_eh_frame_hdr (output_bfd, info)) - ret = TRUE; + changed = 1; - return ret; + return changed; } bfd_boolean diff --git a/bfd/stabs.c b/bfd/stabs.c index 784eb977e19..e6526c5148b 100644 --- a/bfd/stabs.c +++ b/bfd/stabs.c @@ -536,7 +536,7 @@ _bfd_discard_section_stabs (bfd *abfd, link, so we should just ignore them. */ return FALSE; - /* We should have initialized our data in _bfd_link_stab_sections. + /* We should have initialized our data in _bfd_link_section_stabs. If there was some bizarre error reading the string sections, though, we might not have. Bail rather than asserting. */ if (psecinfo == NULL) diff --git a/ld/ChangeLog b/ld/ChangeLog index 773afba9b24..2c1ec6af9c5 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2014-08-18 Alan Modra + + * emultempl/aarch64elf.em (gld${EMULATION_NAME}_after_allocation): + Handle error status from bfd_elf_discard_info. + * emultempl/armelf.em: Likewise. + * emultempl/elf32.em: Likewise. + * emultempl/hppaelf.em: Likewise. + * emultempl/metagelf.em: Likewise. + * emultempl/nios2elf.em: Likewise. + * emultempl/ppc64elf.em: Likewise. + * emultempl/tic6xdsbt.em: Likewise. + * emultempl/vms.em: Likewise. + 2014-08-14 Alan Modra PR 16563 diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em index 6134855409d..bb589012061 100644 --- a/ld/emultempl/aarch64elf.em +++ b/ld/emultempl/aarch64elf.em @@ -219,20 +219,27 @@ build_section_lists (lang_statement_union_type *statement) static void gld${EMULATION_NAME}_after_allocation (void) { + int ret; + /* bfd_elf32_discard_info just plays with debugging sections, ie. doesn't affect any code, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (link_info.output_bfd, & link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, & link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd, - & link_info); - + ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd, + &link_info); if (ret != 0) { if (ret < 0) diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index 34028eefac4..371b440cecb 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -271,6 +271,8 @@ compare_output_sec_vma (const void *a, const void *b) static void gld${EMULATION_NAME}_after_allocation (void) { + int ret; + if (!link_info.relocatable) { /* Build a sorted list of input text sections, then use that to process @@ -325,15 +327,20 @@ gld${EMULATION_NAME}_after_allocation (void) ie. doesn't affect any code, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (link_info.output_bfd, & link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, & link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = elf32_arm_setup_section_lists (link_info.output_bfd, & link_info); - + ret = elf32_arm_setup_section_lists (link_info.output_bfd, &link_info); if (ret != 0) { if (ret < 0) diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 39b4ccd4f17..67c437daca4 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1942,9 +1942,12 @@ fragment < 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = elf32_hppa_setup_section_lists (link_info.output_bfd, - &link_info); - + ret = elf32_hppa_setup_section_lists (link_info.output_bfd, &link_info); if (ret != 0) { if (ret < 0) diff --git a/ld/emultempl/metagelf.em b/ld/emultempl/metagelf.em index 1f77ecd0a27..97739dc710d 100644 --- a/ld/emultempl/metagelf.em +++ b/ld/emultempl/metagelf.em @@ -219,20 +219,26 @@ build_section_lists (lang_statement_union_type *statement) static void gld${EMULATION_NAME}_after_allocation (void) { + int ret; + /* bfd_elf_discard_info just plays with data and debugging sections, ie. doesn't affect code size, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (link_info.output_bfd, &link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, &link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = elf_metag_setup_section_lists (link_info.output_bfd, - &link_info); - + ret = elf_metag_setup_section_lists (link_info.output_bfd, &link_info); if (ret != 0) { if (ret < 0) diff --git a/ld/emultempl/nios2elf.em b/ld/emultempl/nios2elf.em index 991a11b9f2f..bdf54a3e03f 100644 --- a/ld/emultempl/nios2elf.em +++ b/ld/emultempl/nios2elf.em @@ -236,20 +236,26 @@ build_section_lists (lang_statement_union_type *statement) static void gld${EMULATION_NAME}_after_allocation (void) { + int ret; + /* bfd_elf_discard_info just plays with data and debugging sections, ie. doesn't affect code size, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (link_info.output_bfd, &link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, &link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable && RELAXATION_ENABLED) { - int ret = nios2_elf32_setup_section_lists (link_info.output_bfd, - &link_info); - + ret = nios2_elf32_setup_section_lists (link_info.output_bfd, &link_info); if (ret != 0) { if (ret < 0) diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index d45fdacf2da..3e316af9751 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -458,18 +458,26 @@ build_section_lists (lang_statement_union_type *statement) static void gld${EMULATION_NAME}_after_allocation (void) { + int ret; + /* bfd_elf_discard_info just plays with data and debugging sections, ie. doesn't affect code size, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (link_info.output_bfd, &link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, &link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) need_laying_out = 1; /* If generating a relocatable output file, then we don't have any stubs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = ppc64_elf_setup_section_lists (&link_info); + ret = ppc64_elf_setup_section_lists (&link_info); if (ret < 0) einfo ("%X%P: can not size stub section: %E\n"); else if (ret > 0) diff --git a/ld/emultempl/tic6xdsbt.em b/ld/emultempl/tic6xdsbt.em index ca957c4bcfe..ff591f13ead 100644 --- a/ld/emultempl/tic6xdsbt.em +++ b/ld/emultempl/tic6xdsbt.em @@ -95,6 +95,7 @@ static void gld${EMULATION_NAME}_after_allocation (void) { int layout_changed = 0; + int ret; if (!link_info.relocatable) { @@ -149,7 +150,13 @@ gld${EMULATION_NAME}_after_allocation (void) /* bfd_elf32_discard_info just plays with debugging sections, ie. doesn't affect any code, so we can delay resizing the sections. */ - if (bfd_elf_discard_info (link_info.output_bfd, & link_info)) + ret = bfd_elf_discard_info (link_info.output_bfd, & link_info); + if (ret < 0) + { + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + return; + } + else if (ret > 0) layout_changed = 1; gld${EMULATION_NAME}_map_segments (layout_changed); diff --git a/ld/emultempl/vms.em b/ld/emultempl/vms.em index b1f61d5b3b0..40be66d8f13 100644 --- a/ld/emultempl/vms.em +++ b/ld/emultempl/vms.em @@ -207,9 +207,12 @@ gld${EMULATION_NAME}_before_allocation (void) static void gld${EMULATION_NAME}_after_allocation (void) { - bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd, - &link_info); - gld${EMULATION_NAME}_map_segments (need_layout); + int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info); + + if (need_layout < 0) + einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + else + gld${EMULATION_NAME}_map_segments (need_layout); } static void -- 2.30.2