1 /* Motorola 68HC11/68HC12-specific support for 32-bit ELF
2 Copyright 2003 Free Software Foundation, Inc.
3 Contributed by Stephane Carrez (stcarrez@nerim.fr)
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
21 #ifndef _ELF32_M68HC1X_H
22 #define _ELF32_M68HC1X_H
26 #include "elf/m68hc11.h"
28 /* Name of symbols exported by HC11/HC12 linker when there is a memory
30 #define BFD_M68HC11_BANK_START_NAME "__bank_start"
31 #define BFD_M68HC11_BANK_SIZE_NAME "__bank_size"
32 #define BFD_M68HC11_BANK_VIRTUAL_NAME "__bank_virtual"
34 /* Set and control ELF flags in ELF header. */
35 extern bfd_boolean _bfd_m68hc11_elf_merge_private_bfd_data
PARAMS ((bfd
*,bfd
*));
36 extern bfd_boolean _bfd_m68hc11_elf_set_private_flags
PARAMS ((bfd
*,flagword
));
37 extern bfd_boolean _bfd_m68hc11_elf_print_private_bfd_data
PARAMS ((bfd
*,PTR
));
39 /* This hash entry is used to record a trampoline that must be generated
40 to call a far function using a normal calling convention ('jsr').
41 The trampoline is used when a pointer to a far function is used.
42 It takes care of installing the proper memory bank as well as creating
43 the 'call/rtc' calling convention. */
44 struct elf32_m68hc11_stub_hash_entry
{
46 /* Base hash table entry structure. */
47 struct bfd_hash_entry root
;
49 /* The stub section. */
52 /* Offset within stub_sec of the beginning of this stub. */
55 /* Given the symbol's value and its section we can determine its final
56 value when building the stubs (so the stub knows where to jump. */
58 asection
*target_section
;
61 /* Placeholder for the parameters to compute memory page and physical address.
62 The following formulas are used:
65 %addr(sym) = (((sym - bank_virtual) & bank_mask) + bank_physical
66 %page(sym) = (((sym - bank_virtual) >> bank_shift) % 256
73 These parameters are obtained from the symbol table by looking
76 __bank_start Symbol marking the start of memory bank window
78 __bank_virtual Logical address of symbols for which the transformation
80 __bank_page_size Size in bytes of page size (this is *NOT* the memory
81 bank window size and the window size is always
82 less or equal to the page size)
84 For 68HC12, the window is at 0x8000 and the page size is 16K (full window).
85 For 68HC11 this is board specific (implemented by external hardware).
88 struct m68hc11_page_info
91 bfd_vma bank_physical
;
92 bfd_vma bank_physical_end
;
96 int bank_param_initialized
;
97 bfd_vma trampoline_addr
;
100 struct m68hc11_elf_link_hash_table
102 struct elf_link_hash_table root
;
103 struct m68hc11_page_info pinfo
;
105 /* The stub hash table. */
106 struct bfd_hash_table
* stub_hash_table
;
108 /* Linker stub bfd. */
111 asection
* stub_section
;
112 asection
* tramp_section
;
114 /* Linker call-backs. */
115 asection
* (*add_stub_section
) PARAMS ((const char *, asection
*));
117 /* Assorted information used by elf32_hppa_size_stubs. */
118 unsigned int bfd_count
;
120 asection
**input_list
;
121 Elf_Internal_Sym
**all_local_syms
;
123 /* Small local sym to section mapping cache. */
124 struct sym_sec_cache sym_sec
;
126 bfd_boolean (* size_one_stub
) PARAMS((struct bfd_hash_entry
*, PTR
));
127 bfd_boolean (* build_one_stub
) PARAMS((struct bfd_hash_entry
*, PTR
));
130 /* Get the Sparc64 ELF linker hash table from a link_info structure. */
132 #define m68hc11_elf_hash_table(p) \
133 ((struct m68hc11_elf_link_hash_table *) ((p)->hash))
135 /* Create a 68HC11/68HC12 ELF linker hash table. */
137 extern struct m68hc11_elf_link_hash_table
* m68hc11_elf_hash_table_create
139 extern void m68hc11_elf_bfd_link_hash_table_free
140 PARAMS ((struct bfd_link_hash_table
*));
142 extern void m68hc11_elf_get_bank_parameters
143 PARAMS ((struct bfd_link_info
*));
145 /* Return 1 if the address is in banked memory.
146 This can be applied to a virtual address and to a physical address. */
147 extern int m68hc11_addr_is_banked
148 PARAMS ((struct m68hc11_page_info
*, bfd_vma
));
150 /* Return the physical address seen by the processor, taking
151 into account banked memory. */
152 extern bfd_vma m68hc11_phys_addr
153 PARAMS ((struct m68hc11_page_info
*, bfd_vma
));
155 /* Return the page number corresponding to an address in banked memory. */
156 extern bfd_vma m68hc11_phys_page
157 PARAMS ((struct m68hc11_page_info
*, bfd_vma
));
159 bfd_reloc_status_type m68hc11_elf_ignore_reloc
160 PARAMS ((bfd
*abfd
, arelent
*reloc_entry
,
161 asymbol
*symbol
, PTR data
, asection
*input_section
,
162 bfd
*output_bfd
, char **error_message
));
163 bfd_reloc_status_type m68hc11_elf_special_reloc
164 PARAMS ((bfd
*abfd
, arelent
*reloc_entry
,
165 asymbol
*symbol
, PTR data
, asection
*input_section
,
166 bfd
*output_bfd
, char **error_message
));
168 /* GC mark and sweep. */
169 asection
*elf32_m68hc11_gc_mark_hook
170 PARAMS ((asection
*sec
, struct bfd_link_info
*info
,
171 Elf_Internal_Rela
*rel
, struct elf_link_hash_entry
*h
,
172 Elf_Internal_Sym
*sym
));
173 bfd_boolean elf32_m68hc11_gc_sweep_hook
174 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
,
175 asection
*sec
, const Elf_Internal_Rela
*relocs
));
176 bfd_boolean elf32_m68hc11_check_relocs
177 PARAMS ((bfd
* abfd
, struct bfd_link_info
* info
,
178 asection
* sec
, const Elf_Internal_Rela
* relocs
));
179 bfd_boolean elf32_m68hc11_relocate_section
180 PARAMS ((bfd
*output_bfd
, struct bfd_link_info
*info
,
181 bfd
*input_bfd
, asection
*input_section
,
182 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
183 Elf_Internal_Sym
*local_syms
, asection
**local_sections
));
185 bfd_boolean elf32_m68hc11_add_symbol_hook
186 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
,
187 const Elf_Internal_Sym
*sym
, const char **namep
,
188 flagword
*flagsp
, asection
**secp
,
191 /* Tweak the OSABI field of the elf header. */
193 extern void elf32_m68hc11_post_process_headers
194 PARAMS ((bfd
*, struct bfd_link_info
*));
196 int elf32_m68hc11_setup_section_lists
197 PARAMS ((bfd
*, struct bfd_link_info
*));
199 bfd_boolean elf32_m68hc11_size_stubs
200 PARAMS ((bfd
*, bfd
*, struct bfd_link_info
*,
201 asection
* (*) PARAMS ((const char *, asection
*))));
203 bfd_boolean elf32_m68hc11_build_stubs
204 PARAMS ((bfd
* abfd
, struct bfd_link_info
*));