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