Home | History | Annotate | Line # | Download | only in bfd
elf32-m68hc1x.c revision 1.1
      1 /* Motorola 68HC11/HC12-specific support for 32-bit ELF
      2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
      3    2009, 2010  Free Software Foundation, Inc.
      4    Contributed by Stephane Carrez (stcarrez (at) nerim.fr)
      5 
      6    This file is part of BFD, the Binary File Descriptor library.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21    MA 02110-1301, USA.  */
     22 
     23 #include "alloca-conf.h"
     24 #include "sysdep.h"
     25 #include "bfd.h"
     26 #include "bfdlink.h"
     27 #include "libbfd.h"
     28 #include "elf-bfd.h"
     29 #include "elf32-m68hc1x.h"
     30 #include "elf/m68hc11.h"
     31 #include "opcode/m68hc11.h"
     32 
     33 
     34 #define m68hc12_stub_hash_lookup(table, string, create, copy) \
     35   ((struct elf32_m68hc11_stub_hash_entry *) \
     36    bfd_hash_lookup ((table), (string), (create), (copy)))
     37 
     38 static struct elf32_m68hc11_stub_hash_entry* m68hc12_add_stub
     39   (const char *stub_name,
     40    asection *section,
     41    struct m68hc11_elf_link_hash_table *htab);
     42 
     43 static struct bfd_hash_entry *stub_hash_newfunc
     44   (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
     45 
     46 static void m68hc11_elf_set_symbol (bfd* abfd, struct bfd_link_info *info,
     47                                     const char* name, bfd_vma value,
     48                                     asection* sec);
     49 
     50 static bfd_boolean m68hc11_elf_export_one_stub
     51   (struct bfd_hash_entry *gen_entry, void *in_arg);
     52 
     53 static void scan_sections_for_abi (bfd*, asection*, PTR);
     54 
     55 struct m68hc11_scan_param
     56 {
     57    struct m68hc11_page_info* pinfo;
     58    bfd_boolean use_memory_banks;
     59 };
     60 
     61 
     62 /* Create a 68HC11/68HC12 ELF linker hash table.  */
     63 
     64 struct m68hc11_elf_link_hash_table*
     65 m68hc11_elf_hash_table_create (bfd *abfd)
     66 {
     67   struct m68hc11_elf_link_hash_table *ret;
     68   bfd_size_type amt = sizeof (struct m68hc11_elf_link_hash_table);
     69 
     70   ret = (struct m68hc11_elf_link_hash_table *) bfd_malloc (amt);
     71   if (ret == (struct m68hc11_elf_link_hash_table *) NULL)
     72     return NULL;
     73 
     74   memset (ret, 0, amt);
     75   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
     76 				      _bfd_elf_link_hash_newfunc,
     77 				      sizeof (struct elf_link_hash_entry),
     78 				      M68HC11_ELF_DATA))
     79     {
     80       free (ret);
     81       return NULL;
     82     }
     83 
     84   /* Init the stub hash table too.  */
     85   amt = sizeof (struct bfd_hash_table);
     86   ret->stub_hash_table = (struct bfd_hash_table*) bfd_malloc (amt);
     87   if (ret->stub_hash_table == NULL)
     88     {
     89       free (ret);
     90       return NULL;
     91     }
     92   if (!bfd_hash_table_init (ret->stub_hash_table, stub_hash_newfunc,
     93 			    sizeof (struct elf32_m68hc11_stub_hash_entry)))
     94     return NULL;
     95 
     96   ret->stub_bfd = NULL;
     97   ret->stub_section = 0;
     98   ret->add_stub_section = NULL;
     99   ret->sym_cache.abfd = NULL;
    100 
    101   return ret;
    102 }
    103 
    104 /* Free the derived linker hash table.  */
    105 
    106 void
    107 m68hc11_elf_bfd_link_hash_table_free (struct bfd_link_hash_table *hash)
    108 {
    109   struct m68hc11_elf_link_hash_table *ret
    110     = (struct m68hc11_elf_link_hash_table *) hash;
    111 
    112   bfd_hash_table_free (ret->stub_hash_table);
    113   free (ret->stub_hash_table);
    114   _bfd_generic_link_hash_table_free (hash);
    115 }
    116 
    117 /* Assorted hash table functions.  */
    118 
    119 /* Initialize an entry in the stub hash table.  */
    120 
    121 static struct bfd_hash_entry *
    122 stub_hash_newfunc (struct bfd_hash_entry *entry, struct bfd_hash_table *table,
    123                    const char *string)
    124 {
    125   /* Allocate the structure if it has not already been allocated by a
    126      subclass.  */
    127   if (entry == NULL)
    128     {
    129       entry = bfd_hash_allocate (table,
    130 				 sizeof (struct elf32_m68hc11_stub_hash_entry));
    131       if (entry == NULL)
    132 	return entry;
    133     }
    134 
    135   /* Call the allocation method of the superclass.  */
    136   entry = bfd_hash_newfunc (entry, table, string);
    137   if (entry != NULL)
    138     {
    139       struct elf32_m68hc11_stub_hash_entry *eh;
    140 
    141       /* Initialize the local fields.  */
    142       eh = (struct elf32_m68hc11_stub_hash_entry *) entry;
    143       eh->stub_sec = NULL;
    144       eh->stub_offset = 0;
    145       eh->target_value = 0;
    146       eh->target_section = NULL;
    147     }
    148 
    149   return entry;
    150 }
    151 
    152 /* Add a new stub entry to the stub hash.  Not all fields of the new
    153    stub entry are initialised.  */
    154 
    155 static struct elf32_m68hc11_stub_hash_entry *
    156 m68hc12_add_stub (const char *stub_name, asection *section,
    157                   struct m68hc11_elf_link_hash_table *htab)
    158 {
    159   struct elf32_m68hc11_stub_hash_entry *stub_entry;
    160 
    161   /* Enter this entry into the linker stub hash table.  */
    162   stub_entry = m68hc12_stub_hash_lookup (htab->stub_hash_table, stub_name,
    163                                          TRUE, FALSE);
    164   if (stub_entry == NULL)
    165     {
    166       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
    167 			     section->owner, stub_name);
    168       return NULL;
    169     }
    170 
    171   if (htab->stub_section == 0)
    172     {
    173       htab->stub_section = (*htab->add_stub_section) (".tramp",
    174                                                       htab->tramp_section);
    175     }
    176 
    177   stub_entry->stub_sec = htab->stub_section;
    178   stub_entry->stub_offset = 0;
    179   return stub_entry;
    180 }
    181 
    182 /* Hook called by the linker routine which adds symbols from an object
    183    file.  We use it for identify far symbols and force a loading of
    184    the trampoline handler.  */
    185 
    186 bfd_boolean
    187 elf32_m68hc11_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
    188                                Elf_Internal_Sym *sym,
    189                                const char **namep ATTRIBUTE_UNUSED,
    190                                flagword *flagsp ATTRIBUTE_UNUSED,
    191                                asection **secp ATTRIBUTE_UNUSED,
    192                                bfd_vma *valp ATTRIBUTE_UNUSED)
    193 {
    194   if (sym->st_other & STO_M68HC12_FAR)
    195     {
    196       struct elf_link_hash_entry *h;
    197 
    198       h = (struct elf_link_hash_entry *)
    199 	bfd_link_hash_lookup (info->hash, "__far_trampoline",
    200                               FALSE, FALSE, FALSE);
    201       if (h == NULL)
    202         {
    203           struct bfd_link_hash_entry* entry = NULL;
    204 
    205           _bfd_generic_link_add_one_symbol (info, abfd,
    206                                             "__far_trampoline",
    207                                             BSF_GLOBAL,
    208                                             bfd_und_section_ptr,
    209                                             (bfd_vma) 0, (const char*) NULL,
    210                                             FALSE, FALSE, &entry);
    211         }
    212 
    213     }
    214   return TRUE;
    215 }
    216 
    217 /* External entry points for sizing and building linker stubs.  */
    218 
    219 /* Set up various things so that we can make a list of input sections
    220    for each output section included in the link.  Returns -1 on error,
    221    0 when no stubs will be needed, and 1 on success.  */
    222 
    223 int
    224 elf32_m68hc11_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
    225 {
    226   bfd *input_bfd;
    227   unsigned int bfd_count;
    228   int top_id, top_index;
    229   asection *section;
    230   asection **input_list, **list;
    231   bfd_size_type amt;
    232   asection *text_section;
    233   struct m68hc11_elf_link_hash_table *htab;
    234 
    235   htab = m68hc11_elf_hash_table (info);
    236   if (htab == NULL)
    237     return -1;
    238 
    239   if (bfd_get_flavour (info->output_bfd) != bfd_target_elf_flavour)
    240     return 0;
    241 
    242   /* Count the number of input BFDs and find the top input section id.
    243      Also search for an existing ".tramp" section so that we know
    244      where generated trampolines must go.  Default to ".text" if we
    245      can't find it.  */
    246   htab->tramp_section = 0;
    247   text_section = 0;
    248   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
    249        input_bfd != NULL;
    250        input_bfd = input_bfd->link_next)
    251     {
    252       bfd_count += 1;
    253       for (section = input_bfd->sections;
    254 	   section != NULL;
    255 	   section = section->next)
    256 	{
    257           const char* name = bfd_get_section_name (input_bfd, section);
    258 
    259           if (!strcmp (name, ".tramp"))
    260             htab->tramp_section = section;
    261 
    262           if (!strcmp (name, ".text"))
    263             text_section = section;
    264 
    265 	  if (top_id < section->id)
    266 	    top_id = section->id;
    267 	}
    268     }
    269   htab->bfd_count = bfd_count;
    270   if (htab->tramp_section == 0)
    271     htab->tramp_section = text_section;
    272 
    273   /* We can't use output_bfd->section_count here to find the top output
    274      section index as some sections may have been removed, and
    275      strip_excluded_output_sections doesn't renumber the indices.  */
    276   for (section = output_bfd->sections, top_index = 0;
    277        section != NULL;
    278        section = section->next)
    279     {
    280       if (top_index < section->index)
    281 	top_index = section->index;
    282     }
    283 
    284   htab->top_index = top_index;
    285   amt = sizeof (asection *) * (top_index + 1);
    286   input_list = (asection **) bfd_malloc (amt);
    287   htab->input_list = input_list;
    288   if (input_list == NULL)
    289     return -1;
    290 
    291   /* For sections we aren't interested in, mark their entries with a
    292      value we can check later.  */
    293   list = input_list + top_index;
    294   do
    295     *list = bfd_abs_section_ptr;
    296   while (list-- != input_list);
    297 
    298   for (section = output_bfd->sections;
    299        section != NULL;
    300        section = section->next)
    301     {
    302       if ((section->flags & SEC_CODE) != 0)
    303 	input_list[section->index] = NULL;
    304     }
    305 
    306   return 1;
    307 }
    308 
    309 /* Determine and set the size of the stub section for a final link.
    310 
    311    The basic idea here is to examine all the relocations looking for
    312    PC-relative calls to a target that is unreachable with a "bl"
    313    instruction.  */
    314 
    315 bfd_boolean
    316 elf32_m68hc11_size_stubs (bfd *output_bfd, bfd *stub_bfd,
    317                           struct bfd_link_info *info,
    318                           asection * (*add_stub_section) (const char*, asection*))
    319 {
    320   bfd *input_bfd;
    321   asection *section;
    322   Elf_Internal_Sym *local_syms, **all_local_syms;
    323   unsigned int bfd_indx, bfd_count;
    324   bfd_size_type amt;
    325   asection *stub_sec;
    326   struct m68hc11_elf_link_hash_table *htab = m68hc11_elf_hash_table (info);
    327 
    328   if (htab == NULL)
    329     return FALSE;
    330 
    331   /* Stash our params away.  */
    332   htab->stub_bfd = stub_bfd;
    333   htab->add_stub_section = add_stub_section;
    334 
    335   /* Count the number of input BFDs and find the top input section id.  */
    336   for (input_bfd = info->input_bfds, bfd_count = 0;
    337        input_bfd != NULL;
    338        input_bfd = input_bfd->link_next)
    339     bfd_count += 1;
    340 
    341   /* We want to read in symbol extension records only once.  To do this
    342      we need to read in the local symbols in parallel and save them for
    343      later use; so hold pointers to the local symbols in an array.  */
    344   amt = sizeof (Elf_Internal_Sym *) * bfd_count;
    345   all_local_syms = (Elf_Internal_Sym **) bfd_zmalloc (amt);
    346   if (all_local_syms == NULL)
    347     return FALSE;
    348 
    349   /* Walk over all the input BFDs, swapping in local symbols.  */
    350   for (input_bfd = info->input_bfds, bfd_indx = 0;
    351        input_bfd != NULL;
    352        input_bfd = input_bfd->link_next, bfd_indx++)
    353     {
    354       Elf_Internal_Shdr *symtab_hdr;
    355 
    356       /* We'll need the symbol table in a second.  */
    357       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    358       if (symtab_hdr->sh_info == 0)
    359 	continue;
    360 
    361       /* We need an array of the local symbols attached to the input bfd.  */
    362       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
    363       if (local_syms == NULL)
    364 	{
    365 	  local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
    366 					     symtab_hdr->sh_info, 0,
    367 					     NULL, NULL, NULL);
    368 	  /* Cache them for elf_link_input_bfd.  */
    369 	  symtab_hdr->contents = (unsigned char *) local_syms;
    370 	}
    371       if (local_syms == NULL)
    372         {
    373           free (all_local_syms);
    374 	  return FALSE;
    375         }
    376 
    377       all_local_syms[bfd_indx] = local_syms;
    378     }
    379 
    380   for (input_bfd = info->input_bfds, bfd_indx = 0;
    381        input_bfd != NULL;
    382        input_bfd = input_bfd->link_next, bfd_indx++)
    383     {
    384       Elf_Internal_Shdr *symtab_hdr;
    385       struct elf_link_hash_entry ** sym_hashes;
    386 
    387       sym_hashes = elf_sym_hashes (input_bfd);
    388 
    389       /* We'll need the symbol table in a second.  */
    390       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    391       if (symtab_hdr->sh_info == 0)
    392         continue;
    393 
    394       local_syms = all_local_syms[bfd_indx];
    395 
    396       /* Walk over each section attached to the input bfd.  */
    397       for (section = input_bfd->sections;
    398            section != NULL;
    399            section = section->next)
    400         {
    401           Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
    402 
    403           /* If there aren't any relocs, then there's nothing more
    404              to do.  */
    405           if ((section->flags & SEC_RELOC) == 0
    406               || section->reloc_count == 0)
    407             continue;
    408 
    409           /* If this section is a link-once section that will be
    410              discarded, then don't create any stubs.  */
    411           if (section->output_section == NULL
    412               || section->output_section->owner != output_bfd)
    413             continue;
    414 
    415           /* Get the relocs.  */
    416           internal_relocs
    417             = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
    418 					 (Elf_Internal_Rela *) NULL,
    419 					 info->keep_memory);
    420           if (internal_relocs == NULL)
    421             goto error_ret_free_local;
    422 
    423           /* Now examine each relocation.  */
    424           irela = internal_relocs;
    425           irelaend = irela + section->reloc_count;
    426           for (; irela < irelaend; irela++)
    427             {
    428               unsigned int r_type, r_indx;
    429               struct elf32_m68hc11_stub_hash_entry *stub_entry;
    430               asection *sym_sec;
    431               bfd_vma sym_value;
    432               struct elf_link_hash_entry *hash;
    433               const char *stub_name;
    434               Elf_Internal_Sym *sym;
    435 
    436               r_type = ELF32_R_TYPE (irela->r_info);
    437 
    438               /* Only look at 16-bit relocs.  */
    439               if (r_type != (unsigned int) R_M68HC11_16)
    440                 continue;
    441 
    442               /* Now determine the call target, its name, value,
    443                  section.  */
    444               r_indx = ELF32_R_SYM (irela->r_info);
    445               if (r_indx < symtab_hdr->sh_info)
    446                 {
    447                   /* It's a local symbol.  */
    448                   Elf_Internal_Shdr *hdr;
    449                   bfd_boolean is_far;
    450 
    451                   sym = local_syms + r_indx;
    452                   is_far = (sym && (sym->st_other & STO_M68HC12_FAR));
    453                   if (!is_far)
    454                     continue;
    455 
    456 		  if (sym->st_shndx >= elf_numsections (input_bfd))
    457 		    sym_sec = NULL;
    458 		  else
    459 		    {
    460 		      hdr = elf_elfsections (input_bfd)[sym->st_shndx];
    461 		      sym_sec = hdr->bfd_section;
    462 		    }
    463                   stub_name = (bfd_elf_string_from_elf_section
    464                                (input_bfd, symtab_hdr->sh_link,
    465                                 sym->st_name));
    466                   sym_value = sym->st_value;
    467                   hash = NULL;
    468                 }
    469               else
    470                 {
    471                   /* It's an external symbol.  */
    472                   int e_indx;
    473 
    474                   e_indx = r_indx - symtab_hdr->sh_info;
    475                   hash = (struct elf_link_hash_entry *)
    476                     (sym_hashes[e_indx]);
    477 
    478                   while (hash->root.type == bfd_link_hash_indirect
    479                          || hash->root.type == bfd_link_hash_warning)
    480                     hash = ((struct elf_link_hash_entry *)
    481                             hash->root.u.i.link);
    482 
    483                   if (hash->root.type == bfd_link_hash_defined
    484                       || hash->root.type == bfd_link_hash_defweak
    485                       || hash->root.type == bfd_link_hash_new)
    486                     {
    487                       if (!(hash->other & STO_M68HC12_FAR))
    488                         continue;
    489                     }
    490                   else if (hash->root.type == bfd_link_hash_undefweak)
    491                     {
    492                       continue;
    493                     }
    494                   else if (hash->root.type == bfd_link_hash_undefined)
    495                     {
    496                       continue;
    497                     }
    498                   else
    499                     {
    500                       bfd_set_error (bfd_error_bad_value);
    501                       goto error_ret_free_internal;
    502                     }
    503                   sym_sec = hash->root.u.def.section;
    504                   sym_value = hash->root.u.def.value;
    505                   stub_name = hash->root.root.string;
    506                 }
    507 
    508               if (!stub_name)
    509                 goto error_ret_free_internal;
    510 
    511               stub_entry = m68hc12_stub_hash_lookup
    512                 (htab->stub_hash_table,
    513                  stub_name,
    514                  FALSE, FALSE);
    515               if (stub_entry == NULL)
    516                 {
    517                   if (add_stub_section == 0)
    518                     continue;
    519 
    520                   stub_entry = m68hc12_add_stub (stub_name, section, htab);
    521                   if (stub_entry == NULL)
    522                     {
    523                     error_ret_free_internal:
    524                       if (elf_section_data (section)->relocs == NULL)
    525                         free (internal_relocs);
    526                       goto error_ret_free_local;
    527                     }
    528                 }
    529 
    530               stub_entry->target_value = sym_value;
    531               stub_entry->target_section = sym_sec;
    532             }
    533 
    534           /* We're done with the internal relocs, free them.  */
    535           if (elf_section_data (section)->relocs == NULL)
    536             free (internal_relocs);
    537         }
    538     }
    539 
    540   if (add_stub_section)
    541     {
    542       /* OK, we've added some stubs.  Find out the new size of the
    543          stub sections.  */
    544       for (stub_sec = htab->stub_bfd->sections;
    545            stub_sec != NULL;
    546            stub_sec = stub_sec->next)
    547         {
    548           stub_sec->size = 0;
    549         }
    550 
    551       bfd_hash_traverse (htab->stub_hash_table, htab->size_one_stub, htab);
    552     }
    553   free (all_local_syms);
    554   return TRUE;
    555 
    556  error_ret_free_local:
    557   free (all_local_syms);
    558   return FALSE;
    559 }
    560 
    561 /* Export the trampoline addresses in the symbol table.  */
    562 static bfd_boolean
    563 m68hc11_elf_export_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
    564 {
    565   struct bfd_link_info *info;
    566   struct m68hc11_elf_link_hash_table *htab;
    567   struct elf32_m68hc11_stub_hash_entry *stub_entry;
    568   char* name;
    569   bfd_boolean result;
    570 
    571   info = (struct bfd_link_info *) in_arg;
    572   htab = m68hc11_elf_hash_table (info);
    573   if (htab == NULL)
    574     return FALSE;
    575 
    576   /* Massage our args to the form they really have.  */
    577   stub_entry = (struct elf32_m68hc11_stub_hash_entry *) gen_entry;
    578 
    579   /* Generate the trampoline according to HC11 or HC12.  */
    580   result = (* htab->build_one_stub) (gen_entry, in_arg);
    581 
    582   /* Make a printable name that does not conflict with the real function.  */
    583   name = alloca (strlen (stub_entry->root.string) + 16);
    584   sprintf (name, "tramp.%s", stub_entry->root.string);
    585 
    586   /* Export the symbol for debugging/disassembling.  */
    587   m68hc11_elf_set_symbol (htab->stub_bfd, info, name,
    588                           stub_entry->stub_offset,
    589                           stub_entry->stub_sec);
    590   return result;
    591 }
    592 
    593 /* Export a symbol or set its value and section.  */
    594 static void
    595 m68hc11_elf_set_symbol (bfd *abfd, struct bfd_link_info *info,
    596                         const char *name, bfd_vma value, asection *sec)
    597 {
    598   struct elf_link_hash_entry *h;
    599 
    600   h = (struct elf_link_hash_entry *)
    601     bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE);
    602   if (h == NULL)
    603     {
    604       _bfd_generic_link_add_one_symbol (info, abfd,
    605                                         name,
    606                                         BSF_GLOBAL,
    607                                         sec,
    608                                         value,
    609                                         (const char*) NULL,
    610                                         TRUE, FALSE, NULL);
    611     }
    612   else
    613     {
    614       h->root.type = bfd_link_hash_defined;
    615       h->root.u.def.value = value;
    616       h->root.u.def.section = sec;
    617     }
    618 }
    619 
    620 
    621 /* Build all the stubs associated with the current output file.  The
    622    stubs are kept in a hash table attached to the main linker hash
    623    table.  This function is called via m68hc12elf_finish in the
    624    linker.  */
    625 
    626 bfd_boolean
    627 elf32_m68hc11_build_stubs (bfd *abfd, struct bfd_link_info *info)
    628 {
    629   asection *stub_sec;
    630   struct bfd_hash_table *table;
    631   struct m68hc11_elf_link_hash_table *htab;
    632   struct m68hc11_scan_param param;
    633 
    634   m68hc11_elf_get_bank_parameters (info);
    635   htab = m68hc11_elf_hash_table (info);
    636   if (htab == NULL)
    637     return FALSE;
    638 
    639   for (stub_sec = htab->stub_bfd->sections;
    640        stub_sec != NULL;
    641        stub_sec = stub_sec->next)
    642     {
    643       bfd_size_type size;
    644 
    645       /* Allocate memory to hold the linker stubs.  */
    646       size = stub_sec->size;
    647       stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size);
    648       if (stub_sec->contents == NULL && size != 0)
    649 	return FALSE;
    650       stub_sec->size = 0;
    651     }
    652 
    653   /* Build the stubs as directed by the stub hash table.  */
    654   table = htab->stub_hash_table;
    655   bfd_hash_traverse (table, m68hc11_elf_export_one_stub, info);
    656 
    657   /* Scan the output sections to see if we use the memory banks.
    658      If so, export the symbols that define how the memory banks
    659      are mapped.  This is used by gdb and the simulator to obtain
    660      the information.  It can be used by programs to burn the eprom
    661      at the good addresses.  */
    662   param.use_memory_banks = FALSE;
    663   param.pinfo = &htab->pinfo;
    664   bfd_map_over_sections (abfd, scan_sections_for_abi, &param);
    665   if (param.use_memory_banks)
    666     {
    667       m68hc11_elf_set_symbol (abfd, info, BFD_M68HC11_BANK_START_NAME,
    668                               htab->pinfo.bank_physical,
    669                               bfd_abs_section_ptr);
    670       m68hc11_elf_set_symbol (abfd, info, BFD_M68HC11_BANK_VIRTUAL_NAME,
    671                               htab->pinfo.bank_virtual,
    672                               bfd_abs_section_ptr);
    673       m68hc11_elf_set_symbol (abfd, info, BFD_M68HC11_BANK_SIZE_NAME,
    674                               htab->pinfo.bank_size,
    675                               bfd_abs_section_ptr);
    676     }
    677 
    678   return TRUE;
    679 }
    680 
    681 void
    682 m68hc11_elf_get_bank_parameters (struct bfd_link_info *info)
    683 {
    684   unsigned i;
    685   struct m68hc11_page_info *pinfo;
    686   struct bfd_link_hash_entry *h;
    687   struct m68hc11_elf_link_hash_table *htab;
    688 
    689   htab = m68hc11_elf_hash_table (info);
    690   if (htab == NULL)
    691     return;
    692 
    693   pinfo = & htab->pinfo;
    694   if (pinfo->bank_param_initialized)
    695     return;
    696 
    697   pinfo->bank_virtual = M68HC12_BANK_VIRT;
    698   pinfo->bank_mask = M68HC12_BANK_MASK;
    699   pinfo->bank_physical = M68HC12_BANK_BASE;
    700   pinfo->bank_shift = M68HC12_BANK_SHIFT;
    701   pinfo->bank_size = 1 << M68HC12_BANK_SHIFT;
    702 
    703   h = bfd_link_hash_lookup (info->hash, BFD_M68HC11_BANK_START_NAME,
    704                             FALSE, FALSE, TRUE);
    705   if (h != (struct bfd_link_hash_entry*) NULL
    706       && h->type == bfd_link_hash_defined)
    707     pinfo->bank_physical = (h->u.def.value
    708                             + h->u.def.section->output_section->vma
    709                             + h->u.def.section->output_offset);
    710 
    711   h = bfd_link_hash_lookup (info->hash, BFD_M68HC11_BANK_VIRTUAL_NAME,
    712                             FALSE, FALSE, TRUE);
    713   if (h != (struct bfd_link_hash_entry*) NULL
    714       && h->type == bfd_link_hash_defined)
    715     pinfo->bank_virtual = (h->u.def.value
    716                            + h->u.def.section->output_section->vma
    717                            + h->u.def.section->output_offset);
    718 
    719   h = bfd_link_hash_lookup (info->hash, BFD_M68HC11_BANK_SIZE_NAME,
    720                             FALSE, FALSE, TRUE);
    721   if (h != (struct bfd_link_hash_entry*) NULL
    722       && h->type == bfd_link_hash_defined)
    723     pinfo->bank_size = (h->u.def.value
    724                         + h->u.def.section->output_section->vma
    725                         + h->u.def.section->output_offset);
    726 
    727   pinfo->bank_shift = 0;
    728   for (i = pinfo->bank_size; i != 0; i >>= 1)
    729     pinfo->bank_shift++;
    730   pinfo->bank_shift--;
    731   pinfo->bank_mask = (1 << pinfo->bank_shift) - 1;
    732   pinfo->bank_physical_end = pinfo->bank_physical + pinfo->bank_size;
    733   pinfo->bank_param_initialized = 1;
    734 
    735   h = bfd_link_hash_lookup (info->hash, "__far_trampoline", FALSE,
    736                             FALSE, TRUE);
    737   if (h != (struct bfd_link_hash_entry*) NULL
    738       && h->type == bfd_link_hash_defined)
    739     pinfo->trampoline_addr = (h->u.def.value
    740                               + h->u.def.section->output_section->vma
    741                               + h->u.def.section->output_offset);
    742 }
    743 
    744 /* Return 1 if the address is in banked memory.
    745    This can be applied to a virtual address and to a physical address.  */
    746 int
    747 m68hc11_addr_is_banked (struct m68hc11_page_info *pinfo, bfd_vma addr)
    748 {
    749   if (addr >= pinfo->bank_virtual)
    750     return 1;
    751 
    752   if (addr >= pinfo->bank_physical && addr <= pinfo->bank_physical_end)
    753     return 1;
    754 
    755   return 0;
    756 }
    757 
    758 /* Return the physical address seen by the processor, taking
    759    into account banked memory.  */
    760 bfd_vma
    761 m68hc11_phys_addr (struct m68hc11_page_info *pinfo, bfd_vma addr)
    762 {
    763   if (addr < pinfo->bank_virtual)
    764     return addr;
    765 
    766   /* Map the address to the memory bank.  */
    767   addr -= pinfo->bank_virtual;
    768   addr &= pinfo->bank_mask;
    769   addr += pinfo->bank_physical;
    770   return addr;
    771 }
    772 
    773 /* Return the page number corresponding to an address in banked memory.  */
    774 bfd_vma
    775 m68hc11_phys_page (struct m68hc11_page_info *pinfo, bfd_vma addr)
    776 {
    777   if (addr < pinfo->bank_virtual)
    778     return 0;
    779 
    780   /* Map the address to the memory bank.  */
    781   addr -= pinfo->bank_virtual;
    782   addr >>= pinfo->bank_shift;
    783   addr &= 0x0ff;
    784   return addr;
    785 }
    786 
    787 /* This function is used for relocs which are only used for relaxing,
    788    which the linker should otherwise ignore.  */
    789 
    790 bfd_reloc_status_type
    791 m68hc11_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    792                           arelent *reloc_entry,
    793                           asymbol *symbol ATTRIBUTE_UNUSED,
    794                           void *data ATTRIBUTE_UNUSED,
    795                           asection *input_section,
    796                           bfd *output_bfd,
    797                           char **error_message ATTRIBUTE_UNUSED)
    798 {
    799   if (output_bfd != NULL)
    800     reloc_entry->address += input_section->output_offset;
    801   return bfd_reloc_ok;
    802 }
    803 
    804 bfd_reloc_status_type
    805 m68hc11_elf_special_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    806                            arelent *reloc_entry,
    807                            asymbol *symbol,
    808                            void *data ATTRIBUTE_UNUSED,
    809                            asection *input_section,
    810                            bfd *output_bfd,
    811                            char **error_message ATTRIBUTE_UNUSED)
    812 {
    813   if (output_bfd != (bfd *) NULL
    814       && (symbol->flags & BSF_SECTION_SYM) == 0
    815       && (! reloc_entry->howto->partial_inplace
    816 	  || reloc_entry->addend == 0))
    817     {
    818       reloc_entry->address += input_section->output_offset;
    819       return bfd_reloc_ok;
    820     }
    821 
    822   if (output_bfd != NULL)
    823     return bfd_reloc_continue;
    824 
    825   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    826     return bfd_reloc_outofrange;
    827 
    828   abort();
    829 }
    830 
    831 /* Look through the relocs for a section during the first phase.
    832    Since we don't do .gots or .plts, we just need to consider the
    833    virtual table relocs for gc.  */
    834 
    835 bfd_boolean
    836 elf32_m68hc11_check_relocs (bfd *abfd, struct bfd_link_info *info,
    837                             asection *sec, const Elf_Internal_Rela *relocs)
    838 {
    839   Elf_Internal_Shdr *           symtab_hdr;
    840   struct elf_link_hash_entry ** sym_hashes;
    841   const Elf_Internal_Rela *     rel;
    842   const Elf_Internal_Rela *     rel_end;
    843 
    844   if (info->relocatable)
    845     return TRUE;
    846 
    847   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
    848   sym_hashes = elf_sym_hashes (abfd);
    849   rel_end = relocs + sec->reloc_count;
    850 
    851   for (rel = relocs; rel < rel_end; rel++)
    852     {
    853       struct elf_link_hash_entry * h;
    854       unsigned long r_symndx;
    855 
    856       r_symndx = ELF32_R_SYM (rel->r_info);
    857 
    858       if (r_symndx < symtab_hdr->sh_info)
    859         h = NULL;
    860       else
    861 	{
    862 	  h = sym_hashes [r_symndx - symtab_hdr->sh_info];
    863 	  while (h->root.type == bfd_link_hash_indirect
    864 		 || h->root.type == bfd_link_hash_warning)
    865 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
    866 	}
    867 
    868       switch (ELF32_R_TYPE (rel->r_info))
    869         {
    870         /* This relocation describes the C++ object vtable hierarchy.
    871            Reconstruct it for later use during GC.  */
    872         case R_M68HC11_GNU_VTINHERIT:
    873           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
    874             return FALSE;
    875           break;
    876 
    877         /* This relocation describes which C++ vtable entries are actually
    878            used.  Record for later use during GC.  */
    879         case R_M68HC11_GNU_VTENTRY:
    880           BFD_ASSERT (h != NULL);
    881           if (h != NULL
    882               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
    883             return FALSE;
    884           break;
    885         }
    886     }
    887 
    888   return TRUE;
    889 }
    890 
    891 /* Relocate a 68hc11/68hc12 ELF section.  */
    892 bfd_boolean
    893 elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
    894                                 struct bfd_link_info *info,
    895                                 bfd *input_bfd, asection *input_section,
    896                                 bfd_byte *contents, Elf_Internal_Rela *relocs,
    897                                 Elf_Internal_Sym *local_syms,
    898                                 asection **local_sections)
    899 {
    900   Elf_Internal_Shdr *symtab_hdr;
    901   struct elf_link_hash_entry **sym_hashes;
    902   Elf_Internal_Rela *rel, *relend;
    903   const char *name = NULL;
    904   struct m68hc11_page_info *pinfo;
    905   const struct elf_backend_data * const ebd = get_elf_backend_data (input_bfd);
    906   struct m68hc11_elf_link_hash_table *htab;
    907 
    908   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    909   sym_hashes = elf_sym_hashes (input_bfd);
    910 
    911   htab = m68hc11_elf_hash_table (info);
    912   if (htab == NULL)
    913     return FALSE;
    914 
    915   /* Get memory bank parameters.  */
    916   m68hc11_elf_get_bank_parameters (info);
    917 
    918   pinfo = & htab->pinfo;
    919   rel = relocs;
    920   relend = relocs + input_section->reloc_count;
    921 
    922   for (; rel < relend; rel++)
    923     {
    924       int r_type;
    925       arelent arel;
    926       reloc_howto_type *howto;
    927       unsigned long r_symndx;
    928       Elf_Internal_Sym *sym;
    929       asection *sec;
    930       bfd_vma relocation = 0;
    931       bfd_reloc_status_type r = bfd_reloc_undefined;
    932       bfd_vma phys_page;
    933       bfd_vma phys_addr;
    934       bfd_vma insn_addr;
    935       bfd_vma insn_page;
    936       bfd_boolean is_far = FALSE;
    937       struct elf_link_hash_entry *h;
    938 
    939       r_symndx = ELF32_R_SYM (rel->r_info);
    940       r_type = ELF32_R_TYPE (rel->r_info);
    941 
    942       if (r_type == R_M68HC11_GNU_VTENTRY
    943           || r_type == R_M68HC11_GNU_VTINHERIT )
    944         continue;
    945 
    946       (*ebd->elf_info_to_howto_rel) (input_bfd, &arel, rel);
    947       howto = arel.howto;
    948 
    949       h = NULL;
    950       sym = NULL;
    951       sec = NULL;
    952       if (r_symndx < symtab_hdr->sh_info)
    953 	{
    954 	  sym = local_syms + r_symndx;
    955 	  sec = local_sections[r_symndx];
    956 	  relocation = (sec->output_section->vma
    957 			+ sec->output_offset
    958 			+ sym->st_value);
    959 	  is_far = (sym && (sym->st_other & STO_M68HC12_FAR));
    960 	}
    961       else
    962 	{
    963 	  bfd_boolean unresolved_reloc, warned;
    964 
    965 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
    966 				   r_symndx, symtab_hdr, sym_hashes,
    967 				   h, sec, relocation, unresolved_reloc,
    968 				   warned);
    969 
    970 	  is_far = (h && (h->other & STO_M68HC12_FAR));
    971 	}
    972 
    973       if (sec != NULL && elf_discarded_section (sec))
    974 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
    975 					 rel, relend, howto, contents);
    976 
    977       if (info->relocatable)
    978 	{
    979 	  /* This is a relocatable link.  We don't have to change
    980 	     anything, unless the reloc is against a section symbol,
    981 	     in which case we have to adjust according to where the
    982 	     section symbol winds up in the output section.  */
    983 	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
    984 	    rel->r_addend += sec->output_offset;
    985 	  continue;
    986 	}
    987 
    988       if (h != NULL)
    989 	name = h->root.root.string;
    990       else
    991 	{
    992 	  name = (bfd_elf_string_from_elf_section
    993 		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
    994 	  if (name == NULL || *name == '\0')
    995 	    name = bfd_section_name (input_bfd, sec);
    996 	}
    997 
    998       if (is_far && ELF32_R_TYPE (rel->r_info) == R_M68HC11_16)
    999 	{
   1000 	  struct elf32_m68hc11_stub_hash_entry* stub;
   1001 
   1002 	  stub = m68hc12_stub_hash_lookup (htab->stub_hash_table,
   1003 					   name, FALSE, FALSE);
   1004 	  if (stub)
   1005 	    {
   1006 	      relocation = stub->stub_offset
   1007 		+ stub->stub_sec->output_section->vma
   1008 		+ stub->stub_sec->output_offset;
   1009 	      is_far = FALSE;
   1010 	    }
   1011 	}
   1012 
   1013       /* Do the memory bank mapping.  */
   1014       phys_addr = m68hc11_phys_addr (pinfo, relocation + rel->r_addend);
   1015       phys_page = m68hc11_phys_page (pinfo, relocation + rel->r_addend);
   1016       switch (r_type)
   1017         {
   1018         case R_M68HC11_24:
   1019           /* Reloc used by 68HC12 call instruction.  */
   1020           bfd_put_16 (input_bfd, phys_addr,
   1021                       (bfd_byte*) contents + rel->r_offset);
   1022           bfd_put_8 (input_bfd, phys_page,
   1023                      (bfd_byte*) contents + rel->r_offset + 2);
   1024           r = bfd_reloc_ok;
   1025           r_type = R_M68HC11_NONE;
   1026           break;
   1027 
   1028         case R_M68HC11_NONE:
   1029           r = bfd_reloc_ok;
   1030           break;
   1031 
   1032         case R_M68HC11_LO16:
   1033           /* Reloc generated by %addr(expr) gas to obtain the
   1034              address as mapped in the memory bank window.  */
   1035           relocation = phys_addr;
   1036           break;
   1037 
   1038         case R_M68HC11_PAGE:
   1039           /* Reloc generated by %page(expr) gas to obtain the
   1040              page number associated with the address.  */
   1041           relocation = phys_page;
   1042           break;
   1043 
   1044         case R_M68HC11_16:
   1045           /* Get virtual address of instruction having the relocation.  */
   1046           if (is_far)
   1047             {
   1048               const char* msg;
   1049               char* buf;
   1050               msg = _("Reference to the far symbol `%s' using a wrong "
   1051                       "relocation may result in incorrect execution");
   1052               buf = alloca (strlen (msg) + strlen (name) + 10);
   1053               sprintf (buf, msg, name);
   1054 
   1055               (* info->callbacks->warning)
   1056                 (info, buf, name, input_bfd, NULL, rel->r_offset);
   1057             }
   1058 
   1059           /* Get virtual address of instruction having the relocation.  */
   1060           insn_addr = input_section->output_section->vma
   1061             + input_section->output_offset
   1062             + rel->r_offset;
   1063 
   1064           insn_page = m68hc11_phys_page (pinfo, insn_addr);
   1065 
   1066           if (m68hc11_addr_is_banked (pinfo, relocation + rel->r_addend)
   1067               && m68hc11_addr_is_banked (pinfo, insn_addr)
   1068               && phys_page != insn_page)
   1069             {
   1070               const char* msg;
   1071               char* buf;
   1072 
   1073               msg = _("banked address [%lx:%04lx] (%lx) is not in the same bank "
   1074                       "as current banked address [%lx:%04lx] (%lx)");
   1075 
   1076               buf = alloca (strlen (msg) + 128);
   1077               sprintf (buf, msg, phys_page, phys_addr,
   1078                        (long) (relocation + rel->r_addend),
   1079                        insn_page, m68hc11_phys_addr (pinfo, insn_addr),
   1080                        (long) (insn_addr));
   1081               if (!((*info->callbacks->warning)
   1082                     (info, buf, name, input_bfd, input_section,
   1083                      rel->r_offset)))
   1084                 return FALSE;
   1085               break;
   1086             }
   1087           if (phys_page != 0 && insn_page == 0)
   1088             {
   1089               const char* msg;
   1090               char* buf;
   1091 
   1092               msg = _("reference to a banked address [%lx:%04lx] in the "
   1093                       "normal address space at %04lx");
   1094 
   1095               buf = alloca (strlen (msg) + 128);
   1096               sprintf (buf, msg, phys_page, phys_addr, insn_addr);
   1097               if (!((*info->callbacks->warning)
   1098                     (info, buf, name, input_bfd, input_section,
   1099                      insn_addr)))
   1100                 return FALSE;
   1101 
   1102               relocation = phys_addr;
   1103               break;
   1104             }
   1105 
   1106           /* If this is a banked address use the phys_addr so that
   1107              we stay in the banked window.  */
   1108           if (m68hc11_addr_is_banked (pinfo, relocation + rel->r_addend))
   1109             relocation = phys_addr;
   1110           break;
   1111         }
   1112       if (r_type != R_M68HC11_NONE)
   1113         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   1114                                       contents, rel->r_offset,
   1115                                       relocation, rel->r_addend);
   1116 
   1117       if (r != bfd_reloc_ok)
   1118 	{
   1119 	  const char * msg = (const char *) 0;
   1120 
   1121 	  switch (r)
   1122 	    {
   1123 	    case bfd_reloc_overflow:
   1124 	      if (!((*info->callbacks->reloc_overflow)
   1125 		    (info, NULL, name, howto->name, (bfd_vma) 0,
   1126 		     input_bfd, input_section, rel->r_offset)))
   1127 		return FALSE;
   1128 	      break;
   1129 
   1130 	    case bfd_reloc_undefined:
   1131 	      if (!((*info->callbacks->undefined_symbol)
   1132 		    (info, name, input_bfd, input_section,
   1133 		     rel->r_offset, TRUE)))
   1134 		return FALSE;
   1135 	      break;
   1136 
   1137 	    case bfd_reloc_outofrange:
   1138 	      msg = _ ("internal error: out of range error");
   1139 	      goto common_error;
   1140 
   1141 	    case bfd_reloc_notsupported:
   1142 	      msg = _ ("internal error: unsupported relocation error");
   1143 	      goto common_error;
   1144 
   1145 	    case bfd_reloc_dangerous:
   1146 	      msg = _ ("internal error: dangerous error");
   1147 	      goto common_error;
   1148 
   1149 	    default:
   1150 	      msg = _ ("internal error: unknown error");
   1151 	      /* fall through */
   1152 
   1153 	    common_error:
   1154 	      if (!((*info->callbacks->warning)
   1155 		    (info, msg, name, input_bfd, input_section,
   1156 		     rel->r_offset)))
   1157 		return FALSE;
   1158 	      break;
   1159 	    }
   1160 	}
   1161     }
   1162 
   1163   return TRUE;
   1164 }
   1165 
   1166 
   1167 
   1168 /* Set and control ELF flags in ELF header.  */
   1170 
   1171 bfd_boolean
   1172 _bfd_m68hc11_elf_set_private_flags (bfd *abfd, flagword flags)
   1173 {
   1174   BFD_ASSERT (!elf_flags_init (abfd)
   1175 	      || elf_elfheader (abfd)->e_flags == flags);
   1176 
   1177   elf_elfheader (abfd)->e_flags = flags;
   1178   elf_flags_init (abfd) = TRUE;
   1179   return TRUE;
   1180 }
   1181 
   1182 /* Merge backend specific data from an object file to the output
   1183    object file when linking.  */
   1184 
   1185 bfd_boolean
   1186 _bfd_m68hc11_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   1187 {
   1188   flagword old_flags;
   1189   flagword new_flags;
   1190   bfd_boolean ok = TRUE;
   1191 
   1192   /* Check if we have the same endianess */
   1193   if (!_bfd_generic_verify_endian_match (ibfd, obfd))
   1194     return FALSE;
   1195 
   1196   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   1197       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   1198     return TRUE;
   1199 
   1200   new_flags = elf_elfheader (ibfd)->e_flags;
   1201   elf_elfheader (obfd)->e_flags |= new_flags & EF_M68HC11_ABI;
   1202   old_flags = elf_elfheader (obfd)->e_flags;
   1203 
   1204   if (! elf_flags_init (obfd))
   1205     {
   1206       elf_flags_init (obfd) = TRUE;
   1207       elf_elfheader (obfd)->e_flags = new_flags;
   1208       elf_elfheader (obfd)->e_ident[EI_CLASS]
   1209 	= elf_elfheader (ibfd)->e_ident[EI_CLASS];
   1210 
   1211       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   1212 	  && bfd_get_arch_info (obfd)->the_default)
   1213 	{
   1214 	  if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
   1215 				   bfd_get_mach (ibfd)))
   1216 	    return FALSE;
   1217 	}
   1218 
   1219       return TRUE;
   1220     }
   1221 
   1222   /* Check ABI compatibility.  */
   1223   if ((new_flags & E_M68HC11_I32) != (old_flags & E_M68HC11_I32))
   1224     {
   1225       (*_bfd_error_handler)
   1226 	(_("%B: linking files compiled for 16-bit integers (-mshort) "
   1227            "and others for 32-bit integers"), ibfd);
   1228       ok = FALSE;
   1229     }
   1230   if ((new_flags & E_M68HC11_F64) != (old_flags & E_M68HC11_F64))
   1231     {
   1232       (*_bfd_error_handler)
   1233 	(_("%B: linking files compiled for 32-bit double (-fshort-double) "
   1234            "and others for 64-bit double"), ibfd);
   1235       ok = FALSE;
   1236     }
   1237 
   1238   /* Processor compatibility.  */
   1239   if (!EF_M68HC11_CAN_MERGE_MACH (new_flags, old_flags))
   1240     {
   1241       (*_bfd_error_handler)
   1242 	(_("%B: linking files compiled for HCS12 with "
   1243            "others compiled for HC12"), ibfd);
   1244       ok = FALSE;
   1245     }
   1246   new_flags = ((new_flags & ~EF_M68HC11_MACH_MASK)
   1247                | (EF_M68HC11_MERGE_MACH (new_flags, old_flags)));
   1248 
   1249   elf_elfheader (obfd)->e_flags = new_flags;
   1250 
   1251   new_flags &= ~(EF_M68HC11_ABI | EF_M68HC11_MACH_MASK);
   1252   old_flags &= ~(EF_M68HC11_ABI | EF_M68HC11_MACH_MASK);
   1253 
   1254   /* Warn about any other mismatches */
   1255   if (new_flags != old_flags)
   1256     {
   1257       (*_bfd_error_handler)
   1258 	(_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
   1259 	 ibfd, (unsigned long) new_flags, (unsigned long) old_flags);
   1260       ok = FALSE;
   1261     }
   1262 
   1263   if (! ok)
   1264     {
   1265       bfd_set_error (bfd_error_bad_value);
   1266       return FALSE;
   1267     }
   1268 
   1269   return TRUE;
   1270 }
   1271 
   1272 bfd_boolean
   1273 _bfd_m68hc11_elf_print_private_bfd_data (bfd *abfd, void *ptr)
   1274 {
   1275   FILE *file = (FILE *) ptr;
   1276 
   1277   BFD_ASSERT (abfd != NULL && ptr != NULL);
   1278 
   1279   /* Print normal ELF private data.  */
   1280   _bfd_elf_print_private_bfd_data (abfd, ptr);
   1281 
   1282   /* xgettext:c-format */
   1283   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
   1284 
   1285   if (elf_elfheader (abfd)->e_flags & E_M68HC11_I32)
   1286     fprintf (file, _("[abi=32-bit int, "));
   1287   else
   1288     fprintf (file, _("[abi=16-bit int, "));
   1289 
   1290   if (elf_elfheader (abfd)->e_flags & E_M68HC11_F64)
   1291     fprintf (file, _("64-bit double, "));
   1292   else
   1293     fprintf (file, _("32-bit double, "));
   1294 
   1295   if (strcmp (bfd_get_target (abfd), "elf32-m68hc11") == 0)
   1296     fprintf (file, _("cpu=HC11]"));
   1297   else if (elf_elfheader (abfd)->e_flags & EF_M68HCS12_MACH)
   1298     fprintf (file, _("cpu=HCS12]"));
   1299   else
   1300     fprintf (file, _("cpu=HC12]"));
   1301 
   1302   if (elf_elfheader (abfd)->e_flags & E_M68HC12_BANKS)
   1303     fprintf (file, _(" [memory=bank-model]"));
   1304   else
   1305     fprintf (file, _(" [memory=flat]"));
   1306 
   1307   fputc ('\n', file);
   1308 
   1309   return TRUE;
   1310 }
   1311 
   1312 static void scan_sections_for_abi (bfd *abfd ATTRIBUTE_UNUSED,
   1313                                    asection *asect, void *arg)
   1314 {
   1315   struct m68hc11_scan_param* p = (struct m68hc11_scan_param*) arg;
   1316 
   1317   if (asect->vma >= p->pinfo->bank_virtual)
   1318     p->use_memory_banks = TRUE;
   1319 }
   1320 
   1321 /* Tweak the OSABI field of the elf header.  */
   1322 
   1323 void
   1324 elf32_m68hc11_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
   1325 {
   1326   struct m68hc11_scan_param param;
   1327   struct m68hc11_elf_link_hash_table *htab;
   1328 
   1329   if (link_info == NULL)
   1330     return;
   1331 
   1332   htab = m68hc11_elf_hash_table (link_info);
   1333   if (htab == NULL)
   1334     return;
   1335 
   1336   m68hc11_elf_get_bank_parameters (link_info);
   1337 
   1338   param.use_memory_banks = FALSE;
   1339   param.pinfo = & htab->pinfo;
   1340 
   1341   bfd_map_over_sections (abfd, scan_sections_for_abi, &param);
   1342 
   1343   if (param.use_memory_banks)
   1344     {
   1345       Elf_Internal_Ehdr * i_ehdrp;
   1346 
   1347       i_ehdrp = elf_elfheader (abfd);
   1348       i_ehdrp->e_flags |= E_M68HC12_BANKS;
   1349     }
   1350 }
   1351