elf32-h8300.c revision 1.1.1.4 1 1.1 skrll /* BFD back-end for Renesas H8/300 ELF binaries.
2 1.1.1.4 christos Copyright (C) 1993-2015 Free Software Foundation, Inc.
3 1.1 skrll
4 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
5 1.1 skrll
6 1.1 skrll This program is free software; you can redistribute it and/or modify
7 1.1 skrll it under the terms of the GNU General Public License as published by
8 1.1 skrll the Free Software Foundation; either version 3 of the License, or
9 1.1 skrll (at your option) any later version.
10 1.1 skrll
11 1.1 skrll This program is distributed in the hope that it will be useful,
12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 skrll GNU General Public License for more details.
15 1.1 skrll
16 1.1 skrll You should have received a copy of the GNU General Public License
17 1.1 skrll along with this program; if not, write to the Free Software
18 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 1.1 skrll MA 02110-1301, USA. */
20 1.1 skrll
21 1.1 skrll #include "sysdep.h"
22 1.1 skrll #include "bfd.h"
23 1.1 skrll #include "libbfd.h"
24 1.1 skrll #include "elf-bfd.h"
25 1.1 skrll #include "elf/h8.h"
26 1.1 skrll
27 1.1 skrll static reloc_howto_type *elf32_h8_reloc_type_lookup
28 1.1 skrll (bfd *abfd, bfd_reloc_code_real_type code);
29 1.1 skrll static void elf32_h8_info_to_howto
30 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
31 1.1 skrll static void elf32_h8_info_to_howto_rel
32 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
33 1.1 skrll static unsigned long elf32_h8_mach (flagword);
34 1.1 skrll static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
35 1.1 skrll static bfd_boolean elf32_h8_object_p (bfd *);
36 1.1 skrll static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
37 1.1 skrll static bfd_boolean elf32_h8_relax_section
38 1.1 skrll (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
39 1.1 skrll static bfd_boolean elf32_h8_relax_delete_bytes
40 1.1 skrll (bfd *, asection *, bfd_vma, int);
41 1.1 skrll static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
42 1.1 skrll static bfd_byte *elf32_h8_get_relocated_section_contents
43 1.1 skrll (bfd *, struct bfd_link_info *, struct bfd_link_order *,
44 1.1 skrll bfd_byte *, bfd_boolean, asymbol **);
45 1.1 skrll static bfd_reloc_status_type elf32_h8_final_link_relocate
46 1.1 skrll (unsigned long, bfd *, bfd *, asection *,
47 1.1 skrll bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
48 1.1 skrll struct bfd_link_info *, asection *, int);
49 1.1 skrll static bfd_boolean elf32_h8_relocate_section
50 1.1 skrll (bfd *, struct bfd_link_info *, bfd *, asection *,
51 1.1 skrll bfd_byte *, Elf_Internal_Rela *,
52 1.1 skrll Elf_Internal_Sym *, asection **);
53 1.1 skrll static bfd_reloc_status_type special
54 1.1.1.3 christos (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 1.1 skrll
56 1.1 skrll /* This does not include any relocation information, but should be
57 1.1 skrll good enough for GDB or objdump to read the file. */
58 1.1 skrll
59 1.1.1.3 christos static reloc_howto_type h8_elf_howto_table[] =
60 1.1.1.3 christos {
61 1.1 skrll #define R_H8_NONE_X 0
62 1.1 skrll HOWTO (R_H8_NONE, /* type */
63 1.1 skrll 0, /* rightshift */
64 1.1.1.4 christos 3, /* size (0 = byte, 1 = short, 2 = long) */
65 1.1 skrll 0, /* bitsize */
66 1.1 skrll FALSE, /* pc_relative */
67 1.1 skrll 0, /* bitpos */
68 1.1 skrll complain_overflow_dont,/* complain_on_overflow */
69 1.1 skrll special, /* special_function */
70 1.1 skrll "R_H8_NONE", /* name */
71 1.1 skrll FALSE, /* partial_inplace */
72 1.1 skrll 0, /* src_mask */
73 1.1 skrll 0, /* dst_mask */
74 1.1 skrll FALSE), /* pcrel_offset */
75 1.1 skrll #define R_H8_DIR32_X (R_H8_NONE_X + 1)
76 1.1 skrll HOWTO (R_H8_DIR32, /* type */
77 1.1 skrll 0, /* rightshift */
78 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
79 1.1 skrll 32, /* bitsize */
80 1.1 skrll FALSE, /* pc_relative */
81 1.1 skrll 0, /* bitpos */
82 1.1 skrll complain_overflow_dont,/* complain_on_overflow */
83 1.1 skrll special, /* special_function */
84 1.1 skrll "R_H8_DIR32", /* name */
85 1.1 skrll FALSE, /* partial_inplace */
86 1.1 skrll 0, /* src_mask */
87 1.1 skrll 0xffffffff, /* dst_mask */
88 1.1 skrll FALSE), /* pcrel_offset */
89 1.1 skrll #define R_H8_DIR16_X (R_H8_DIR32_X + 1)
90 1.1 skrll HOWTO (R_H8_DIR16, /* type */
91 1.1 skrll 0, /* rightshift */
92 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
93 1.1 skrll 16, /* bitsize */
94 1.1 skrll FALSE, /* pc_relative */
95 1.1 skrll 0, /* bitpos */
96 1.1 skrll complain_overflow_dont,/* complain_on_overflow */
97 1.1 skrll special, /* special_function */
98 1.1 skrll "R_H8_DIR16", /* name */
99 1.1 skrll FALSE, /* partial_inplace */
100 1.1 skrll 0, /* src_mask */
101 1.1 skrll 0x0000ffff, /* dst_mask */
102 1.1 skrll FALSE), /* pcrel_offset */
103 1.1 skrll #define R_H8_DIR8_X (R_H8_DIR16_X + 1)
104 1.1 skrll HOWTO (R_H8_DIR8, /* type */
105 1.1 skrll 0, /* rightshift */
106 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
107 1.1 skrll 8, /* bitsize */
108 1.1 skrll FALSE, /* pc_relative */
109 1.1 skrll 0, /* bitpos */
110 1.1 skrll complain_overflow_dont,/* complain_on_overflow */
111 1.1 skrll special, /* special_function */
112 1.1 skrll "R_H8_DIR8", /* name */
113 1.1 skrll FALSE, /* partial_inplace */
114 1.1 skrll 0, /* src_mask */
115 1.1 skrll 0x000000ff, /* dst_mask */
116 1.1 skrll FALSE), /* pcrel_offset */
117 1.1 skrll #define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
118 1.1 skrll HOWTO (R_H8_DIR16A8, /* type */
119 1.1 skrll 0, /* rightshift */
120 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
121 1.1 skrll 16, /* bitsize */
122 1.1 skrll FALSE, /* pc_relative */
123 1.1 skrll 0, /* bitpos */
124 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
125 1.1 skrll special, /* special_function */
126 1.1 skrll "R_H8_DIR16A8", /* name */
127 1.1 skrll FALSE, /* partial_inplace */
128 1.1 skrll 0, /* src_mask */
129 1.1 skrll 0x0000ffff, /* dst_mask */
130 1.1 skrll FALSE), /* pcrel_offset */
131 1.1 skrll #define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
132 1.1 skrll HOWTO (R_H8_DIR16R8, /* type */
133 1.1 skrll 0, /* rightshift */
134 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
135 1.1 skrll 16, /* bitsize */
136 1.1 skrll FALSE, /* pc_relative */
137 1.1 skrll 0, /* bitpos */
138 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
139 1.1 skrll special, /* special_function */
140 1.1 skrll "R_H8_DIR16R8", /* name */
141 1.1 skrll FALSE, /* partial_inplace */
142 1.1 skrll 0, /* src_mask */
143 1.1 skrll 0x0000ffff, /* dst_mask */
144 1.1 skrll FALSE), /* pcrel_offset */
145 1.1 skrll #define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
146 1.1 skrll HOWTO (R_H8_DIR24A8, /* type */
147 1.1 skrll 0, /* rightshift */
148 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
149 1.1 skrll 24, /* bitsize */
150 1.1 skrll FALSE, /* pc_relative */
151 1.1 skrll 0, /* bitpos */
152 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
153 1.1 skrll special, /* special_function */
154 1.1 skrll "R_H8_DIR24A8", /* name */
155 1.1 skrll TRUE, /* partial_inplace */
156 1.1 skrll 0xff000000, /* src_mask */
157 1.1 skrll 0x00ffffff, /* dst_mask */
158 1.1 skrll FALSE), /* pcrel_offset */
159 1.1 skrll #define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
160 1.1 skrll HOWTO (R_H8_DIR24R8, /* type */
161 1.1 skrll 0, /* rightshift */
162 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
163 1.1 skrll 24, /* bitsize */
164 1.1 skrll FALSE, /* pc_relative */
165 1.1 skrll 0, /* bitpos */
166 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
167 1.1 skrll special, /* special_function */
168 1.1 skrll "R_H8_DIR24R8", /* name */
169 1.1 skrll TRUE, /* partial_inplace */
170 1.1 skrll 0xff000000, /* src_mask */
171 1.1 skrll 0x00ffffff, /* dst_mask */
172 1.1 skrll FALSE), /* pcrel_offset */
173 1.1 skrll #define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
174 1.1 skrll HOWTO (R_H8_DIR32A16, /* type */
175 1.1 skrll 0, /* rightshift */
176 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
177 1.1 skrll 32, /* bitsize */
178 1.1 skrll FALSE, /* pc_relative */
179 1.1 skrll 0, /* bitpos */
180 1.1 skrll complain_overflow_dont,/* complain_on_overflow */
181 1.1 skrll special, /* special_function */
182 1.1 skrll "R_H8_DIR32A16", /* name */
183 1.1 skrll FALSE, /* partial_inplace */
184 1.1 skrll 0, /* src_mask */
185 1.1 skrll 0xffffffff, /* dst_mask */
186 1.1 skrll FALSE), /* pcrel_offset */
187 1.1.1.4 christos #define R_H8_DISP32A16_X (R_H8_DIR32A16_X + 1)
188 1.1.1.4 christos HOWTO (R_H8_DISP32A16, /* type */
189 1.1.1.4 christos 0, /* rightshift */
190 1.1.1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
191 1.1.1.4 christos 32, /* bitsize */
192 1.1.1.4 christos FALSE, /* pc_relative */
193 1.1.1.4 christos 0, /* bitpos */
194 1.1.1.4 christos complain_overflow_dont,/* complain_on_overflow */
195 1.1.1.4 christos special, /* special_function */
196 1.1.1.4 christos "R_H8_DISP32A16", /* name */
197 1.1.1.4 christos FALSE, /* partial_inplace */
198 1.1.1.4 christos 0, /* src_mask */
199 1.1.1.4 christos 0xffffffff, /* dst_mask */
200 1.1.1.4 christos FALSE), /* pcrel_offset */
201 1.1.1.4 christos #define R_H8_PCREL16_X (R_H8_DISP32A16_X + 1)
202 1.1 skrll HOWTO (R_H8_PCREL16, /* type */
203 1.1 skrll 0, /* rightshift */
204 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
205 1.1 skrll 16, /* bitsize */
206 1.1 skrll TRUE, /* pc_relative */
207 1.1 skrll 0, /* bitpos */
208 1.1 skrll complain_overflow_signed,/* complain_on_overflow */
209 1.1 skrll special, /* special_function */
210 1.1 skrll "R_H8_PCREL16", /* name */
211 1.1 skrll FALSE, /* partial_inplace */
212 1.1 skrll 0xffff, /* src_mask */
213 1.1 skrll 0xffff, /* dst_mask */
214 1.1 skrll TRUE), /* pcrel_offset */
215 1.1 skrll #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
216 1.1 skrll HOWTO (R_H8_PCREL8, /* type */
217 1.1 skrll 0, /* rightshift */
218 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
219 1.1 skrll 8, /* bitsize */
220 1.1 skrll TRUE, /* pc_relative */
221 1.1 skrll 0, /* bitpos */
222 1.1 skrll complain_overflow_signed,/* complain_on_overflow */
223 1.1 skrll special, /* special_function */
224 1.1 skrll "R_H8_PCREL8", /* name */
225 1.1 skrll FALSE, /* partial_inplace */
226 1.1 skrll 0xff, /* src_mask */
227 1.1 skrll 0xff, /* dst_mask */
228 1.1 skrll TRUE), /* pcrel_offset */
229 1.1 skrll };
230 1.1 skrll
231 1.1 skrll /* This structure is used to map BFD reloc codes to H8 ELF relocs. */
232 1.1 skrll
233 1.1 skrll struct elf_reloc_map {
234 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val;
235 1.1 skrll unsigned char howto_index;
236 1.1 skrll };
237 1.1 skrll
238 1.1 skrll /* An array mapping BFD reloc codes to H8 ELF relocs. */
239 1.1 skrll
240 1.1 skrll static const struct elf_reloc_map h8_reloc_map[] = {
241 1.1 skrll { BFD_RELOC_NONE, R_H8_NONE_X },
242 1.1 skrll { BFD_RELOC_32, R_H8_DIR32_X },
243 1.1 skrll { BFD_RELOC_16, R_H8_DIR16_X },
244 1.1 skrll { BFD_RELOC_8, R_H8_DIR8_X },
245 1.1 skrll { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
246 1.1 skrll { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
247 1.1 skrll { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
248 1.1 skrll { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
249 1.1 skrll { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
250 1.1.1.4 christos { BFD_RELOC_H8_DISP32A16, R_H8_DISP32A16_X },
251 1.1 skrll { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
252 1.1 skrll { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
253 1.1 skrll };
254 1.1 skrll
255 1.1 skrll
256 1.1 skrll static reloc_howto_type *
257 1.1 skrll elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
258 1.1 skrll bfd_reloc_code_real_type code)
259 1.1 skrll {
260 1.1 skrll unsigned int i;
261 1.1 skrll
262 1.1 skrll for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
263 1.1 skrll {
264 1.1 skrll if (h8_reloc_map[i].bfd_reloc_val == code)
265 1.1 skrll return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
266 1.1 skrll }
267 1.1 skrll return NULL;
268 1.1 skrll }
269 1.1 skrll
270 1.1 skrll static reloc_howto_type *
271 1.1 skrll elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
272 1.1 skrll const char *r_name)
273 1.1 skrll {
274 1.1 skrll unsigned int i;
275 1.1 skrll
276 1.1 skrll for (i = 0;
277 1.1 skrll i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
278 1.1 skrll i++)
279 1.1 skrll if (h8_elf_howto_table[i].name != NULL
280 1.1 skrll && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
281 1.1 skrll return &h8_elf_howto_table[i];
282 1.1 skrll
283 1.1 skrll return NULL;
284 1.1 skrll }
285 1.1 skrll
286 1.1 skrll static void
287 1.1 skrll elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
288 1.1 skrll Elf_Internal_Rela *elf_reloc)
289 1.1 skrll {
290 1.1 skrll unsigned int r;
291 1.1 skrll unsigned int i;
292 1.1 skrll
293 1.1 skrll r = ELF32_R_TYPE (elf_reloc->r_info);
294 1.1 skrll for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
295 1.1 skrll if (h8_elf_howto_table[i].type == r)
296 1.1 skrll {
297 1.1 skrll bfd_reloc->howto = &h8_elf_howto_table[i];
298 1.1 skrll return;
299 1.1 skrll }
300 1.1 skrll abort ();
301 1.1 skrll }
302 1.1 skrll
303 1.1 skrll static void
304 1.1 skrll elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
305 1.1 skrll Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
306 1.1 skrll {
307 1.1 skrll unsigned int r;
308 1.1 skrll
309 1.1 skrll abort ();
310 1.1 skrll r = ELF32_R_TYPE (elf_reloc->r_info);
311 1.1 skrll bfd_reloc->howto = &h8_elf_howto_table[r];
312 1.1 skrll }
313 1.1 skrll
314 1.1 skrll /* Special handling for H8/300 relocs.
315 1.1 skrll We only come here for pcrel stuff and return normally if not an -r link.
316 1.1 skrll When doing -r, we can't do any arithmetic for the pcrel stuff, because
317 1.1 skrll we support relaxing on the H8/300 series chips. */
318 1.1 skrll static bfd_reloc_status_type
319 1.1 skrll special (bfd *abfd ATTRIBUTE_UNUSED,
320 1.1 skrll arelent *reloc_entry ATTRIBUTE_UNUSED,
321 1.1 skrll asymbol *symbol ATTRIBUTE_UNUSED,
322 1.1.1.3 christos void * data ATTRIBUTE_UNUSED,
323 1.1 skrll asection *input_section ATTRIBUTE_UNUSED,
324 1.1 skrll bfd *output_bfd,
325 1.1 skrll char **error_message ATTRIBUTE_UNUSED)
326 1.1 skrll {
327 1.1 skrll if (output_bfd == (bfd *) NULL)
328 1.1 skrll return bfd_reloc_continue;
329 1.1 skrll
330 1.1 skrll /* Adjust the reloc address to that in the output section. */
331 1.1 skrll reloc_entry->address += input_section->output_offset;
332 1.1 skrll return bfd_reloc_ok;
333 1.1 skrll }
334 1.1 skrll
335 1.1 skrll /* Perform a relocation as part of a final link. */
336 1.1 skrll static bfd_reloc_status_type
337 1.1 skrll elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
338 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED,
339 1.1 skrll asection *input_section ATTRIBUTE_UNUSED,
340 1.1 skrll bfd_byte *contents, bfd_vma offset,
341 1.1 skrll bfd_vma value, bfd_vma addend,
342 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED,
343 1.1 skrll asection *sym_sec ATTRIBUTE_UNUSED,
344 1.1 skrll int is_local ATTRIBUTE_UNUSED)
345 1.1 skrll {
346 1.1 skrll bfd_byte *hit_data = contents + offset;
347 1.1 skrll
348 1.1 skrll switch (r_type)
349 1.1 skrll {
350 1.1 skrll case R_H8_NONE:
351 1.1 skrll return bfd_reloc_ok;
352 1.1 skrll
353 1.1 skrll case R_H8_DIR32:
354 1.1 skrll case R_H8_DIR32A16:
355 1.1.1.4 christos case R_H8_DISP32A16:
356 1.1 skrll case R_H8_DIR24A8:
357 1.1 skrll value += addend;
358 1.1 skrll bfd_put_32 (input_bfd, value, hit_data);
359 1.1 skrll return bfd_reloc_ok;
360 1.1 skrll
361 1.1 skrll case R_H8_DIR16:
362 1.1 skrll case R_H8_DIR16A8:
363 1.1 skrll case R_H8_DIR16R8:
364 1.1 skrll value += addend;
365 1.1 skrll bfd_put_16 (input_bfd, value, hit_data);
366 1.1 skrll return bfd_reloc_ok;
367 1.1 skrll
368 1.1 skrll /* AKA R_RELBYTE */
369 1.1 skrll case R_H8_DIR8:
370 1.1 skrll value += addend;
371 1.1 skrll
372 1.1 skrll bfd_put_8 (input_bfd, value, hit_data);
373 1.1 skrll return bfd_reloc_ok;
374 1.1 skrll
375 1.1 skrll case R_H8_DIR24R8:
376 1.1 skrll value += addend;
377 1.1 skrll
378 1.1 skrll /* HIT_DATA is the address for the first byte for the relocated
379 1.1 skrll value. Subtract 1 so that we can manipulate the data in 32-bit
380 1.1 skrll hunks. */
381 1.1 skrll hit_data--;
382 1.1 skrll
383 1.1 skrll /* Clear out the top byte in value. */
384 1.1 skrll value &= 0xffffff;
385 1.1 skrll
386 1.1 skrll /* Retrieve the type byte for value from the section contents. */
387 1.1 skrll value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
388 1.1 skrll
389 1.1 skrll /* Now scribble it out in one 32-bit hunk. */
390 1.1 skrll bfd_put_32 (input_bfd, value, hit_data);
391 1.1 skrll return bfd_reloc_ok;
392 1.1 skrll
393 1.1 skrll case R_H8_PCREL16:
394 1.1 skrll value -= (input_section->output_section->vma
395 1.1 skrll + input_section->output_offset);
396 1.1 skrll value -= offset;
397 1.1 skrll value += addend;
398 1.1 skrll
399 1.1 skrll /* The value is relative to the start of the instruction,
400 1.1 skrll not the relocation offset. Subtract 2 to account for
401 1.1 skrll this minor issue. */
402 1.1 skrll value -= 2;
403 1.1 skrll
404 1.1 skrll bfd_put_16 (input_bfd, value, hit_data);
405 1.1 skrll return bfd_reloc_ok;
406 1.1 skrll
407 1.1 skrll case R_H8_PCREL8:
408 1.1 skrll value -= (input_section->output_section->vma
409 1.1 skrll + input_section->output_offset);
410 1.1 skrll value -= offset;
411 1.1 skrll value += addend;
412 1.1 skrll
413 1.1 skrll /* The value is relative to the start of the instruction,
414 1.1 skrll not the relocation offset. Subtract 1 to account for
415 1.1 skrll this minor issue. */
416 1.1 skrll value -= 1;
417 1.1 skrll
418 1.1 skrll bfd_put_8 (input_bfd, value, hit_data);
419 1.1 skrll return bfd_reloc_ok;
420 1.1 skrll
421 1.1 skrll default:
422 1.1 skrll return bfd_reloc_notsupported;
423 1.1 skrll }
424 1.1 skrll }
425 1.1 skrll
426 1.1 skrll /* Relocate an H8 ELF section. */
428 1.1 skrll static bfd_boolean
429 1.1 skrll elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
430 1.1 skrll bfd *input_bfd, asection *input_section,
431 1.1 skrll bfd_byte *contents, Elf_Internal_Rela *relocs,
432 1.1 skrll Elf_Internal_Sym *local_syms,
433 1.1 skrll asection **local_sections)
434 1.1 skrll {
435 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
436 1.1 skrll struct elf_link_hash_entry **sym_hashes;
437 1.1 skrll Elf_Internal_Rela *rel, *relend;
438 1.1 skrll
439 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
440 1.1 skrll sym_hashes = elf_sym_hashes (input_bfd);
441 1.1 skrll
442 1.1 skrll rel = relocs;
443 1.1 skrll relend = relocs + input_section->reloc_count;
444 1.1 skrll for (; rel < relend; rel++)
445 1.1 skrll {
446 1.1 skrll unsigned int r_type;
447 1.1 skrll unsigned long r_symndx;
448 1.1 skrll Elf_Internal_Sym *sym;
449 1.1 skrll asection *sec;
450 1.1 skrll struct elf_link_hash_entry *h;
451 1.1 skrll bfd_vma relocation;
452 1.1 skrll bfd_reloc_status_type r;
453 1.1 skrll arelent bfd_reloc;
454 1.1 skrll reloc_howto_type *howto;
455 1.1 skrll
456 1.1 skrll elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
457 1.1 skrll howto = bfd_reloc.howto;
458 1.1 skrll
459 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
460 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
461 1.1 skrll h = NULL;
462 1.1 skrll sym = NULL;
463 1.1 skrll sec = NULL;
464 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
465 1.1 skrll {
466 1.1 skrll sym = local_syms + r_symndx;
467 1.1 skrll sec = local_sections[r_symndx];
468 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
469 1.1 skrll }
470 1.1 skrll else
471 1.1.1.4 christos {
472 1.1 skrll bfd_boolean unresolved_reloc, warned, ignored;
473 1.1 skrll
474 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
475 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
476 1.1.1.4 christos h, sec, relocation,
477 1.1 skrll unresolved_reloc, warned, ignored);
478 1.1 skrll }
479 1.1.1.3 christos
480 1.1.1.2 christos if (sec != NULL && discarded_section (sec))
481 1.1.1.3 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
482 1.1 skrll rel, 1, relend, howto, 0, contents);
483 1.1.1.4 christos
484 1.1 skrll if (bfd_link_relocatable (info))
485 1.1 skrll continue;
486 1.1 skrll
487 1.1 skrll r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
488 1.1 skrll input_section,
489 1.1 skrll contents, rel->r_offset,
490 1.1 skrll relocation, rel->r_addend,
491 1.1 skrll info, sec, h == NULL);
492 1.1 skrll
493 1.1 skrll if (r != bfd_reloc_ok)
494 1.1 skrll {
495 1.1 skrll const char *name;
496 1.1 skrll const char *msg = (const char *) 0;
497 1.1 skrll
498 1.1 skrll if (h != NULL)
499 1.1 skrll name = h->root.root.string;
500 1.1 skrll else
501 1.1 skrll {
502 1.1 skrll name = (bfd_elf_string_from_elf_section
503 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name));
504 1.1 skrll if (name == NULL || *name == '\0')
505 1.1 skrll name = bfd_section_name (input_bfd, sec);
506 1.1 skrll }
507 1.1 skrll
508 1.1 skrll switch (r)
509 1.1 skrll {
510 1.1 skrll case bfd_reloc_overflow:
511 1.1 skrll if (! ((*info->callbacks->reloc_overflow)
512 1.1 skrll (info, (h ? &h->root : NULL), name, howto->name,
513 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
514 1.1 skrll rel->r_offset)))
515 1.1 skrll return FALSE;
516 1.1 skrll break;
517 1.1 skrll
518 1.1 skrll case bfd_reloc_undefined:
519 1.1 skrll if (! ((*info->callbacks->undefined_symbol)
520 1.1 skrll (info, name, input_bfd, input_section,
521 1.1 skrll rel->r_offset, TRUE)))
522 1.1 skrll return FALSE;
523 1.1 skrll break;
524 1.1 skrll
525 1.1 skrll case bfd_reloc_outofrange:
526 1.1 skrll msg = _("internal error: out of range error");
527 1.1 skrll goto common_error;
528 1.1 skrll
529 1.1 skrll case bfd_reloc_notsupported:
530 1.1 skrll msg = _("internal error: unsupported relocation error");
531 1.1 skrll goto common_error;
532 1.1 skrll
533 1.1 skrll case bfd_reloc_dangerous:
534 1.1 skrll msg = _("internal error: dangerous error");
535 1.1 skrll goto common_error;
536 1.1 skrll
537 1.1 skrll default:
538 1.1 skrll msg = _("internal error: unknown error");
539 1.1 skrll /* fall through */
540 1.1 skrll
541 1.1 skrll common_error:
542 1.1 skrll if (!((*info->callbacks->warning)
543 1.1 skrll (info, msg, name, input_bfd, input_section,
544 1.1 skrll rel->r_offset)))
545 1.1 skrll return FALSE;
546 1.1 skrll break;
547 1.1 skrll }
548 1.1 skrll }
549 1.1 skrll }
550 1.1 skrll
551 1.1 skrll return TRUE;
552 1.1 skrll }
553 1.1 skrll
554 1.1 skrll /* Object files encode the specific H8 model they were compiled
555 1.1 skrll for in the ELF flags field.
556 1.1 skrll
557 1.1 skrll Examine that field and return the proper BFD machine type for
558 1.1 skrll the object file. */
559 1.1 skrll static unsigned long
560 1.1 skrll elf32_h8_mach (flagword flags)
561 1.1 skrll {
562 1.1 skrll switch (flags & EF_H8_MACH)
563 1.1 skrll {
564 1.1 skrll case E_H8_MACH_H8300:
565 1.1 skrll default:
566 1.1 skrll return bfd_mach_h8300;
567 1.1 skrll
568 1.1 skrll case E_H8_MACH_H8300H:
569 1.1 skrll return bfd_mach_h8300h;
570 1.1 skrll
571 1.1 skrll case E_H8_MACH_H8300S:
572 1.1 skrll return bfd_mach_h8300s;
573 1.1 skrll
574 1.1 skrll case E_H8_MACH_H8300HN:
575 1.1 skrll return bfd_mach_h8300hn;
576 1.1 skrll
577 1.1 skrll case E_H8_MACH_H8300SN:
578 1.1 skrll return bfd_mach_h8300sn;
579 1.1 skrll
580 1.1 skrll case E_H8_MACH_H8300SX:
581 1.1 skrll return bfd_mach_h8300sx;
582 1.1 skrll
583 1.1 skrll case E_H8_MACH_H8300SXN:
584 1.1 skrll return bfd_mach_h8300sxn;
585 1.1 skrll }
586 1.1 skrll }
587 1.1 skrll
588 1.1 skrll /* The final processing done just before writing out a H8 ELF object
589 1.1 skrll file. We use this opportunity to encode the BFD machine type
590 1.1 skrll into the flags field in the object file. */
591 1.1 skrll
592 1.1 skrll static void
593 1.1 skrll elf32_h8_final_write_processing (bfd *abfd,
594 1.1 skrll bfd_boolean linker ATTRIBUTE_UNUSED)
595 1.1 skrll {
596 1.1 skrll unsigned long val;
597 1.1 skrll
598 1.1 skrll switch (bfd_get_mach (abfd))
599 1.1 skrll {
600 1.1 skrll default:
601 1.1 skrll case bfd_mach_h8300:
602 1.1 skrll val = E_H8_MACH_H8300;
603 1.1 skrll break;
604 1.1 skrll
605 1.1 skrll case bfd_mach_h8300h:
606 1.1 skrll val = E_H8_MACH_H8300H;
607 1.1 skrll break;
608 1.1 skrll
609 1.1 skrll case bfd_mach_h8300s:
610 1.1 skrll val = E_H8_MACH_H8300S;
611 1.1 skrll break;
612 1.1 skrll
613 1.1 skrll case bfd_mach_h8300hn:
614 1.1 skrll val = E_H8_MACH_H8300HN;
615 1.1 skrll break;
616 1.1 skrll
617 1.1 skrll case bfd_mach_h8300sn:
618 1.1 skrll val = E_H8_MACH_H8300SN;
619 1.1 skrll break;
620 1.1 skrll
621 1.1 skrll case bfd_mach_h8300sx:
622 1.1 skrll val = E_H8_MACH_H8300SX;
623 1.1 skrll break;
624 1.1 skrll
625 1.1 skrll case bfd_mach_h8300sxn:
626 1.1 skrll val = E_H8_MACH_H8300SXN;
627 1.1 skrll break;
628 1.1 skrll }
629 1.1 skrll
630 1.1 skrll elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
631 1.1 skrll elf_elfheader (abfd)->e_flags |= val;
632 1.1 skrll }
633 1.1 skrll
634 1.1 skrll /* Return nonzero if ABFD represents a valid H8 ELF object file; also
635 1.1 skrll record the encoded machine type found in the ELF flags. */
636 1.1 skrll
637 1.1 skrll static bfd_boolean
638 1.1 skrll elf32_h8_object_p (bfd *abfd)
639 1.1 skrll {
640 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
641 1.1 skrll elf32_h8_mach (elf_elfheader (abfd)->e_flags));
642 1.1 skrll return TRUE;
643 1.1 skrll }
644 1.1 skrll
645 1.1 skrll /* Merge backend specific data from an object file to the output
646 1.1 skrll object file when linking. The only data we need to copy at this
647 1.1 skrll time is the architecture/machine information. */
648 1.1 skrll
649 1.1 skrll static bfd_boolean
650 1.1 skrll elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
651 1.1 skrll {
652 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
653 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
654 1.1 skrll return TRUE;
655 1.1 skrll
656 1.1 skrll if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
657 1.1 skrll && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
658 1.1 skrll {
659 1.1 skrll if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
660 1.1 skrll bfd_get_mach (ibfd)))
661 1.1 skrll return FALSE;
662 1.1 skrll }
663 1.1 skrll
664 1.1 skrll return TRUE;
665 1.1 skrll }
666 1.1 skrll
667 1.1 skrll /* This function handles relaxing for the H8..
668 1.1 skrll
669 1.1 skrll There are a few relaxing opportunities available on the H8:
670 1.1 skrll
671 1.1 skrll jmp/jsr:24 -> bra/bsr:8 2 bytes
672 1.1 skrll The jmp may be completely eliminated if the previous insn is a
673 1.1 skrll conditional branch to the insn after the jump. In that case
674 1.1 skrll we invert the branch and delete the jump and save 4 bytes.
675 1.1 skrll
676 1.1 skrll bCC:16 -> bCC:8 2 bytes
677 1.1 skrll bsr:16 -> bsr:8 2 bytes
678 1.1 skrll
679 1.1 skrll bset:16 -> bset:8 2 bytes
680 1.1 skrll bset:24/32 -> bset:8 4 bytes
681 1.1 skrll (also applicable to other bit manipulation instructions)
682 1.1 skrll
683 1.1 skrll mov.b:16 -> mov.b:8 2 bytes
684 1.1 skrll mov.b:24/32 -> mov.b:8 4 bytes
685 1.1 skrll
686 1.1 skrll bset:24/32 -> bset:16 2 bytes
687 1.1 skrll (also applicable to other bit manipulation instructions)
688 1.1.1.4 christos
689 1.1.1.4 christos mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes
690 1.1.1.4 christos
691 1.1 skrll mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx) 4 bytes. */
692 1.1 skrll
693 1.1 skrll static bfd_boolean
694 1.1 skrll elf32_h8_relax_section (bfd *abfd, asection *sec,
695 1.1 skrll struct bfd_link_info *link_info, bfd_boolean *again)
696 1.1 skrll {
697 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
698 1.1 skrll Elf_Internal_Rela *internal_relocs;
699 1.1 skrll Elf_Internal_Rela *irel, *irelend;
700 1.1 skrll bfd_byte *contents = NULL;
701 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
702 1.1 skrll static asection *last_input_section = NULL;
703 1.1 skrll static Elf_Internal_Rela *last_reloc = NULL;
704 1.1 skrll
705 1.1 skrll /* Assume nothing changes. */
706 1.1 skrll *again = FALSE;
707 1.1 skrll
708 1.1 skrll /* We don't have to do anything for a relocatable link, if
709 1.1 skrll this section does not have relocs, or if this is not a
710 1.1.1.4 christos code section. */
711 1.1 skrll if (bfd_link_relocatable (link_info)
712 1.1 skrll || (sec->flags & SEC_RELOC) == 0
713 1.1 skrll || sec->reloc_count == 0
714 1.1 skrll || (sec->flags & SEC_CODE) == 0)
715 1.1 skrll return TRUE;
716 1.1 skrll
717 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
718 1.1 skrll
719 1.1 skrll /* Get a copy of the native relocations. */
720 1.1.1.3 christos internal_relocs = (_bfd_elf_link_read_relocs
721 1.1 skrll (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
722 1.1 skrll link_info->keep_memory));
723 1.1 skrll if (internal_relocs == NULL)
724 1.1 skrll goto error_return;
725 1.1 skrll
726 1.1 skrll if (sec != last_input_section)
727 1.1 skrll last_reloc = NULL;
728 1.1 skrll
729 1.1 skrll last_input_section = sec;
730 1.1 skrll
731 1.1 skrll /* Walk through the relocs looking for relaxing opportunities. */
732 1.1 skrll irelend = internal_relocs + sec->reloc_count;
733 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
734 1.1 skrll {
735 1.1 skrll bfd_vma symval;
736 1.1.1.2 christos
737 1.1.1.2 christos {
738 1.1.1.2 christos arelent bfd_reloc;
739 1.1.1.2 christos
740 1.1.1.2 christos elf32_h8_info_to_howto (abfd, &bfd_reloc, irel);
741 1.1 skrll }
742 1.1 skrll /* Keep track of the previous reloc so that we can delete
743 1.1 skrll some long jumps created by the compiler. */
744 1.1 skrll if (irel != internal_relocs)
745 1.1 skrll last_reloc = irel - 1;
746 1.1.1.4 christos
747 1.1.1.4 christos switch(ELF32_R_TYPE (irel->r_info))
748 1.1.1.4 christos {
749 1.1.1.4 christos case R_H8_DIR24R8:
750 1.1.1.4 christos case R_H8_PCREL16:
751 1.1.1.4 christos case R_H8_DIR16A8:
752 1.1.1.4 christos case R_H8_DIR24A8:
753 1.1.1.4 christos case R_H8_DIR32A16:
754 1.1.1.4 christos case R_H8_DISP32A16:
755 1.1.1.4 christos break;
756 1.1.1.4 christos default:
757 1.1.1.4 christos continue;
758 1.1 skrll }
759 1.1 skrll
760 1.1 skrll /* Get the section contents if we haven't done so already. */
761 1.1 skrll if (contents == NULL)
762 1.1 skrll {
763 1.1 skrll /* Get cached copy if it exists. */
764 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != NULL)
765 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
766 1.1 skrll else
767 1.1 skrll {
768 1.1 skrll /* Go get them off disk. */
769 1.1 skrll if (!bfd_malloc_and_get_section (abfd, sec, &contents))
770 1.1 skrll goto error_return;
771 1.1 skrll }
772 1.1 skrll }
773 1.1 skrll
774 1.1 skrll /* Read this BFD's local symbols if we haven't done so already. */
775 1.1 skrll if (isymbuf == NULL && symtab_hdr->sh_info != 0)
776 1.1 skrll {
777 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
778 1.1 skrll if (isymbuf == NULL)
779 1.1 skrll isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
780 1.1 skrll symtab_hdr->sh_info, 0,
781 1.1 skrll NULL, NULL, NULL);
782 1.1 skrll if (isymbuf == NULL)
783 1.1 skrll goto error_return;
784 1.1 skrll }
785 1.1 skrll
786 1.1 skrll /* Get the value of the symbol referred to by the reloc. */
787 1.1 skrll if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
788 1.1 skrll {
789 1.1 skrll /* A local symbol. */
790 1.1 skrll Elf_Internal_Sym *isym;
791 1.1 skrll asection *sym_sec;
792 1.1 skrll
793 1.1 skrll isym = isymbuf + ELF32_R_SYM (irel->r_info);
794 1.1 skrll sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
795 1.1 skrll symval = isym->st_value;
796 1.1 skrll /* If the reloc is absolute, it will not have
797 1.1 skrll a symbol or section associated with it. */
798 1.1 skrll if (sym_sec)
799 1.1 skrll symval += sym_sec->output_section->vma
800 1.1 skrll + sym_sec->output_offset;
801 1.1 skrll }
802 1.1 skrll else
803 1.1 skrll {
804 1.1 skrll unsigned long indx;
805 1.1 skrll struct elf_link_hash_entry *h;
806 1.1 skrll
807 1.1 skrll /* An external symbol. */
808 1.1 skrll indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
809 1.1 skrll h = elf_sym_hashes (abfd)[indx];
810 1.1 skrll BFD_ASSERT (h != NULL);
811 1.1 skrll if (h->root.type != bfd_link_hash_defined
812 1.1 skrll && h->root.type != bfd_link_hash_defweak)
813 1.1 skrll {
814 1.1 skrll /* This appears to be a reference to an undefined
815 1.1 skrll symbol. Just ignore it--it will be caught by the
816 1.1 skrll regular reloc processing. */
817 1.1 skrll continue;
818 1.1 skrll }
819 1.1 skrll
820 1.1 skrll symval = (h->root.u.def.value
821 1.1 skrll + h->root.u.def.section->output_section->vma
822 1.1 skrll + h->root.u.def.section->output_offset);
823 1.1 skrll }
824 1.1 skrll
825 1.1 skrll /* For simplicity of coding, we are going to modify the section
826 1.1 skrll contents, the section relocs, and the BFD symbol table. We
827 1.1 skrll must tell the rest of the code not to free up this
828 1.1 skrll information. It would be possible to instead create a table
829 1.1 skrll of changes which have to be made, as is done in coff-mips.c;
830 1.1 skrll that would be more work, but would require less memory when
831 1.1 skrll the linker is run. */
832 1.1 skrll switch (ELF32_R_TYPE (irel->r_info))
833 1.1.1.4 christos {
834 1.1.1.4 christos /* Try to turn a 24-bit absolute branch/call into an 8-bit
835 1.1 skrll pc-relative branch/call. */
836 1.1 skrll case R_H8_DIR24R8:
837 1.1 skrll {
838 1.1 skrll bfd_vma value = symval + irel->r_addend;
839 1.1 skrll bfd_vma dot, gap;
840 1.1 skrll
841 1.1 skrll /* Get the address of this instruction. */
842 1.1 skrll dot = (sec->output_section->vma
843 1.1 skrll + sec->output_offset + irel->r_offset - 1);
844 1.1 skrll
845 1.1 skrll /* Compute the distance from this insn to the branch target. */
846 1.1 skrll gap = value - dot;
847 1.1 skrll
848 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can
849 1.1 skrll relax this jump. +130 is valid since the target will move
850 1.1 skrll two bytes closer if we do relax this branch. */
851 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130)
852 1.1 skrll {
853 1.1 skrll unsigned char code;
854 1.1 skrll
855 1.1 skrll /* Note that we've changed the relocs, section contents,
856 1.1 skrll etc. */
857 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
858 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
859 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
860 1.1 skrll
861 1.1 skrll /* Get the instruction code being relaxed. */
862 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
863 1.1 skrll
864 1.1 skrll /* If the previous instruction conditionally jumped around
865 1.1 skrll this instruction, we may be able to reverse the condition
866 1.1 skrll and redirect the previous instruction to the target of
867 1.1 skrll this instruction.
868 1.1 skrll
869 1.1 skrll Such sequences are used by the compiler to deal with
870 1.1 skrll long conditional branches.
871 1.1 skrll
872 1.1 skrll Only perform this optimisation for jumps (code 0x5a) not
873 1.1 skrll subroutine calls, as otherwise it could transform:
874 1.1.1.4 christos
875 1.1.1.4 christos mov.w r0,r0
876 1.1.1.4 christos beq .L1
877 1.1.1.4 christos jsr @_bar
878 1.1.1.4 christos .L1: rts
879 1.1 skrll _bar: rts
880 1.1.1.4 christos into:
881 1.1.1.4 christos mov.w r0,r0
882 1.1.1.4 christos bne _bar
883 1.1.1.4 christos rts
884 1.1 skrll _bar: rts
885 1.1 skrll
886 1.1.1.4 christos which changes the call (jsr) into a branch (bne). */
887 1.1 skrll if (code == 0x5a /* jmp24. */
888 1.1 skrll && (int) gap <= 130
889 1.1 skrll && (int) gap >= -128
890 1.1 skrll && last_reloc
891 1.1 skrll && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
892 1.1 skrll && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
893 1.1 skrll {
894 1.1 skrll bfd_vma last_value;
895 1.1 skrll asection *last_sym_sec;
896 1.1 skrll Elf_Internal_Sym *last_sym;
897 1.1 skrll
898 1.1 skrll /* We will need to examine the symbol used by the
899 1.1 skrll previous relocation. */
900 1.1 skrll
901 1.1 skrll last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
902 1.1 skrll last_sym_sec
903 1.1 skrll = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
904 1.1 skrll last_value = (last_sym->st_value
905 1.1 skrll + last_sym_sec->output_section->vma
906 1.1 skrll + last_sym_sec->output_offset);
907 1.1 skrll
908 1.1 skrll /* Verify that the previous relocation was for a
909 1.1 skrll branch around this instruction and that no symbol
910 1.1 skrll exists at the current location. */
911 1.1 skrll if (last_value == dot + 4
912 1.1 skrll && last_reloc->r_offset + 2 == irel->r_offset
913 1.1 skrll && ! elf32_h8_symbol_address_p (abfd, sec, dot))
914 1.1 skrll {
915 1.1 skrll /* We can eliminate this jump. Twiddle the
916 1.1 skrll previous relocation as necessary. */
917 1.1 skrll irel->r_info
918 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
919 1.1 skrll ELF32_R_TYPE (R_H8_NONE));
920 1.1 skrll
921 1.1 skrll last_reloc->r_info
922 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
923 1.1 skrll ELF32_R_TYPE (R_H8_PCREL8));
924 1.1 skrll last_reloc->r_addend = irel->r_addend;
925 1.1 skrll
926 1.1 skrll code = bfd_get_8 (abfd,
927 1.1 skrll contents + last_reloc->r_offset - 1);
928 1.1 skrll code ^= 1;
929 1.1 skrll bfd_put_8 (abfd,
930 1.1.1.4 christos code,
931 1.1 skrll contents + last_reloc->r_offset - 1);
932 1.1 skrll
933 1.1 skrll /* Delete four bytes of data. */
934 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
935 1.1 skrll irel->r_offset - 1,
936 1.1 skrll 4))
937 1.1 skrll goto error_return;
938 1.1 skrll
939 1.1 skrll *again = TRUE;
940 1.1 skrll break;
941 1.1 skrll }
942 1.1 skrll }
943 1.1 skrll
944 1.1.1.4 christos if (code == 0x5e)
945 1.1.1.4 christos /* This is jsr24 */
946 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1); /* bsr8. */
947 1.1.1.4 christos else if (code == 0x5a)
948 1.1.1.4 christos /* This is jmp24 */
949 1.1 skrll bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1); /* bra8. */
950 1.1 skrll else
951 1.1 skrll abort ();
952 1.1 skrll
953 1.1 skrll /* Fix the relocation's type. */
954 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
955 1.1 skrll R_H8_PCREL8);
956 1.1 skrll
957 1.1 skrll /* Delete two bytes of data. */
958 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
959 1.1 skrll irel->r_offset + 1, 2))
960 1.1 skrll goto error_return;
961 1.1 skrll
962 1.1 skrll /* That will change things, so, we should relax again.
963 1.1 skrll Note that this is not required, and it may be slow. */
964 1.1 skrll *again = TRUE;
965 1.1 skrll }
966 1.1 skrll break;
967 1.1 skrll }
968 1.1.1.4 christos
969 1.1.1.4 christos /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
970 1.1 skrll branch. */
971 1.1 skrll case R_H8_PCREL16:
972 1.1 skrll {
973 1.1 skrll bfd_vma value = symval + irel->r_addend;
974 1.1 skrll bfd_vma dot;
975 1.1 skrll bfd_vma gap;
976 1.1 skrll
977 1.1 skrll /* Get the address of this instruction. */
978 1.1 skrll dot = (sec->output_section->vma
979 1.1 skrll + sec->output_offset
980 1.1 skrll + irel->r_offset - 2);
981 1.1 skrll
982 1.1 skrll gap = value - dot;
983 1.1 skrll
984 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can
985 1.1 skrll relax this jump. +130 is valid since the target will move
986 1.1 skrll two bytes closer if we do relax this branch. */
987 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130)
988 1.1 skrll {
989 1.1 skrll unsigned char code;
990 1.1 skrll
991 1.1 skrll /* Note that we've changed the relocs, section contents,
992 1.1 skrll etc. */
993 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
994 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
995 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
996 1.1 skrll
997 1.1 skrll /* Get the opcode. */
998 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
999 1.1 skrll
1000 1.1 skrll if (code == 0x58)
1001 1.1 skrll {
1002 1.1 skrll /* bCC:16 -> bCC:8 */
1003 1.1 skrll /* Get the second byte of the original insn, which
1004 1.1 skrll contains the condition code. */
1005 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1006 1.1.1.4 christos
1007 1.1 skrll /* Compute the first byte of the relaxed
1008 1.1 skrll instruction. The original sequence 0x58 0xX0
1009 1.1 skrll is relaxed to 0x4X, where X represents the
1010 1.1 skrll condition code. */
1011 1.1 skrll code &= 0xf0;
1012 1.1 skrll code >>= 4;
1013 1.1.1.4 christos code |= 0x40;
1014 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 2); /* bCC:8. */
1015 1.1.1.4 christos }
1016 1.1 skrll else if (code == 0x5c) /* bsr16. */
1017 1.1.1.4 christos /* This is bsr. */
1018 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2); /* bsr8. */
1019 1.1.1.2 christos else
1020 1.1.1.2 christos /* Might be MOVSD. */
1021 1.1 skrll break;
1022 1.1 skrll
1023 1.1 skrll /* Fix the relocation's type. */
1024 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1025 1.1 skrll R_H8_PCREL8);
1026 1.1 skrll irel->r_offset--;
1027 1.1 skrll
1028 1.1 skrll /* Delete two bytes of data. */
1029 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
1030 1.1 skrll irel->r_offset + 1, 2))
1031 1.1 skrll goto error_return;
1032 1.1 skrll
1033 1.1 skrll /* That will change things, so, we should relax again.
1034 1.1 skrll Note that this is not required, and it may be slow. */
1035 1.1 skrll *again = TRUE;
1036 1.1 skrll }
1037 1.1 skrll break;
1038 1.1 skrll }
1039 1.1.1.4 christos
1040 1.1.1.4 christos /* This is a 16-bit absolute address in one of the following
1041 1.1 skrll instructions:
1042 1.1 skrll
1043 1.1 skrll "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1044 1.1 skrll "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1045 1.1 skrll "mov.b"
1046 1.1.1.4 christos
1047 1.1.1.4 christos We may relax this into an 8-bit absolute address if it's in
1048 1.1 skrll the right range. */
1049 1.1 skrll case R_H8_DIR16A8:
1050 1.1 skrll {
1051 1.1 skrll bfd_vma value;
1052 1.1 skrll
1053 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1054 1.1 skrll if (value >= 0xffffff00u)
1055 1.1 skrll {
1056 1.1 skrll unsigned char code;
1057 1.1 skrll unsigned char temp_code;
1058 1.1 skrll
1059 1.1 skrll /* Note that we've changed the relocs, section contents,
1060 1.1 skrll etc. */
1061 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
1062 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1063 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1064 1.1 skrll
1065 1.1 skrll /* Get the opcode. */
1066 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1067 1.1 skrll
1068 1.1 skrll /* All instructions with R_H8_DIR16A8 start with
1069 1.1 skrll 0x6a. */
1070 1.1 skrll if (code != 0x6a)
1071 1.1 skrll abort ();
1072 1.1 skrll
1073 1.1 skrll temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1074 1.1 skrll /* If this is a mov.b instruction, clear the lower
1075 1.1 skrll nibble, which contains the source/destination
1076 1.1 skrll register number. */
1077 1.1 skrll if ((temp_code & 0x10) != 0x10)
1078 1.1 skrll temp_code &= 0xf0;
1079 1.1 skrll
1080 1.1 skrll switch (temp_code)
1081 1.1 skrll {
1082 1.1 skrll case 0x00:
1083 1.1 skrll /* This is mov.b @aa:16,Rd. */
1084 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x20,
1085 1.1 skrll contents + irel->r_offset - 2);
1086 1.1 skrll break;
1087 1.1 skrll case 0x80:
1088 1.1 skrll /* This is mov.b Rs,@aa:16. */
1089 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x30,
1090 1.1 skrll contents + irel->r_offset - 2);
1091 1.1 skrll break;
1092 1.1 skrll case 0x18:
1093 1.1 skrll /* This is a bit-maniputation instruction that
1094 1.1 skrll stores one bit into memory, one of "bclr",
1095 1.1 skrll "bist", "bnot", "bset", and "bst". */
1096 1.1 skrll bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1097 1.1 skrll break;
1098 1.1 skrll case 0x10:
1099 1.1 skrll /* This is a bit-maniputation instruction that
1100 1.1 skrll loads one bit from memory, one of "band",
1101 1.1 skrll "biand", "bild", "bior", "bixor", "bld", "bor",
1102 1.1 skrll "btst", and "bxor". */
1103 1.1 skrll bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1104 1.1 skrll break;
1105 1.1 skrll default:
1106 1.1 skrll abort ();
1107 1.1 skrll }
1108 1.1 skrll
1109 1.1 skrll /* Fix the relocation's type. */
1110 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1111 1.1 skrll R_H8_DIR8);
1112 1.1 skrll
1113 1.1 skrll /* Move the relocation. */
1114 1.1 skrll irel->r_offset--;
1115 1.1 skrll
1116 1.1 skrll /* Delete two bytes of data. */
1117 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
1118 1.1 skrll irel->r_offset + 1, 2))
1119 1.1 skrll goto error_return;
1120 1.1 skrll
1121 1.1 skrll /* That will change things, so, we should relax again.
1122 1.1 skrll Note that this is not required, and it may be slow. */
1123 1.1 skrll *again = TRUE;
1124 1.1 skrll }
1125 1.1 skrll break;
1126 1.1 skrll }
1127 1.1.1.4 christos
1128 1.1.1.4 christos /* This is a 24-bit absolute address in one of the following
1129 1.1 skrll instructions:
1130 1.1 skrll
1131 1.1 skrll "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1132 1.1 skrll "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1133 1.1 skrll "mov.b"
1134 1.1.1.4 christos
1135 1.1.1.4 christos We may relax this into an 8-bit absolute address if it's in
1136 1.1 skrll the right range. */
1137 1.1 skrll case R_H8_DIR24A8:
1138 1.1 skrll {
1139 1.1 skrll bfd_vma value;
1140 1.1 skrll
1141 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1142 1.1 skrll if (value >= 0xffffff00u)
1143 1.1 skrll {
1144 1.1 skrll unsigned char code;
1145 1.1 skrll unsigned char temp_code;
1146 1.1 skrll
1147 1.1 skrll /* Note that we've changed the relocs, section contents,
1148 1.1 skrll etc. */
1149 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
1150 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1151 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1152 1.1 skrll
1153 1.1 skrll /* Get the opcode. */
1154 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1155 1.1 skrll
1156 1.1 skrll /* All instructions with R_H8_DIR24A8 start with
1157 1.1 skrll 0x6a. */
1158 1.1 skrll if (code != 0x6a)
1159 1.1 skrll abort ();
1160 1.1 skrll
1161 1.1 skrll temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1162 1.1 skrll
1163 1.1 skrll /* If this is a mov.b instruction, clear the lower
1164 1.1 skrll nibble, which contains the source/destination
1165 1.1 skrll register number. */
1166 1.1 skrll if ((temp_code & 0x30) != 0x30)
1167 1.1 skrll temp_code &= 0xf0;
1168 1.1 skrll
1169 1.1 skrll switch (temp_code)
1170 1.1 skrll {
1171 1.1 skrll case 0x20:
1172 1.1 skrll /* This is mov.b @aa:24/32,Rd. */
1173 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x20,
1174 1.1 skrll contents + irel->r_offset - 2);
1175 1.1 skrll break;
1176 1.1 skrll case 0xa0:
1177 1.1 skrll /* This is mov.b Rs,@aa:24/32. */
1178 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x30,
1179 1.1 skrll contents + irel->r_offset - 2);
1180 1.1 skrll break;
1181 1.1 skrll case 0x38:
1182 1.1 skrll /* This is a bit-maniputation instruction that
1183 1.1 skrll stores one bit into memory, one of "bclr",
1184 1.1 skrll "bist", "bnot", "bset", and "bst". */
1185 1.1 skrll bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1186 1.1 skrll break;
1187 1.1 skrll case 0x30:
1188 1.1 skrll /* This is a bit-maniputation instruction that
1189 1.1 skrll loads one bit from memory, one of "band",
1190 1.1 skrll "biand", "bild", "bior", "bixor", "bld", "bor",
1191 1.1 skrll "btst", and "bxor". */
1192 1.1 skrll bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1193 1.1 skrll break;
1194 1.1 skrll default:
1195 1.1 skrll abort();
1196 1.1 skrll }
1197 1.1 skrll
1198 1.1 skrll /* Fix the relocation's type. */
1199 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1200 1.1 skrll R_H8_DIR8);
1201 1.1 skrll irel->r_offset--;
1202 1.1.1.4 christos
1203 1.1 skrll /* Delete four bytes of data. */
1204 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
1205 1.1 skrll irel->r_offset + 1, 4))
1206 1.1 skrll goto error_return;
1207 1.1 skrll
1208 1.1 skrll /* That will change things, so, we should relax again.
1209 1.1 skrll Note that this is not required, and it may be slow. */
1210 1.1 skrll *again = TRUE;
1211 1.1 skrll break;
1212 1.1 skrll }
1213 1.1 skrll }
1214 1.1 skrll
1215 1.1 skrll /* Fall through. */
1216 1.1 skrll
1217 1.1 skrll /* This is a 24-/32-bit absolute address in one of the
1218 1.1 skrll following instructions:
1219 1.1.1.4 christos
1220 1.1.1.4 christos "band", "bclr", "biand", "bild", "bior", "bist",
1221 1.1.1.4 christos "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1222 1.1 skrll "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1223 1.1 skrll
1224 1.1 skrll We may relax this into an 16-bit absolute address if it's
1225 1.1 skrll in the right range. */
1226 1.1 skrll case R_H8_DIR32A16:
1227 1.1 skrll {
1228 1.1 skrll bfd_vma value;
1229 1.1 skrll
1230 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1231 1.1 skrll if (value <= 0x7fff || value >= 0xffff8000u)
1232 1.1 skrll {
1233 1.1.1.2 christos unsigned char code;
1234 1.1.1.2 christos unsigned char op0, op1, op2, op3;
1235 1.1 skrll unsigned char *op_ptr;
1236 1.1 skrll
1237 1.1 skrll /* Note that we've changed the relocs, section contents,
1238 1.1 skrll etc. */
1239 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
1240 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1241 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1242 1.1.1.2 christos
1243 1.1.1.2 christos if (irel->r_offset >= 4)
1244 1.1.1.4 christos {
1245 1.1.1.2 christos /* Check for 4-byte MOVA relaxation (SH-specific). */
1246 1.1.1.2 christos int second_reloc = 0;
1247 1.1.1.2 christos
1248 1.1.1.2 christos op_ptr = contents + irel->r_offset - 4;
1249 1.1.1.2 christos
1250 1.1.1.2 christos if (last_reloc)
1251 1.1.1.2 christos {
1252 1.1.1.2 christos arelent bfd_reloc;
1253 1.1.1.2 christos reloc_howto_type *h;
1254 1.1.1.2 christos bfd_vma last_reloc_size;
1255 1.1.1.2 christos
1256 1.1.1.2 christos elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc);
1257 1.1.1.2 christos h = bfd_reloc.howto;
1258 1.1.1.2 christos last_reloc_size = 1 << h->size;
1259 1.1.1.2 christos if (last_reloc->r_offset + last_reloc_size
1260 1.1.1.2 christos == irel->r_offset)
1261 1.1.1.2 christos {
1262 1.1.1.2 christos op_ptr -= last_reloc_size;
1263 1.1.1.2 christos second_reloc = 1;
1264 1.1.1.2 christos }
1265 1.1.1.4 christos }
1266 1.1.1.4 christos
1267 1.1.1.2 christos if (irel + 1 < irelend)
1268 1.1.1.2 christos {
1269 1.1.1.2 christos Elf_Internal_Rela *next_reloc = irel + 1;
1270 1.1.1.2 christos arelent bfd_reloc;
1271 1.1.1.2 christos reloc_howto_type *h;
1272 1.1.1.2 christos bfd_vma next_reloc_size;
1273 1.1.1.2 christos
1274 1.1.1.2 christos elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc);
1275 1.1.1.2 christos h = bfd_reloc.howto;
1276 1.1.1.2 christos next_reloc_size = 1 << h->size;
1277 1.1.1.2 christos if (next_reloc->r_offset + next_reloc_size
1278 1.1.1.2 christos == irel->r_offset)
1279 1.1.1.2 christos {
1280 1.1.1.2 christos op_ptr -= next_reloc_size;
1281 1.1.1.2 christos second_reloc = 1;
1282 1.1.1.2 christos }
1283 1.1.1.2 christos }
1284 1.1.1.2 christos
1285 1.1.1.2 christos op0 = bfd_get_8 (abfd, op_ptr + 0);
1286 1.1.1.2 christos op1 = bfd_get_8 (abfd, op_ptr + 1);
1287 1.1.1.2 christos op2 = bfd_get_8 (abfd, op_ptr + 2);
1288 1.1.1.2 christos op3 = bfd_get_8 (abfd, op_ptr + 3);
1289 1.1.1.2 christos
1290 1.1.1.2 christos if (op0 == 0x01
1291 1.1.1.2 christos && (op1 & 0xdf) == 0x5f
1292 1.1.1.2 christos && (op2 & 0x40) == 0x40
1293 1.1.1.2 christos && (op3 & 0x80) == 0x80)
1294 1.1.1.2 christos {
1295 1.1.1.2 christos if ((op2 & 0x08) == 0)
1296 1.1.1.2 christos second_reloc = 1;
1297 1.1.1.2 christos
1298 1.1.1.2 christos if (second_reloc)
1299 1.1.1.2 christos {
1300 1.1.1.2 christos op3 &= ~0x08;
1301 1.1.1.2 christos bfd_put_8 (abfd, op3, op_ptr + 3);
1302 1.1.1.2 christos }
1303 1.1.1.2 christos else
1304 1.1.1.2 christos {
1305 1.1.1.2 christos op2 &= ~0x08;
1306 1.1.1.2 christos bfd_put_8 (abfd, op2, op_ptr + 2);
1307 1.1.1.2 christos }
1308 1.1.1.2 christos goto r_h8_dir32a16_common;
1309 1.1.1.2 christos }
1310 1.1.1.2 christos }
1311 1.1.1.4 christos
1312 1.1.1.2 christos /* Now check for short version of MOVA. (SH-specific) */
1313 1.1.1.2 christos op_ptr = contents + irel->r_offset - 2;
1314 1.1.1.2 christos op0 = bfd_get_8 (abfd, op_ptr + 0);
1315 1.1.1.2 christos op1 = bfd_get_8 (abfd, op_ptr + 1);
1316 1.1.1.2 christos
1317 1.1.1.2 christos if (op0 == 0x7a
1318 1.1.1.2 christos && (op1 & 0x88) == 0x80)
1319 1.1.1.2 christos {
1320 1.1.1.2 christos op1 |= 0x08;
1321 1.1.1.2 christos bfd_put_8 (abfd, op1, op_ptr + 1);
1322 1.1.1.2 christos goto r_h8_dir32a16_common;
1323 1.1.1.2 christos }
1324 1.1 skrll
1325 1.1 skrll /* Get the opcode. */
1326 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1327 1.1 skrll
1328 1.1 skrll /* Fix the opcode. For all the instructions that
1329 1.1 skrll belong to this relaxation, we simply need to turn
1330 1.1 skrll off bit 0x20 in the previous byte. */
1331 1.1 skrll code &= ~0x20;
1332 1.1 skrll
1333 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1334 1.1.1.2 christos
1335 1.1 skrll r_h8_dir32a16_common:
1336 1.1 skrll /* Fix the relocation's type. */
1337 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1338 1.1 skrll R_H8_DIR16);
1339 1.1 skrll
1340 1.1 skrll /* Delete two bytes of data. */
1341 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
1342 1.1 skrll irel->r_offset + 1, 2))
1343 1.1 skrll goto error_return;
1344 1.1 skrll
1345 1.1 skrll /* That will change things, so, we should relax again.
1346 1.1 skrll Note that this is not required, and it may be slow. */
1347 1.1 skrll *again = TRUE;
1348 1.1.1.4 christos }
1349 1.1.1.4 christos break; /* case R_H8_DIR32A16 */
1350 1.1.1.4 christos }
1351 1.1.1.4 christos
1352 1.1.1.4 christos case R_H8_DISP32A16:
1353 1.1.1.4 christos /* mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx) 4 bytes
1354 1.1.1.4 christos It is assured that instruction uses at least 4 bytes opcode before
1355 1.1.1.4 christos reloc entry addressing mode "register indirect with displacement"
1356 1.1.1.4 christos relaxing options (all saving 4 bytes):
1357 1.1.1.4 christos 0x78 0sss0000 0x6A 0010dddd disp:32 mov.b @(d:32,ERs),Rd ->
1358 1.1.1.4 christos 0x6E 0sssdddd disp:16 mov.b @(d:16,ERs),Rd
1359 1.1.1.4 christos 0x78 0sss0000 0x6B 0010dddd disp:32 mov.w @(d:32,ERs),Rd ->
1360 1.1.1.4 christos 0x6F 0sssdddd disp:16 mov.w @(d:16,ERs),Rd
1361 1.1.1.4 christos 0x01 0x00 0x78 0sss0000 0x6B 00100ddd disp:32 mov.l @(d:32,ERs),ERd ->
1362 1.1.1.4 christos 0x01 0x00 0x6F 0sss0ddd disp:16 mov.l @(d:16,ERs),ERd
1363 1.1.1.4 christos
1364 1.1.1.4 christos 0x78 0ddd0000 0x6A 1010ssss disp:32 mov.b Rs,@(d:32,ERd) ->
1365 1.1.1.4 christos 0x6E 1dddssss disp:16 mov.b Rs,@(d:16,ERd)
1366 1.1.1.4 christos 0x78 0ddd0000 0x6B 1010ssss disp:32 mov.w Rs,@(d:32,ERd) ->
1367 1.1.1.4 christos 0x6F 1dddssss disp:16 mov.w Rs,@(d:16,ERd)
1368 1.1.1.4 christos 0x01 0x00 0x78 xddd0000 0x6B 10100sss disp:32 mov.l ERs,@(d:32,ERd) ->
1369 1.1.1.4 christos 0x01 0x00 0x6F 1ddd0sss disp:16 mov.l ERs,@(d:16,ERd)
1370 1.1.1.4 christos mov.l prefix 0x01 0x00 can be left as is and mov.l handled same
1371 1.1.1.4 christos as mov.w/ */
1372 1.1.1.4 christos {
1373 1.1.1.4 christos bfd_vma value;
1374 1.1.1.4 christos
1375 1.1.1.4 christos value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1376 1.1.1.4 christos if (value <= 0x7fff || value >= 0xffff8000u)
1377 1.1.1.4 christos {
1378 1.1.1.4 christos unsigned char op0, op1, op2, op3, op0n, op1n;
1379 1.1.1.4 christos int relax = 0;
1380 1.1.1.4 christos
1381 1.1.1.4 christos /* Note that we've changed the relocs, section contents,
1382 1.1.1.4 christos etc. */
1383 1.1.1.4 christos elf_section_data (sec)->relocs = internal_relocs;
1384 1.1.1.4 christos elf_section_data (sec)->this_hdr.contents = contents;
1385 1.1.1.4 christos symtab_hdr->contents = (unsigned char *) isymbuf;
1386 1.1.1.4 christos
1387 1.1.1.4 christos if (irel->r_offset >= 4)
1388 1.1.1.4 christos {
1389 1.1.1.4 christos op0 = bfd_get_8 (abfd, contents + irel->r_offset - 4);
1390 1.1.1.4 christos op1 = bfd_get_8 (abfd, contents + irel->r_offset - 3);
1391 1.1.1.4 christos op2 = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1392 1.1.1.4 christos op3 = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1393 1.1.1.4 christos
1394 1.1.1.4 christos if (op0 == 0x78)
1395 1.1.1.4 christos {
1396 1.1.1.4 christos switch(op2)
1397 1.1.1.4 christos {
1398 1.1.1.4 christos case 0x6A:
1399 1.1.1.4 christos if ((op1 & 0x8F) == 0x00 && (op3 & 0x70) == 0x20)
1400 1.1.1.4 christos {
1401 1.1.1.4 christos /* mov.b. */
1402 1.1.1.4 christos op0n = 0x6E;
1403 1.1.1.4 christos relax = 1;
1404 1.1.1.4 christos }
1405 1.1.1.4 christos break;
1406 1.1.1.4 christos case 0x6B:
1407 1.1.1.4 christos if ((op1 & 0x0F) == 0x00 && (op3 & 0x70) == 0x20)
1408 1.1.1.4 christos {
1409 1.1.1.4 christos /* mov.w/l. */
1410 1.1.1.4 christos op0n = 0x6F;
1411 1.1.1.4 christos relax = 1;
1412 1.1.1.4 christos }
1413 1.1.1.4 christos break;
1414 1.1.1.4 christos default:
1415 1.1.1.4 christos break;
1416 1.1.1.4 christos }
1417 1.1.1.4 christos }
1418 1.1.1.4 christos }
1419 1.1.1.4 christos
1420 1.1.1.4 christos if (relax)
1421 1.1.1.4 christos {
1422 1.1.1.4 christos op1n = (op3 & 0x8F) | (op1 & 0x70);
1423 1.1.1.4 christos bfd_put_8 (abfd, op0n, contents + irel->r_offset - 4);
1424 1.1.1.4 christos bfd_put_8 (abfd, op1n, contents + irel->r_offset - 3);
1425 1.1.1.4 christos
1426 1.1.1.4 christos /* Fix the relocation's type. */
1427 1.1.1.4 christos irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_H8_DIR16);
1428 1.1.1.4 christos irel->r_offset -= 2;
1429 1.1.1.4 christos
1430 1.1.1.4 christos /* Delete four bytes of data. */
1431 1.1.1.4 christos if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset + 2, 4))
1432 1.1.1.4 christos goto error_return;
1433 1.1.1.4 christos
1434 1.1.1.4 christos /* That will change things, so, we should relax again.
1435 1.1.1.4 christos Note that this is not required, and it may be slow. */
1436 1.1.1.4 christos *again = TRUE;
1437 1.1.1.4 christos }
1438 1.1 skrll }
1439 1.1.1.4 christos }
1440 1.1 skrll break;
1441 1.1 skrll
1442 1.1 skrll default:
1443 1.1 skrll break;
1444 1.1 skrll }
1445 1.1 skrll }
1446 1.1 skrll
1447 1.1 skrll if (isymbuf != NULL
1448 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1449 1.1 skrll {
1450 1.1 skrll if (! link_info->keep_memory)
1451 1.1 skrll free (isymbuf);
1452 1.1 skrll else
1453 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1454 1.1 skrll }
1455 1.1 skrll
1456 1.1 skrll if (contents != NULL
1457 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
1458 1.1 skrll {
1459 1.1 skrll if (! link_info->keep_memory)
1460 1.1 skrll free (contents);
1461 1.1 skrll else
1462 1.1 skrll {
1463 1.1 skrll /* Cache the section contents for elf_link_input_bfd. */
1464 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1465 1.1 skrll }
1466 1.1 skrll }
1467 1.1 skrll
1468 1.1 skrll if (internal_relocs != NULL
1469 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
1470 1.1 skrll free (internal_relocs);
1471 1.1 skrll
1472 1.1 skrll return TRUE;
1473 1.1 skrll
1474 1.1 skrll error_return:
1475 1.1 skrll if (isymbuf != NULL
1476 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1477 1.1 skrll free (isymbuf);
1478 1.1 skrll if (contents != NULL
1479 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
1480 1.1 skrll free (contents);
1481 1.1 skrll if (internal_relocs != NULL
1482 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
1483 1.1 skrll free (internal_relocs);
1484 1.1 skrll return FALSE;
1485 1.1 skrll }
1486 1.1 skrll
1487 1.1 skrll /* Delete some bytes from a section while relaxing. */
1488 1.1 skrll
1489 1.1 skrll static bfd_boolean
1490 1.1 skrll elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1491 1.1 skrll {
1492 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1493 1.1 skrll unsigned int sec_shndx;
1494 1.1 skrll bfd_byte *contents;
1495 1.1 skrll Elf_Internal_Rela *irel, *irelend;
1496 1.1 skrll Elf_Internal_Sym *isym;
1497 1.1 skrll Elf_Internal_Sym *isymend;
1498 1.1 skrll bfd_vma toaddr;
1499 1.1 skrll struct elf_link_hash_entry **sym_hashes;
1500 1.1 skrll struct elf_link_hash_entry **end_hashes;
1501 1.1 skrll unsigned int symcount;
1502 1.1 skrll
1503 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1504 1.1 skrll
1505 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
1506 1.1 skrll
1507 1.1 skrll toaddr = sec->size;
1508 1.1 skrll
1509 1.1 skrll irel = elf_section_data (sec)->relocs;
1510 1.1 skrll irelend = irel + sec->reloc_count;
1511 1.1 skrll
1512 1.1 skrll /* Actually delete the bytes. */
1513 1.1 skrll memmove (contents + addr, contents + addr + count,
1514 1.1 skrll (size_t) (toaddr - addr - count));
1515 1.1 skrll sec->size -= count;
1516 1.1 skrll
1517 1.1 skrll /* Adjust all the relocs. */
1518 1.1 skrll for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1519 1.1 skrll {
1520 1.1 skrll /* Get the new reloc address. */
1521 1.1.1.4 christos if ((irel->r_offset > addr
1522 1.1 skrll && irel->r_offset <= toaddr))
1523 1.1 skrll irel->r_offset -= count;
1524 1.1 skrll }
1525 1.1 skrll
1526 1.1 skrll /* Adjust the local symbols defined in this section. */
1527 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1528 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1529 1.1 skrll isymend = isym + symtab_hdr->sh_info;
1530 1.1 skrll for (; isym < isymend; isym++)
1531 1.1 skrll {
1532 1.1 skrll if (isym->st_shndx == sec_shndx
1533 1.1.1.4 christos && isym->st_value > addr
1534 1.1 skrll && isym->st_value <= toaddr)
1535 1.1 skrll isym->st_value -= count;
1536 1.1 skrll }
1537 1.1 skrll
1538 1.1 skrll /* Now adjust the global symbols defined in this section. */
1539 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1540 1.1 skrll - symtab_hdr->sh_info);
1541 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
1542 1.1 skrll end_hashes = sym_hashes + symcount;
1543 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++)
1544 1.1 skrll {
1545 1.1.1.4 christos struct elf_link_hash_entry *sym_hash = *sym_hashes;
1546 1.1 skrll
1547 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined
1548 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak)
1549 1.1 skrll && sym_hash->root.u.def.section == sec
1550 1.1.1.4 christos && sym_hash->root.u.def.value > addr
1551 1.1.1.4 christos && sym_hash->root.u.def.value <= toaddr)
1552 1.1 skrll sym_hash->root.u.def.value -= count;
1553 1.1 skrll }
1554 1.1 skrll
1555 1.1 skrll return TRUE;
1556 1.1 skrll }
1557 1.1 skrll
1558 1.1 skrll /* Return TRUE if a symbol exists at the given address, else return
1559 1.1 skrll FALSE. */
1560 1.1 skrll static bfd_boolean
1561 1.1 skrll elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1562 1.1 skrll {
1563 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1564 1.1 skrll unsigned int sec_shndx;
1565 1.1 skrll Elf_Internal_Sym *isym;
1566 1.1 skrll Elf_Internal_Sym *isymend;
1567 1.1 skrll struct elf_link_hash_entry **sym_hashes;
1568 1.1 skrll struct elf_link_hash_entry **end_hashes;
1569 1.1 skrll unsigned int symcount;
1570 1.1 skrll
1571 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1572 1.1 skrll
1573 1.1 skrll /* Examine all the symbols. */
1574 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1575 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1576 1.1 skrll isymend = isym + symtab_hdr->sh_info;
1577 1.1 skrll for (; isym < isymend; isym++)
1578 1.1 skrll {
1579 1.1 skrll if (isym->st_shndx == sec_shndx
1580 1.1 skrll && isym->st_value == addr)
1581 1.1 skrll return TRUE;
1582 1.1 skrll }
1583 1.1 skrll
1584 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1585 1.1 skrll - symtab_hdr->sh_info);
1586 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
1587 1.1 skrll end_hashes = sym_hashes + symcount;
1588 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++)
1589 1.1 skrll {
1590 1.1 skrll struct elf_link_hash_entry *sym_hash = *sym_hashes;
1591 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined
1592 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak)
1593 1.1 skrll && sym_hash->root.u.def.section == sec
1594 1.1 skrll && sym_hash->root.u.def.value == addr)
1595 1.1 skrll return TRUE;
1596 1.1 skrll }
1597 1.1 skrll
1598 1.1 skrll return FALSE;
1599 1.1 skrll }
1600 1.1 skrll
1601 1.1 skrll /* This is a version of bfd_generic_get_relocated_section_contents
1602 1.1 skrll which uses elf32_h8_relocate_section. */
1603 1.1 skrll
1604 1.1 skrll static bfd_byte *
1605 1.1 skrll elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1606 1.1 skrll struct bfd_link_info *link_info,
1607 1.1 skrll struct bfd_link_order *link_order,
1608 1.1 skrll bfd_byte *data,
1609 1.1 skrll bfd_boolean relocatable,
1610 1.1 skrll asymbol **symbols)
1611 1.1 skrll {
1612 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1613 1.1 skrll asection *input_section = link_order->u.indirect.section;
1614 1.1 skrll bfd *input_bfd = input_section->owner;
1615 1.1 skrll asection **sections = NULL;
1616 1.1 skrll Elf_Internal_Rela *internal_relocs = NULL;
1617 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
1618 1.1 skrll
1619 1.1 skrll /* We only need to handle the case of relaxing, or of having a
1620 1.1 skrll particular set of section contents, specially. */
1621 1.1 skrll if (relocatable
1622 1.1 skrll || elf_section_data (input_section)->this_hdr.contents == NULL)
1623 1.1 skrll return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1624 1.1 skrll link_order, data,
1625 1.1 skrll relocatable,
1626 1.1 skrll symbols);
1627 1.1 skrll
1628 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1629 1.1 skrll
1630 1.1 skrll memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1631 1.1 skrll (size_t) input_section->size);
1632 1.1 skrll
1633 1.1 skrll if ((input_section->flags & SEC_RELOC) != 0
1634 1.1 skrll && input_section->reloc_count > 0)
1635 1.1 skrll {
1636 1.1 skrll asection **secpp;
1637 1.1 skrll Elf_Internal_Sym *isym, *isymend;
1638 1.1 skrll bfd_size_type amt;
1639 1.1 skrll
1640 1.1.1.3 christos internal_relocs = (_bfd_elf_link_read_relocs
1641 1.1 skrll (input_bfd, input_section, NULL,
1642 1.1 skrll (Elf_Internal_Rela *) NULL, FALSE));
1643 1.1 skrll if (internal_relocs == NULL)
1644 1.1 skrll goto error_return;
1645 1.1 skrll
1646 1.1 skrll if (symtab_hdr->sh_info != 0)
1647 1.1 skrll {
1648 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1649 1.1 skrll if (isymbuf == NULL)
1650 1.1 skrll isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1651 1.1 skrll symtab_hdr->sh_info, 0,
1652 1.1 skrll NULL, NULL, NULL);
1653 1.1 skrll if (isymbuf == NULL)
1654 1.1 skrll goto error_return;
1655 1.1 skrll }
1656 1.1 skrll
1657 1.1 skrll amt = symtab_hdr->sh_info;
1658 1.1 skrll amt *= sizeof (asection *);
1659 1.1 skrll sections = (asection **) bfd_malloc (amt);
1660 1.1 skrll if (sections == NULL && amt != 0)
1661 1.1 skrll goto error_return;
1662 1.1 skrll
1663 1.1 skrll isymend = isymbuf + symtab_hdr->sh_info;
1664 1.1 skrll for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1665 1.1 skrll {
1666 1.1 skrll asection *isec;
1667 1.1 skrll
1668 1.1 skrll if (isym->st_shndx == SHN_UNDEF)
1669 1.1 skrll isec = bfd_und_section_ptr;
1670 1.1 skrll else if (isym->st_shndx == SHN_ABS)
1671 1.1 skrll isec = bfd_abs_section_ptr;
1672 1.1 skrll else if (isym->st_shndx == SHN_COMMON)
1673 1.1 skrll isec = bfd_com_section_ptr;
1674 1.1 skrll else
1675 1.1 skrll isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1676 1.1 skrll
1677 1.1 skrll *secpp = isec;
1678 1.1 skrll }
1679 1.1 skrll
1680 1.1 skrll if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1681 1.1 skrll input_section, data, internal_relocs,
1682 1.1 skrll isymbuf, sections))
1683 1.1 skrll goto error_return;
1684 1.1 skrll
1685 1.1 skrll if (sections != NULL)
1686 1.1 skrll free (sections);
1687 1.1 skrll if (isymbuf != NULL
1688 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1689 1.1 skrll free (isymbuf);
1690 1.1 skrll if (elf_section_data (input_section)->relocs != internal_relocs)
1691 1.1 skrll free (internal_relocs);
1692 1.1 skrll }
1693 1.1 skrll
1694 1.1 skrll return data;
1695 1.1 skrll
1696 1.1 skrll error_return:
1697 1.1 skrll if (sections != NULL)
1698 1.1 skrll free (sections);
1699 1.1 skrll if (isymbuf != NULL
1700 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1701 1.1 skrll free (isymbuf);
1702 1.1 skrll if (internal_relocs != NULL
1703 1.1 skrll && elf_section_data (input_section)->relocs != internal_relocs)
1704 1.1 skrll free (internal_relocs);
1705 1.1 skrll return NULL;
1706 1.1 skrll }
1707 1.1 skrll
1708 1.1.1.4 christos
1709 1.1 skrll #define TARGET_BIG_SYM h8300_elf32_vec
1710 1.1 skrll #define TARGET_BIG_NAME "elf32-h8300"
1711 1.1 skrll #define ELF_ARCH bfd_arch_h8300
1712 1.1 skrll #define ELF_MACHINE_CODE EM_H8_300
1713 1.1 skrll #define ELF_MAXPAGESIZE 0x1
1714 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1715 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1716 1.1 skrll #define elf_info_to_howto elf32_h8_info_to_howto
1717 1.1 skrll #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1718 1.1 skrll
1719 1.1 skrll /* So we can set/examine bits in e_flags to get the specific
1720 1.1 skrll H8 architecture in use. */
1721 1.1 skrll #define elf_backend_final_write_processing \
1722 1.1 skrll elf32_h8_final_write_processing
1723 1.1 skrll #define elf_backend_object_p \
1724 1.1 skrll elf32_h8_object_p
1725 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \
1726 1.1 skrll elf32_h8_merge_private_bfd_data
1727 1.1 skrll
1728 1.1 skrll /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1729 1.1 skrll defaults to using _bfd_generic_link_hash_table_create, but
1730 1.1 skrll bfd_elf_size_dynamic_sections uses
1731 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
1732 1.1 skrll and thus requires an elf hash table. */
1733 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1734 1.1 skrll
1735 1.1 skrll /* Use an H8 specific linker, not the ELF generic linker. */
1736 1.1 skrll #define elf_backend_relocate_section elf32_h8_relocate_section
1737 1.1 skrll #define elf_backend_rela_normal 1
1738 1.1 skrll #define elf_backend_can_gc_sections 1
1739 1.1 skrll
1740 1.1 skrll /* And relaxing stuff. */
1741 1.1 skrll #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1742 1.1 skrll #define bfd_elf32_bfd_get_relocated_section_contents \
1743 1.1 skrll elf32_h8_get_relocated_section_contents
1744 1.1.1.2 christos
1745 1.1 skrll #define elf_symbol_leading_char '_'
1746 1.1 skrll
1747 1.1.1.4 christos #include "elf32-target.h"
1748 1.1.1.4 christos
1749 1.1.1.4 christos #undef TARGET_BIG_SYM
1750 1.1.1.4 christos #define TARGET_BIG_SYM h8300_elf32_linux_vec
1751 1.1.1.4 christos #undef TARGET_BIG_NAME
1752 1.1.1.4 christos #define TARGET_BIG_NAME "elf32-h8300-linux"
1753 1.1.1.4 christos #undef elf_symbol_leading_char
1754 1.1.1.4 christos #define elf32_bed elf32_h8300_linux_bed
1755 1.1.1.4 christos
1756 #include "elf32-target.h"
1757