X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcoff-m68k.c;h=b7f235c810b9f3bf6d07737b3171be14f9fb4900;hb=6c98e688d5bbc670851c9e092c132a565eb67519;hp=5a06b17d50b1c67536c0a1a21f8d99ba581eae9f;hpb=252b5132c753830d5fd56823373aed85f2a0db63;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-m68k.c b/bfd/coff-m68k.c index 5a06b17d50..b7f235c810 100644 --- a/bfd/coff-m68k.c +++ b/bfd/coff-m68k.c @@ -1,5 +1,6 @@ /* BFD back-end for Motorola 68000 COFF binaries. - Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000 + Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -96,7 +97,7 @@ extern reloc_howto_type m68kcoff_howto_table[]; #ifdef STATIC_RELOCS static #endif -reloc_howto_type m68kcoff_howto_table[] = +reloc_howto_type m68kcoff_howto_table[] = { HOWTO(R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, RELOC_SPECIAL_FN, "8", true, 0x000000ff,0x000000ff, false), HOWTO(R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, RELOC_SPECIAL_FN, "16", true, 0x0000ffff,0x0000ffff, false), @@ -129,7 +130,7 @@ m68k_rtype2howto(internal, relocentry) arelent *internal; int relocentry; { - switch (relocentry) + switch (relocentry) { case R_RELBYTE: internal->howto = m68kcoff_howto_table + 0; break; case R_RELWORD: internal->howto = m68kcoff_howto_table + 1; break; @@ -144,29 +145,29 @@ m68k_rtype2howto(internal, relocentry) #ifdef STATIC_RELOCS static #endif -int +int m68k_howto2rtype (internal) reloc_howto_type *internal; { - if (internal->pc_relative) + if (internal->pc_relative) { - switch (internal->bitsize) + switch (internal->bitsize) { case 32: return R_PCRLONG; case 16: return R_PCRWORD; case 8: return R_PCRBYTE; } } - else + else { - switch (internal->bitsize) + switch (internal->bitsize) { case 32: return R_RELLONG; case 16: return R_RELWORD; case 8: return R_RELBYTE; } } - return R_RELLONG; + return R_RELLONG; } #ifdef STATIC_RELOCS @@ -174,7 +175,7 @@ static #endif reloc_howto_type * m68k_reloc_type_lookup (abfd, code) - bfd *abfd; + bfd *abfd ATTRIBUTE_UNUSED; bfd_reloc_code_real_type code; { switch (code) @@ -212,14 +213,13 @@ static reloc_howto_type *m68kcoff_rtype_to_howto struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *)); -/*ARGSUSED*/ static reloc_howto_type * m68kcoff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; + bfd *abfd ATTRIBUTE_UNUSED; asection *sec; struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; + struct coff_link_hash_entry *h ATTRIBUTE_UNUSED; + struct internal_syment *sym ATTRIBUTE_UNUSED; bfd_vma *addendp; { arelent relent; @@ -257,9 +257,9 @@ m68kcoff_common_addend_special_fn (abfd, reloc_entry, symbol, data, arelent *reloc_entry; asymbol *symbol; PTR data; - asection *input_section; + asection *input_section ATTRIBUTE_UNUSED; bfd *output_bfd; - char **error_message; + char **error_message ATTRIBUTE_UNUSED; { symvalue diff; @@ -373,10 +373,9 @@ m68kcoff_common_addend_special_fn (abfd, reloc_entry, symbol, data, /* coff-m68k.c uses the special COFF backend linker. We need to adjust common symbols. */ -/*ARGSUSED*/ static reloc_howto_type * m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; + bfd *abfd ATTRIBUTE_UNUSED; asection *sec; struct internal_reloc *rel; struct coff_link_hash_entry *h; @@ -418,6 +417,98 @@ m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp) #endif /* ! defined (coff_rtype_to_howto) */ #endif /* COFF_COMMON_ADDEND */ + +#if !defined ONLY_DECLARE_RELOCS && ! defined STATIC_RELOCS +/* Given a .data section and a .emreloc in-memory section, store + relocation information into the .emreloc section which can be + used at runtime to relocate the section. This is called by the + linker when the --embedded-relocs switch is used. This is called + after the add_symbols entry point has been called for all the + objects, and before the final_link entry point is called. */ + +boolean +bfd_m68k_coff_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) + bfd *abfd; + struct bfd_link_info *info; + asection *datasec; + asection *relsec; + char **errmsg; +{ + char *extsyms; + bfd_size_type symesz; + struct internal_reloc *irel, *irelend; + bfd_byte *p; + + BFD_ASSERT (! info->relocateable); + + *errmsg = NULL; + + if (datasec->reloc_count == 0) + return true; + + extsyms = obj_coff_external_syms (abfd); + symesz = bfd_coff_symesz (abfd); + + irel = _bfd_coff_read_internal_relocs (abfd, datasec, true, NULL, false, + NULL); + irelend = irel + datasec->reloc_count; + + relsec->contents = (bfd_byte *) bfd_alloc (abfd, datasec->reloc_count * 12); + if (relsec->contents == NULL) + return false; + + p = relsec->contents; + + for (; irel < irelend; irel++, p += 12) + { + asection *targetsec; + + /* We are going to write a four byte longword into the runtime + reloc section. The longword will be the address in the data + section which must be relocated. It is followed by the name + of the target section NUL-padded or truncated to 8 + characters. */ + + /* We can only relocate absolute longword relocs at run time. */ + if (irel->r_type != R_RELLONG) + { + *errmsg = _("unsupported reloc type"); + bfd_set_error (bfd_error_bad_value); + return false; + } + + if (irel->r_symndx == -1) + targetsec = bfd_abs_section_ptr; + else + { + struct coff_link_hash_entry *h; + + h = obj_coff_sym_hashes (abfd)[irel->r_symndx]; + if (h == NULL) + { + struct internal_syment isym; + + bfd_coff_swap_sym_in (abfd, extsyms + symesz * irel->r_symndx, + &isym); + targetsec = coff_section_from_bfd_index (abfd, isym.n_scnum); + } + else if (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) + targetsec = h->root.u.def.section; + else + targetsec = NULL; + } + + bfd_put_32 (abfd, + (irel->r_vaddr - datasec->vma + datasec->output_offset), p); + memset (p + 4, 0, 8); + if (targetsec != NULL) + strncpy (p + 4, targetsec->output_section->name, 8); + } + + return true; +} +#endif /* neither ONLY_DECLARE_RELOCS not STATIC_RELOCS */ #define coff_bfd_is_local_label_name m68k_coff_is_local_label_name @@ -433,48 +524,8 @@ m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp) #define TARGET_NAME "coff-m68k" #endif -const bfd_target TARGET_SYM = -{ - TARGET_NAME, - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ #ifdef NAMES_HAVE_UNDERSCORE - '_', +CREATE_BIG_COFF_TARGET_VEC (TARGET_SYM, TARGET_NAME, D_PAGED, 0, '_', NULL) #else - 0, /* leading underscore */ +CREATE_BIG_COFF_TARGET_VEC (TARGET_SYM, TARGET_NAME, D_PAGED, 0, 0, NULL) #endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE -};