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