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:
parent
1e53931944
commit
759388538d
|
@ -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>
|
||||
|
||||
* peXXigen.c (pe_print_reloc): Protect against access past end
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
13
ld/ChangeLog
13
ld/ChangeLog
|
@ -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>
|
||||
|
||||
PR 16563
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1942,8 +1942,11 @@ fragment <<EOF
|
|||
static void
|
||||
gld${EMULATION_NAME}_after_allocation (void)
|
||||
{
|
||||
bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
|
||||
&link_info);
|
||||
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);
|
||||
}
|
||||
EOF
|
||||
|
|
|
@ -242,20 +242,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 = 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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -207,8 +207,11 @@ 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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue