* coff-arm.c (arm_emit_base_file_entry): Check fwrite return value.

Return status.  Adjust callers.
	* coff-mcore.c (mcore_emit_base_file_entry): Likewise.
	* coff-ppc.c (write_base_file_entry): New function.
	(coff_ppc_relocate_section): Use it.
	* elf32-arm.c (find_thumb_glue): Check asprintf return status.
	(find_arm_glue): Likewise.
	* vms-misc.c (_bfd_vms_output_flush): Check fwrite return value.
This commit is contained in:
Alan Modra
2007-10-15 02:00:11 +00:00
parent 919bea4130
commit b165715209
6 changed files with 90 additions and 57 deletions

View File

@ -1,3 +1,14 @@
2007-10-15 Alan Modra <amodra@bigpond.net.au>
* coff-arm.c (arm_emit_base_file_entry): Check fwrite return value.
Return status. Adjust callers.
* coff-mcore.c (mcore_emit_base_file_entry): Likewise.
* coff-ppc.c (write_base_file_entry): New function.
(coff_ppc_relocate_section): Use it.
* elf32-arm.c (find_thumb_glue): Check asprintf return status.
(find_arm_glue): Likewise.
* vms-misc.c (_bfd_vms_output_flush): Check fwrite return value.
2007-10-12 Nick Clifton <nickc@redhat.com> 2007-10-12 Nick Clifton <nickc@redhat.com>
PR 5160 PR 5160

View File

@ -939,21 +939,24 @@ coff_arm_link_hash_table_create (bfd * abfd)
return & ret->root.root; return & ret->root.root;
} }
static void static bfd_boolean
arm_emit_base_file_entry (struct bfd_link_info *info, arm_emit_base_file_entry (struct bfd_link_info *info,
bfd *output_bfd, bfd *output_bfd,
asection *input_section, asection *input_section,
bfd_vma reloc_offset) bfd_vma reloc_offset)
{ {
bfd_vma addr = reloc_offset bfd_vma addr = (reloc_offset
- input_section->vma - input_section->vma
+ input_section->output_offset + input_section->output_offset
+ input_section->output_section->vma; + input_section->output_section->vma);
if (coff_data (output_bfd)->pe) if (coff_data (output_bfd)->pe)
addr -= pe_data (output_bfd)->pe_opthdr.ImageBase; addr -= pe_data (output_bfd)->pe_opthdr.ImageBase;
fwrite (& addr, 1, sizeof (addr), (FILE *) info->base_file); if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
return TRUE;
bfd_set_error (bfd_error_system_call);
return FALSE;
} }
#ifndef ARM_WINCE #ifndef ARM_WINCE
@ -1381,10 +1384,10 @@ coff_arm_relocate_section (bfd *output_bfd,
bfd_put_32 (output_bfd, h_val | a2t3_func_addr_insn, bfd_put_32 (output_bfd, h_val | a2t3_func_addr_insn,
s->contents + my_offset + 8); s->contents + my_offset + 8);
if (info->base_file) if (info->base_file
arm_emit_base_file_entry (info, output_bfd, s, && !arm_emit_base_file_entry (info, output_bfd,
my_offset + 8); s, my_offset + 8))
return FALSE;
} }
BFD_ASSERT (my_offset <= globals->arm_glue_size); BFD_ASSERT (my_offset <= globals->arm_glue_size);
@ -1486,9 +1489,11 @@ coff_arm_relocate_section (bfd *output_bfd,
bfd_put_32 (output_bfd, h_val, bfd_put_32 (output_bfd, h_val,
s->contents + my_offset + 16); s->contents + my_offset + 16);
if (info->base_file) if (info->base_file
arm_emit_base_file_entry (info, output_bfd, s, && !arm_emit_base_file_entry (info,
my_offset + 16); output_bfd, s,
my_offset + 16))
return FALSE;
} }
else else
{ {
@ -1572,13 +1577,13 @@ coff_arm_relocate_section (bfd *output_bfd,
} }
} }
if (info->base_file)
{
/* Emit a reloc if the backend thinks it needs it. */ /* Emit a reloc if the backend thinks it needs it. */
if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto)) if (info->base_file
arm_emit_base_file_entry (info, output_bfd, input_section, && sym
rel->r_vaddr); && pe_data(output_bfd)->in_reloc_p(output_bfd, howto)
} && !arm_emit_base_file_entry (info, output_bfd, input_section,
rel->r_vaddr))
return FALSE;
if (done) if (done)
rstat = bfd_reloc_ok; rstat = bfd_reloc_ok;

View File

@ -51,8 +51,6 @@ static reloc_howto_type *coff_mcore_rtype_to_howto
PARAMS ((bfd *, asection *, struct internal_reloc *, PARAMS ((bfd *, asection *, struct internal_reloc *,
struct coff_link_hash_entry *, struct internal_syment *, struct coff_link_hash_entry *, struct internal_syment *,
bfd_vma *)); bfd_vma *));
static void mcore_emit_base_file_entry
PARAMS ((struct bfd_link_info *, bfd *, asection *, bfd_vma));
static bfd_boolean in_reloc_p PARAMS ((bfd *, reloc_howto_type *)); static bfd_boolean in_reloc_p PARAMS ((bfd *, reloc_howto_type *));
/* The NT loader points the toc register to &toc + 32768, in order to /* The NT loader points the toc register to &toc + 32768, in order to
@ -221,12 +219,11 @@ mcore_hash_table;
/* Add an entry to the base file. */ /* Add an entry to the base file. */
static void static bfd_boolean
mcore_emit_base_file_entry (info, output_bfd, input_section, reloc_offset) mcore_emit_base_file_entry (struct bfd_link_info *info,
struct bfd_link_info * info; bfd *output_bfd,
bfd * output_bfd; asection *input_section,
asection * input_section; bfd_vma reloc_offset)
bfd_vma reloc_offset;
{ {
bfd_vma addr = reloc_offset bfd_vma addr = reloc_offset
- input_section->vma - input_section->vma
@ -236,7 +233,11 @@ mcore_emit_base_file_entry (info, output_bfd, input_section, reloc_offset)
if (coff_data (output_bfd)->pe) if (coff_data (output_bfd)->pe)
addr -= pe_data (output_bfd)->pe_opthdr.ImageBase; addr -= pe_data (output_bfd)->pe_opthdr.ImageBase;
fwrite (&addr, 1, sizeof (addr), (FILE *) info->base_file); if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
return TRUE;
bfd_set_error (bfd_error_system_call);
return FALSE;
} }
static bfd_reloc_status_type static bfd_reloc_status_type
@ -522,12 +523,13 @@ coff_mcore_relocate_section (output_bfd, info, input_bfd, input_section,
break; break;
} }
if (info->base_file)
{
/* Emit a reloc if the backend thinks it needs it. */ /* Emit a reloc if the backend thinks it needs it. */
if (sym && pe_data (output_bfd)->in_reloc_p (output_bfd, howto)) if (info->base_file
mcore_emit_base_file_entry (info, output_bfd, input_section, rel->r_vaddr); && sym
} && pe_data (output_bfd)->in_reloc_p (output_bfd, howto)
&& !mcore_emit_base_file_entry (info, output_bfd, input_section,
rel->r_vaddr))
return FALSE;
switch (rstat) switch (rstat)
{ {

View File

@ -982,6 +982,18 @@ static bfd_boolean in_reloc_p(abfd, howto)
&& (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ; && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
} }
static bfd_boolean
write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
{
if (coff_data (obfd)->pe)
addr -= pe_data (obfd)->pe_opthdr.ImageBase;
if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
return TRUE;
bfd_set_error (bfd_error_system_call);
return FALSE;
}
/* The reloc processing routine for the optimized COFF linker. */ /* The reloc processing routine for the optimized COFF linker. */
static bfd_boolean static bfd_boolean
@ -1237,10 +1249,8 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_vma addr = (toc_section->output_section->vma bfd_vma addr = (toc_section->output_section->vma
+ toc_section->output_offset + our_toc_offset); + toc_section->output_offset + our_toc_offset);
if (coff_data (output_bfd)->pe) if (!write_base_file_entry (output_bfd, info, addr))
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; return FALSE;
fwrite (&addr, 1,4, (FILE *) info->base_file);
} }
/* FIXME: this test is conservative. */ /* FIXME: this test is conservative. */
@ -1453,15 +1463,13 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
/* Relocation to a symbol in a section which /* Relocation to a symbol in a section which
isn't absolute - we output the address here isn't absolute - we output the address here
to a file. */ to a file. */
bfd_vma addr = rel->r_vaddr bfd_vma addr = (rel->r_vaddr
- input_section->vma - input_section->vma
+ input_section->output_offset + input_section->output_offset
+ input_section->output_section->vma; + input_section->output_section->vma);
if (coff_data (output_bfd)->pe) if (!write_base_file_entry (output_bfd, info, addr))
addr -= pe_data (output_bfd)->pe_opthdr.ImageBase; return FALSE;
fwrite (&addr, 1,4, (FILE *) info->base_file);
} }
} }

View File

@ -2520,9 +2520,10 @@ find_thumb_glue (struct bfd_link_info *link_info,
hash = elf_link_hash_lookup hash = elf_link_hash_lookup
(&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE); (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
if (hash == NULL) if (hash == NULL
asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"), && asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"),
tmp_name, name); tmp_name, name) == -1)
*error_message = (char *) bfd_errmsg (bfd_error_system_call);
free (tmp_name); free (tmp_name);
@ -2553,9 +2554,10 @@ find_arm_glue (struct bfd_link_info *link_info,
myh = elf_link_hash_lookup myh = elf_link_hash_lookup
(&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE); (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
if (myh == NULL) if (myh == NULL
asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"), && asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"),
tmp_name, name); tmp_name, name) == -1)
*error_message = (char *) bfd_errmsg (bfd_error_system_call);
free (tmp_name); free (tmp_name);

View File

@ -691,12 +691,17 @@ _bfd_vms_output_flush (bfd * abfd)
if (PRIV (push_level) == 0) if (PRIV (push_level) == 0)
{ {
if (0
#ifndef VMS #ifndef VMS
/* Write length first, see FF_FOREIGN in the input routines. */ /* Write length first, see FF_FOREIGN in the input routines. */
fwrite (PRIV (output_buf) + 2, 2, 1, (FILE *) abfd->iostream); || fwrite (PRIV (output_buf) + 2, 2, 1,
(FILE *) abfd->iostream) != 1
#endif #endif
fwrite (PRIV (output_buf), (size_t) real_size, 1, || (real_size != 0
(FILE *) abfd->iostream); && fwrite (PRIV (output_buf), (size_t) real_size, 1,
(FILE *) abfd->iostream) != 1))
/* FIXME: Return error status. */
abort ();
PRIV (output_size) = 0; PRIV (output_size) = 0;
} }