X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoff-m68k.c;h=f6aa094692a4d91e36d7aaf61b6ac674399c191b;hb=2a1d8bb3471a074ce35eb8ab9d8eb2093a5ecdb5;hp=d389a4ff1e0070b969c2c039a769e021c4d27800;hpb=3e110533652d0f94211681ab718b7471f8bd3493;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-m68k.c b/bfd/coff-m68k.c index d389a4ff1e..f6aa094692 100644 --- a/bfd/coff-m68k.c +++ b/bfd/coff-m68k.c @@ -1,27 +1,26 @@ /* BFD back-end for Motorola 68000 COFF binaries. - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, - 2000, 2001, 2002, 2003, 2005 - Free Software Foundation, Inc. + Copyright (C) 1990-2016 Free Software Foundation, Inc. Written by Cygnus Support. -This file is part of BFD, the Binary File Descriptor library. + This file is part of BFD, the Binary File Descriptor library. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "coff/m68k.h" #include "coff/internal.h" @@ -31,7 +30,7 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. variants. The following macros control its behaviour: TARGET_SYM - The C name of the BFD target vector. The default is m68kcoff_vec. + The C name of the BFD target vector. The default is m68k_coff_vec. TARGET_NAME The user visible target name. The default is "coff-m68k". NAMES_HAVE_UNDERSCORE @@ -59,25 +58,19 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. #define RELOC_SPECIAL_FN 0 #else static bfd_reloc_status_type m68kcoff_common_addend_special_fn - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *m68kcoff_common_addend_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); + #define RELOC_SPECIAL_FN m68kcoff_common_addend_special_fn #endif -static bfd_boolean m68k_coff_is_local_label_name - PARAMS ((bfd *, const char *)); +static bfd_boolean m68k_coff_is_local_label_name (bfd *, const char *); /* On the delta, a symbol starting with L% is local. We won't see such a symbol on other platforms, so it should be safe to always consider it local here. */ static bfd_boolean -m68k_coff_is_local_label_name (abfd, name) - bfd *abfd; - const char *name; +m68k_coff_is_local_label_name (bfd *abfd, const char *name) { if (name[0] == 'L' && name[1] == '%') return TRUE; @@ -91,6 +84,7 @@ m68k_coff_is_local_label_name (abfd, name) #define m68k_rtype2howto _bfd_m68kcoff_rtype2howto #define m68k_howto2rtype _bfd_m68kcoff_howto2rtype #define m68k_reloc_type_lookup _bfd_m68kcoff_reloc_type_lookup +#define m68k_reloc_name_lookup _bfd_m68kcoff_reloc_name_lookup #endif #ifdef ONLY_DECLARE_RELOCS @@ -119,10 +113,11 @@ reloc_howto_type m68kcoff_howto_table[] = /* Turn a howto into a reloc number */ #ifdef ONLY_DECLARE_RELOCS -extern void m68k_rtype2howto PARAMS ((arelent *internal, int relocentry)); -extern int m68k_howto2rtype PARAMS ((reloc_howto_type *)); -extern reloc_howto_type *m68k_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); +extern void m68k_rtype2howto (arelent *internal, int relocentry); +extern int m68k_howto2rtype (reloc_howto_type *); +extern reloc_howto_type * m68k_reloc_type_lookup + (bfd *, bfd_reloc_code_real_type); +extern reloc_howto_type * m68k_reloc_name_lookup (bfd *, const char *); #else #ifdef STATIC_RELOCS @@ -131,15 +126,13 @@ extern reloc_howto_type *m68k_reloc_type_lookup #define STAT_REL #endif -STAT_REL reloc_howto_type * m68k_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type)); -STAT_REL int m68k_howto2rtype PARAMS ((reloc_howto_type *)); -STAT_REL void m68k_rtype2howto PARAMS ((arelent *, int)); - +STAT_REL void m68k_rtype2howto (arelent *, int); +STAT_REL int m68k_howto2rtype (reloc_howto_type *); +STAT_REL reloc_howto_type * m68k_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); +STAT_REL reloc_howto_type * m68k_reloc_name_lookup (bfd *, const char *); STAT_REL void -m68k_rtype2howto(internal, relocentry) - arelent *internal; - int relocentry; +m68k_rtype2howto (arelent *internal, int relocentry) { switch (relocentry) { @@ -150,12 +143,12 @@ m68k_rtype2howto(internal, relocentry) case R_PCRWORD: internal->howto = m68kcoff_howto_table + 4; break; case R_PCRLONG: internal->howto = m68kcoff_howto_table + 5; break; case R_RELLONG_NEG: internal->howto = m68kcoff_howto_table + 6; break; + default: internal->howto = NULL; break; } } STAT_REL int -m68k_howto2rtype (internal) - reloc_howto_type *internal; +m68k_howto2rtype (reloc_howto_type * internal) { if (internal->pc_relative) { @@ -179,9 +172,8 @@ m68k_howto2rtype (internal) } STAT_REL reloc_howto_type * -m68k_reloc_type_lookup (abfd, code) - bfd *abfd ATTRIBUTE_UNUSED; - bfd_reloc_code_real_type code; +m68k_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, + bfd_reloc_code_real_type code) { switch (code) { @@ -198,6 +190,22 @@ m68k_reloc_type_lookup (abfd, code) /*NOTREACHED*/ } +STAT_REL reloc_howto_type * +m68k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, + const char *r_name) +{ + unsigned int i; + + for (i = 0; + i < sizeof (m68kcoff_howto_table) / sizeof (m68kcoff_howto_table[0]); + i++) + if (m68kcoff_howto_table[i].name != NULL + && strcasecmp (m68kcoff_howto_table[i].name, r_name) == 0) + return &m68kcoff_howto_table[i]; + + return NULL; +} + #endif /* not ONLY_DECLARE_RELOCS */ #define RTYPE2HOWTO(internal, relocentry) \ @@ -207,34 +215,30 @@ m68k_reloc_type_lookup (abfd, code) external.r_type = m68k_howto2rtype (internal) #define coff_bfd_reloc_type_lookup m68k_reloc_type_lookup +#define coff_bfd_reloc_name_lookup m68k_reloc_name_lookup #ifndef COFF_COMMON_ADDEND #ifndef coff_rtype_to_howto #define coff_rtype_to_howto m68kcoff_rtype_to_howto -static reloc_howto_type *m68kcoff_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); - static reloc_howto_type * -m68kcoff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h ATTRIBUTE_UNUSED; - struct internal_syment *sym ATTRIBUTE_UNUSED; - bfd_vma *addendp; +m68kcoff_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, + asection *sec, + struct internal_reloc *rel, + struct coff_link_hash_entry *h ATTRIBUTE_UNUSED, + struct internal_syment *sym ATTRIBUTE_UNUSED, + bfd_vma *addendp) { arelent relent; reloc_howto_type *howto; + relent.howto = NULL; RTYPE2HOWTO (&relent, rel); howto = relent.howto; - if (howto->pc_relative) + if (howto != NULL && howto->pc_relative) *addendp += sec->vma; return howto; @@ -256,15 +260,13 @@ m68kcoff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) reloc type to make any required adjustments. */ static bfd_reloc_status_type -m68kcoff_common_addend_special_fn (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section ATTRIBUTE_UNUSED; - bfd *output_bfd; - char **error_message ATTRIBUTE_UNUSED; +m68kcoff_common_addend_special_fn (bfd *abfd, + arelent *reloc_entry, + asymbol *symbol, + void * data, + asection *input_section ATTRIBUTE_UNUSED, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { symvalue diff; @@ -358,7 +360,7 @@ m68kcoff_common_addend_special_fn (abfd, reloc_entry, symbol, data, coffsym = (obj_symbols (abfd) \ + (cache_ptr->sym_ptr_ptr - symbols)); \ else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ + coffsym = coff_symbol_from (ptr); \ if (coffsym != (coff_symbol_type *) NULL \ && coffsym->native->u.syment.n_scnum == 0) \ cache_ptr->addend = - coffsym->native->u.syment.n_value; \ @@ -379,17 +381,17 @@ m68kcoff_common_addend_special_fn (abfd, reloc_entry, symbol, data, adjust common symbols. */ static reloc_howto_type * -m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; +m68kcoff_common_addend_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, + asection *sec, + struct internal_reloc *rel, + struct coff_link_hash_entry *h, + struct internal_syment *sym, + bfd_vma *addendp) { arelent relent; reloc_howto_type *howto; + relent.howto = NULL; RTYPE2HOWTO (&relent, rel); howto = relent.howto; @@ -432,12 +434,11 @@ m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp) objects, and before the final_link entry point is called. */ bfd_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; +bfd_m68k_coff_create_embedded_relocs (bfd *abfd, + struct bfd_link_info *info, + asection *datasec, + asection *relsec, + char **errmsg) { char *extsyms; bfd_size_type symesz; @@ -445,7 +446,7 @@ bfd_m68k_coff_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) bfd_byte *p; bfd_size_type amt; - BFD_ASSERT (! info->relocatable); + BFD_ASSERT (! bfd_link_relocatable (info)); *errmsg = NULL; @@ -521,10 +522,14 @@ bfd_m68k_coff_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) #define coff_relocate_section _bfd_coff_generic_relocate_section +#ifndef bfd_pe_print_pdata +#define bfd_pe_print_pdata NULL +#endif + #include "coffcode.h" #ifndef TARGET_SYM -#define TARGET_SYM m68kcoff_vec +#define TARGET_SYM m68k_coff_vec #endif #ifndef TARGET_NAME