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.
This commit is contained in:
Alan Modra 2014-08-18 09:33:35 +09:30
parent 1e53931944
commit 759388538d
15 changed files with 118 additions and 45 deletions

View File

@ -1,3 +1,10 @@
2014-08-18 Alan Modra <amodra@gmail.com>
* 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 <amodra@gmail.com> 2014-08-14 Alan Modra <amodra@gmail.com>
* peXXigen.c (pe_print_reloc): Protect against access past end * peXXigen.c (pe_print_reloc): Protect against access past end

View File

@ -658,7 +658,7 @@ extern int bfd_elf_get_dyn_lib_class
(bfd *); (bfd *);
extern struct bfd_link_needed_list *bfd_elf_get_runpath_list extern struct bfd_link_needed_list *bfd_elf_get_runpath_list
(bfd *, struct bfd_link_info *); (bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_elf_discard_info extern int bfd_elf_discard_info
(bfd *, struct bfd_link_info *); (bfd *, struct bfd_link_info *);
extern unsigned int _bfd_elf_default_action_discarded extern unsigned int _bfd_elf_default_action_discarded
(struct bfd_section *); (struct bfd_section *);

View File

@ -665,7 +665,7 @@ extern int bfd_elf_get_dyn_lib_class
(bfd *); (bfd *);
extern struct bfd_link_needed_list *bfd_elf_get_runpath_list extern struct bfd_link_needed_list *bfd_elf_get_runpath_list
(bfd *, struct bfd_link_info *); (bfd *, struct bfd_link_info *);
extern bfd_boolean bfd_elf_discard_info extern int bfd_elf_discard_info
(bfd *, struct bfd_link_info *); (bfd *, struct bfd_link_info *);
extern unsigned int _bfd_elf_default_action_discarded extern unsigned int _bfd_elf_default_action_discarded
(struct bfd_section *); (struct bfd_section *);

View File

@ -12629,21 +12629,21 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
} }
/* Discard unneeded references to discarded sections. /* Discard unneeded references to discarded sections.
Returns TRUE if any section's size was changed. */ Returns -1 on error, 1 if any section's size was changed, 0 if
/* This function assumes that the relocations are in sorted order, nothing changed. This function assumes that the relocations are in
which is true for all known assemblers. */ sorted order, which is true for all known assemblers. */
bfd_boolean int
bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info) bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
{ {
struct elf_reloc_cookie cookie; struct elf_reloc_cookie cookie;
asection *o; asection *o;
bfd *abfd; bfd *abfd;
bfd_boolean ret = FALSE; int changed = 0;
if (info->traditional_format if (info->traditional_format
|| !is_elf_hash_table (info->hash)) || !is_elf_hash_table (info->hash))
return FALSE; return 0;
o = bfd_get_section_by_name (output_bfd, ".stab"); o = bfd_get_section_by_name (output_bfd, ".stab");
if (o != NULL) if (o != NULL)
@ -12662,13 +12662,13 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
continue; continue;
if (!init_reloc_cookie_for_section (&cookie, info, i)) if (!init_reloc_cookie_for_section (&cookie, info, i))
return FALSE; return -1;
if (_bfd_discard_section_stabs (abfd, i, if (_bfd_discard_section_stabs (abfd, i,
elf_section_data (i)->sec_info, elf_section_data (i)->sec_info,
bfd_elf_reloc_symbol_deleted_p, bfd_elf_reloc_symbol_deleted_p,
&cookie)) &cookie))
ret = TRUE; changed = 1;
fini_reloc_cookie_for_section (&cookie, i); fini_reloc_cookie_for_section (&cookie, i);
} }
@ -12692,13 +12692,13 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
continue; continue;
if (!init_reloc_cookie_for_section (&cookie, info, i)) if (!init_reloc_cookie_for_section (&cookie, info, i))
return FALSE; return -1;
_bfd_elf_parse_eh_frame (abfd, info, i, &cookie); _bfd_elf_parse_eh_frame (abfd, info, i, &cookie);
if (_bfd_elf_discard_section_eh_frame (abfd, info, i, if (_bfd_elf_discard_section_eh_frame (abfd, info, i,
bfd_elf_reloc_symbol_deleted_p, bfd_elf_reloc_symbol_deleted_p,
&cookie)) &cookie))
ret = TRUE; changed = 1;
fini_reloc_cookie_for_section (&cookie, i); 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 (bed->elf_backend_discard_info != NULL)
{ {
if (!init_reloc_cookie (&cookie, info, abfd)) if (!init_reloc_cookie (&cookie, info, abfd))
return FALSE; return -1;
if ((*bed->elf_backend_discard_info) (abfd, &cookie, info)) if ((*bed->elf_backend_discard_info) (abfd, &cookie, info))
ret = TRUE; changed = 1;
fini_reloc_cookie (&cookie, abfd); 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 if (info->eh_frame_hdr
&& !info->relocatable && !info->relocatable
&& _bfd_elf_discard_section_eh_frame_hdr (output_bfd, info)) && _bfd_elf_discard_section_eh_frame_hdr (output_bfd, info))
ret = TRUE; changed = 1;
return ret; return changed;
} }
bfd_boolean bfd_boolean

View File

@ -536,7 +536,7 @@ _bfd_discard_section_stabs (bfd *abfd,
link, so we should just ignore them. */ link, so we should just ignore them. */
return FALSE; 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, If there was some bizarre error reading the string sections, though,
we might not have. Bail rather than asserting. */ we might not have. Bail rather than asserting. */
if (psecinfo == NULL) if (psecinfo == NULL)

View File

@ -1,3 +1,16 @@
2014-08-18 Alan Modra <amodra@gmail.com>
* 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 <amodra@gmail.com> 2014-08-14 Alan Modra <amodra@gmail.com>
PR 16563 PR 16563

View File

@ -219,20 +219,27 @@ build_section_lists (lang_statement_union_type *statement)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
/* bfd_elf32_discard_info just plays with debugging sections, /* bfd_elf32_discard_info just plays with debugging sections,
ie. doesn't affect any code, so we can delay resizing the ie. doesn't affect any code, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't /* If generating a relocatable output file, then we don't
have to examine the relocs. */ have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable) if (stub_file != NULL && !link_info.relocatable)
{ {
int ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd, ret = elf${ELFSIZE}_aarch64_setup_section_lists (link_info.output_bfd,
& link_info); &link_info);
if (ret != 0) if (ret != 0)
{ {
if (ret < 0) if (ret < 0)

View File

@ -271,6 +271,8 @@ compare_output_sec_vma (const void *a, const void *b)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
if (!link_info.relocatable) if (!link_info.relocatable)
{ {
/* Build a sorted list of input text sections, then use that to process /* 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 ie. doesn't affect any code, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't /* If generating a relocatable output file, then we don't
have to examine the relocs. */ have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable) 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)
{ {
if (ret < 0) if (ret < 0)

View File

@ -1942,9 +1942,12 @@ fragment <<EOF
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd, int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
&link_info);
gld${EMULATION_NAME}_map_segments (need_layout); if (need_layout < 0)
einfo ("%X%P: .eh_frame/.stab edit: %E\n");
else
gld${EMULATION_NAME}_map_segments (need_layout);
} }
EOF EOF
fi fi

View File

@ -242,20 +242,26 @@ build_section_lists (lang_statement_union_type *statement)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
/* bfd_elf_discard_info just plays with data and debugging sections, /* bfd_elf_discard_info just plays with data and debugging sections,
ie. doesn't affect code size, so we can delay resizing the ie. doesn't affect code size, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't /* If generating a relocatable output file, then we don't
have to examine the relocs. */ have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable) if (stub_file != NULL && !link_info.relocatable)
{ {
int ret = elf32_hppa_setup_section_lists (link_info.output_bfd, ret = elf32_hppa_setup_section_lists (link_info.output_bfd, &link_info);
&link_info);
if (ret != 0) if (ret != 0)
{ {
if (ret < 0) if (ret < 0)

View File

@ -219,20 +219,26 @@ build_section_lists (lang_statement_union_type *statement)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
/* bfd_elf_discard_info just plays with data and debugging sections, /* bfd_elf_discard_info just plays with data and debugging sections,
ie. doesn't affect code size, so we can delay resizing the ie. doesn't affect code size, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't /* If generating a relocatable output file, then we don't
have to examine the relocs. */ have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable) if (stub_file != NULL && !link_info.relocatable)
{ {
int ret = elf_metag_setup_section_lists (link_info.output_bfd, ret = elf_metag_setup_section_lists (link_info.output_bfd, &link_info);
&link_info);
if (ret != 0) if (ret != 0)
{ {
if (ret < 0) if (ret < 0)

View File

@ -236,20 +236,26 @@ build_section_lists (lang_statement_union_type *statement)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
/* bfd_elf_discard_info just plays with data and debugging sections, /* bfd_elf_discard_info just plays with data and debugging sections,
ie. doesn't affect code size, so we can delay resizing the ie. doesn't affect code size, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't /* If generating a relocatable output file, then we don't
have to examine the relocs. */ have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable && RELAXATION_ENABLED) if (stub_file != NULL && !link_info.relocatable && RELAXATION_ENABLED)
{ {
int ret = nios2_elf32_setup_section_lists (link_info.output_bfd, ret = nios2_elf32_setup_section_lists (link_info.output_bfd, &link_info);
&link_info);
if (ret != 0) if (ret != 0)
{ {
if (ret < 0) if (ret < 0)

View File

@ -458,18 +458,26 @@ build_section_lists (lang_statement_union_type *statement)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int ret;
/* bfd_elf_discard_info just plays with data and debugging sections, /* bfd_elf_discard_info just plays with data and debugging sections,
ie. doesn't affect code size, so we can delay resizing the ie. doesn't affect code size, so we can delay resizing the
sections. It's likely we'll resize everything in the process of sections. It's likely we'll resize everything in the process of
adding stubs. */ 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; need_laying_out = 1;
/* If generating a relocatable output file, then we don't have any /* If generating a relocatable output file, then we don't have any
stubs. */ stubs. */
if (stub_file != NULL && !link_info.relocatable) 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) if (ret < 0)
einfo ("%X%P: can not size stub section: %E\n"); einfo ("%X%P: can not size stub section: %E\n");
else if (ret > 0) else if (ret > 0)

View File

@ -95,6 +95,7 @@ static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
int layout_changed = 0; int layout_changed = 0;
int ret;
if (!link_info.relocatable) if (!link_info.relocatable)
{ {
@ -149,7 +150,13 @@ gld${EMULATION_NAME}_after_allocation (void)
/* bfd_elf32_discard_info just plays with debugging sections, /* bfd_elf32_discard_info just plays with debugging sections,
ie. doesn't affect any code, so we can delay resizing the ie. doesn't affect any code, so we can delay resizing the
sections. */ 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; layout_changed = 1;
gld${EMULATION_NAME}_map_segments (layout_changed); gld${EMULATION_NAME}_map_segments (layout_changed);

View File

@ -207,9 +207,12 @@ gld${EMULATION_NAME}_before_allocation (void)
static void static void
gld${EMULATION_NAME}_after_allocation (void) gld${EMULATION_NAME}_after_allocation (void)
{ {
bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd, int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
&link_info);
gld${EMULATION_NAME}_map_segments (need_layout); if (need_layout < 0)
einfo ("%X%P: .eh_frame/.stab edit: %E\n");
else
gld${EMULATION_NAME}_map_segments (need_layout);
} }
static void static void