*/
-static void
+static boolean
coff_write_relocs (abfd)
bfd * abfd;
{
struct external_reloc dst;
arelent **p = s->orelocation;
- bfd_seek (abfd, s->rel_filepos, SEEK_SET);
+ if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
+ return false;
for (i = 0; i < s->reloc_count; i++)
{
struct internal_reloc n;
n.r_type = q->howto->type;
#endif
coff_swap_reloc_out (abfd, &n, &dst);
- bfd_write ((PTR) & dst, 1, RELSZ, abfd);
+ if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
+ return false;
}
}
+
+ return true;
}
/* Set flags and magic number of a coff file from architecture and machine
/* Write section headers to the file. */
internal_f.f_nscns = 0;
- bfd_seek (abfd,
- (file_ptr) ((abfd->flags & EXEC_P) ?
- (FILHSZ + AOUTSZ) : FILHSZ),
- SEEK_SET);
+ if (bfd_seek (abfd,
+ (file_ptr) ((abfd->flags & EXEC_P) ?
+ (FILHSZ + AOUTSZ) : FILHSZ),
+ SEEK_SET)
+ != 0)
+ return false;
{
#if 0
SCNHDR buff;
coff_swap_scnhdr_out (abfd, §ion, &buff);
- bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd);
+ if (bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
+ return false;
}
if (!coff_renumber_symbols (abfd))
return false;
coff_mangle_symbols (abfd);
- coff_write_symbols (abfd);
- if (!coff_write_linenumbers (abfd))
+ if (! coff_write_symbols (abfd))
+ return false;
+ if (! coff_write_linenumbers (abfd))
+ return false;
+ if (! coff_write_relocs (abfd))
return false;
- coff_write_relocs (abfd);
}
if (text_sec)
{
{
FILHDR buff;
coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) & buff);
- bfd_write ((PTR) & buff, 1, FILHSZ, abfd);
+ if (bfd_write ((PTR) & buff, 1, FILHSZ, abfd) != FILHSZ)
+ return false;
}
if (abfd->flags & EXEC_P)
{
AOUTHDR buff;
coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) & buff);
- bfd_write ((PTR) & buff, 1, AOUTSZ, abfd);
+ if (bfd_write ((PTR) & buff, 1, AOUTSZ, abfd) != AOUTSZ)
+ return false;
}
return true;
}
if (section->filepos == 0)
return true;
- bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
+ if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
+ return false;
if (count != 0)
{
bfd_set_error (bfd_error_no_memory);
return (NULL);
}
- bfd_seek (abfd, where, seek_direction);
- if (bfd_read (area, 1, size, abfd) != size)
- {
- bfd_set_error (bfd_error_system_call);
- return (NULL);
- } /* on error */
+ if (bfd_seek (abfd, where, seek_direction) != 0
+ || bfd_read (area, 1, size, abfd) != size)
+ return (NULL);
return (area);
} /* buy_and_read() */
unsigned int number_of_symbols = 0;
if (obj_symbols (abfd))
return true;
- bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET);
+ if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
+ return false;
/* Read in the symbol table */
if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
*/
#ifndef CALC_ADDEND
-#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
- if (ptr && bfd_asymbol_bfd(ptr) == abfd \
- && !bfd_is_com_section(ptr->section) \
- && !(ptr->flags & BSF_OLD_COMMON)) \
- { \
- cache_ptr->addend = -(ptr->section->vma + ptr->value); \
- } \
- else { \
- cache_ptr->addend = 0; \
- }
+#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
+ { \
+ coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
+ if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
+ coffsym = (obj_symbols (abfd) \
+ + (cache_ptr->sym_ptr_ptr - symbols)); \
+ else if (ptr) \
+ coffsym = coff_symbol_from (abfd, ptr); \
+ if (coffsym != (coff_symbol_type *) NULL \
+ && coffsym->native->u.syment.n_scnum == 0) \
+ cache_ptr->addend = 0; \
+ else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
+ && ptr->section != (asection *) NULL) \
+ cache_ptr->addend = - (ptr->section->vma + ptr->value); \
+ else \
+ cache_ptr->addend = 0; \
+ }
#endif
static boolean
/* This is stupid. This function should be a boolean predicate. */
-static unsigned int
+static long
coff_canonicalize_reloc (abfd, section, relptr, symbols)
bfd * abfd;
sec_ptr section;
}
else
{
- coff_slurp_reloc_table (abfd, section, symbols);
-
+ if (! coff_slurp_reloc_table (abfd, section, symbols))
+ return -1;
tblptr = section->relocation;
- if (!tblptr)
- return 0;
for (; count++ < section->reloc_count;)
*relptr++ = tblptr++;
coff_reloc16_extra_cases, coff_reloc16_estimate
};
-#define coff_core_file_failing_command _bfd_dummy_core_file_failing_command
-#define coff_core_file_failing_signal _bfd_dummy_core_file_failing_signal
-#define coff_core_file_matches_executable_p _bfd_dummy_core_file_matches_executable_p
-#define coff_slurp_armap bfd_slurp_coff_armap
-#define coff_slurp_extended_name_table _bfd_slurp_extended_name_table
-#define coff_truncate_arname bfd_dont_truncate_arname
-#define coff_openr_next_archived_file bfd_generic_openr_next_archived_file
-#define coff_generic_stat_arch_elt bfd_generic_stat_arch_elt
-#define coff_get_section_contents bfd_generic_get_section_contents
-#define coff_close_and_cleanup bfd_generic_close_and_cleanup
-
-#define coff_bfd_debug_info_start bfd_void
-#define coff_bfd_debug_info_end bfd_void
-#define coff_bfd_debug_info_accumulate \
- (void (*) PARAMS ((bfd *, struct sec *))) bfd_void
-#define coff_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
-#define coff_bfd_relax_section bfd_generic_relax_section
-#ifndef coff_bfd_reloc_type_lookup
-#define coff_bfd_reloc_type_lookup \
- ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
-#endif
-#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
-#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
-#define coff_bfd_final_link _bfd_generic_final_link
+#define coff_close_and_cleanup _bfd_generic_close_and_cleanup
+#define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
+#define coff_get_section_contents _bfd_generic_get_section_contents
-#ifndef coff_bfd_copy_private_section_data
#define coff_bfd_copy_private_section_data \
- ((boolean (*) PARAMS ((bfd *, asection *, bfd *, asection *))) bfd_true)
-#endif
-#ifndef coff_bfd_copy_private_bfd_data
-#define coff_bfd_copy_private_bfd_data \
- ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true)
-#endif
+ _bfd_generic_bfd_copy_private_section_data
+#define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
+
#ifndef coff_bfd_is_local_label
#define coff_bfd_is_local_label bfd_generic_is_local_label
#endif
+
+/* The reloc lookup routine must be supplied by each individual COFF
+ backend. */
+#ifndef coff_bfd_reloc_type_lookup
+#define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
+#endif
+
+#define coff_bfd_get_relocated_section_contents \
+ bfd_generic_get_relocated_section_contents
+#define coff_bfd_relax_section bfd_generic_relax_section
+#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
+#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
+#define coff_bfd_final_link _bfd_generic_final_link