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