elf32-h8300.c revision 1.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 skrll 2007 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 skrll (bfd *, arelent *, asymbol *, PTR, 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 skrll static reloc_howto_type h8_elf_howto_table[] = {
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 skrll 0, /* 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 skrll #define R_H8_PCREL16_X (R_H8_DIR32A16_X + 1)
188 1.1 skrll HOWTO (R_H8_PCREL16, /* type */
189 1.1 skrll 0, /* rightshift */
190 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
191 1.1 skrll 16, /* bitsize */
192 1.1 skrll TRUE, /* pc_relative */
193 1.1 skrll 0, /* bitpos */
194 1.1 skrll complain_overflow_signed,/* complain_on_overflow */
195 1.1 skrll special, /* special_function */
196 1.1 skrll "R_H8_PCREL16", /* name */
197 1.1 skrll FALSE, /* partial_inplace */
198 1.1 skrll 0xffff, /* src_mask */
199 1.1 skrll 0xffff, /* dst_mask */
200 1.1 skrll TRUE), /* pcrel_offset */
201 1.1 skrll #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
202 1.1 skrll HOWTO (R_H8_PCREL8, /* type */
203 1.1 skrll 0, /* rightshift */
204 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
205 1.1 skrll 8, /* 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_PCREL8", /* name */
211 1.1 skrll FALSE, /* partial_inplace */
212 1.1 skrll 0xff, /* src_mask */
213 1.1 skrll 0xff, /* dst_mask */
214 1.1 skrll TRUE), /* pcrel_offset */
215 1.1 skrll };
216 1.1 skrll
217 1.1 skrll /* This structure is used to map BFD reloc codes to H8 ELF relocs. */
218 1.1 skrll
219 1.1 skrll struct elf_reloc_map {
220 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val;
221 1.1 skrll unsigned char howto_index;
222 1.1 skrll };
223 1.1 skrll
224 1.1 skrll /* An array mapping BFD reloc codes to H8 ELF relocs. */
225 1.1 skrll
226 1.1 skrll static const struct elf_reloc_map h8_reloc_map[] = {
227 1.1 skrll { BFD_RELOC_NONE, R_H8_NONE_X },
228 1.1 skrll { BFD_RELOC_32, R_H8_DIR32_X },
229 1.1 skrll { BFD_RELOC_16, R_H8_DIR16_X },
230 1.1 skrll { BFD_RELOC_8, R_H8_DIR8_X },
231 1.1 skrll { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
232 1.1 skrll { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
233 1.1 skrll { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
234 1.1 skrll { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
235 1.1 skrll { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
236 1.1 skrll { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
237 1.1 skrll { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
238 1.1 skrll };
239 1.1 skrll
240 1.1 skrll
241 1.1 skrll static reloc_howto_type *
242 1.1 skrll elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
243 1.1 skrll bfd_reloc_code_real_type code)
244 1.1 skrll {
245 1.1 skrll unsigned int i;
246 1.1 skrll
247 1.1 skrll for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
248 1.1 skrll {
249 1.1 skrll if (h8_reloc_map[i].bfd_reloc_val == code)
250 1.1 skrll return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
251 1.1 skrll }
252 1.1 skrll return NULL;
253 1.1 skrll }
254 1.1 skrll
255 1.1 skrll static reloc_howto_type *
256 1.1 skrll elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
257 1.1 skrll const char *r_name)
258 1.1 skrll {
259 1.1 skrll unsigned int i;
260 1.1 skrll
261 1.1 skrll for (i = 0;
262 1.1 skrll i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
263 1.1 skrll i++)
264 1.1 skrll if (h8_elf_howto_table[i].name != NULL
265 1.1 skrll && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
266 1.1 skrll return &h8_elf_howto_table[i];
267 1.1 skrll
268 1.1 skrll return NULL;
269 1.1 skrll }
270 1.1 skrll
271 1.1 skrll static void
272 1.1 skrll elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
273 1.1 skrll Elf_Internal_Rela *elf_reloc)
274 1.1 skrll {
275 1.1 skrll unsigned int r;
276 1.1 skrll unsigned int i;
277 1.1 skrll
278 1.1 skrll r = ELF32_R_TYPE (elf_reloc->r_info);
279 1.1 skrll for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
280 1.1 skrll if (h8_elf_howto_table[i].type == r)
281 1.1 skrll {
282 1.1 skrll bfd_reloc->howto = &h8_elf_howto_table[i];
283 1.1 skrll return;
284 1.1 skrll }
285 1.1 skrll abort ();
286 1.1 skrll }
287 1.1 skrll
288 1.1 skrll static void
289 1.1 skrll elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
290 1.1 skrll Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
291 1.1 skrll {
292 1.1 skrll unsigned int r;
293 1.1 skrll
294 1.1 skrll abort ();
295 1.1 skrll r = ELF32_R_TYPE (elf_reloc->r_info);
296 1.1 skrll bfd_reloc->howto = &h8_elf_howto_table[r];
297 1.1 skrll }
298 1.1 skrll
299 1.1 skrll /* Special handling for H8/300 relocs.
300 1.1 skrll We only come here for pcrel stuff and return normally if not an -r link.
301 1.1 skrll When doing -r, we can't do any arithmetic for the pcrel stuff, because
302 1.1 skrll we support relaxing on the H8/300 series chips. */
303 1.1 skrll static bfd_reloc_status_type
304 1.1 skrll special (bfd *abfd ATTRIBUTE_UNUSED,
305 1.1 skrll arelent *reloc_entry ATTRIBUTE_UNUSED,
306 1.1 skrll asymbol *symbol ATTRIBUTE_UNUSED,
307 1.1 skrll PTR data ATTRIBUTE_UNUSED,
308 1.1 skrll asection *input_section ATTRIBUTE_UNUSED,
309 1.1 skrll bfd *output_bfd,
310 1.1 skrll char **error_message ATTRIBUTE_UNUSED)
311 1.1 skrll {
312 1.1 skrll if (output_bfd == (bfd *) NULL)
313 1.1 skrll return bfd_reloc_continue;
314 1.1 skrll
315 1.1 skrll /* Adjust the reloc address to that in the output section. */
316 1.1 skrll reloc_entry->address += input_section->output_offset;
317 1.1 skrll return bfd_reloc_ok;
318 1.1 skrll }
319 1.1 skrll
320 1.1 skrll /* Perform a relocation as part of a final link. */
321 1.1 skrll static bfd_reloc_status_type
322 1.1 skrll elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
323 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED,
324 1.1 skrll asection *input_section ATTRIBUTE_UNUSED,
325 1.1 skrll bfd_byte *contents, bfd_vma offset,
326 1.1 skrll bfd_vma value, bfd_vma addend,
327 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED,
328 1.1 skrll asection *sym_sec ATTRIBUTE_UNUSED,
329 1.1 skrll int is_local ATTRIBUTE_UNUSED)
330 1.1 skrll {
331 1.1 skrll bfd_byte *hit_data = contents + offset;
332 1.1 skrll
333 1.1 skrll switch (r_type)
334 1.1 skrll {
335 1.1 skrll case R_H8_NONE:
336 1.1 skrll return bfd_reloc_ok;
337 1.1 skrll
338 1.1 skrll case R_H8_DIR32:
339 1.1 skrll case R_H8_DIR32A16:
340 1.1 skrll case R_H8_DIR24A8:
341 1.1 skrll value += addend;
342 1.1 skrll bfd_put_32 (input_bfd, value, hit_data);
343 1.1 skrll return bfd_reloc_ok;
344 1.1 skrll
345 1.1 skrll case R_H8_DIR16:
346 1.1 skrll case R_H8_DIR16A8:
347 1.1 skrll case R_H8_DIR16R8:
348 1.1 skrll value += addend;
349 1.1 skrll bfd_put_16 (input_bfd, value, hit_data);
350 1.1 skrll return bfd_reloc_ok;
351 1.1 skrll
352 1.1 skrll /* AKA R_RELBYTE */
353 1.1 skrll case R_H8_DIR8:
354 1.1 skrll value += addend;
355 1.1 skrll
356 1.1 skrll bfd_put_8 (input_bfd, value, hit_data);
357 1.1 skrll return bfd_reloc_ok;
358 1.1 skrll
359 1.1 skrll case R_H8_DIR24R8:
360 1.1 skrll value += addend;
361 1.1 skrll
362 1.1 skrll /* HIT_DATA is the address for the first byte for the relocated
363 1.1 skrll value. Subtract 1 so that we can manipulate the data in 32-bit
364 1.1 skrll hunks. */
365 1.1 skrll hit_data--;
366 1.1 skrll
367 1.1 skrll /* Clear out the top byte in value. */
368 1.1 skrll value &= 0xffffff;
369 1.1 skrll
370 1.1 skrll /* Retrieve the type byte for value from the section contents. */
371 1.1 skrll value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
372 1.1 skrll
373 1.1 skrll /* Now scribble it out in one 32-bit hunk. */
374 1.1 skrll bfd_put_32 (input_bfd, value, hit_data);
375 1.1 skrll return bfd_reloc_ok;
376 1.1 skrll
377 1.1 skrll case R_H8_PCREL16:
378 1.1 skrll value -= (input_section->output_section->vma
379 1.1 skrll + input_section->output_offset);
380 1.1 skrll value -= offset;
381 1.1 skrll value += addend;
382 1.1 skrll
383 1.1 skrll /* The value is relative to the start of the instruction,
384 1.1 skrll not the relocation offset. Subtract 2 to account for
385 1.1 skrll this minor issue. */
386 1.1 skrll value -= 2;
387 1.1 skrll
388 1.1 skrll bfd_put_16 (input_bfd, value, hit_data);
389 1.1 skrll return bfd_reloc_ok;
390 1.1 skrll
391 1.1 skrll case R_H8_PCREL8:
392 1.1 skrll value -= (input_section->output_section->vma
393 1.1 skrll + input_section->output_offset);
394 1.1 skrll value -= offset;
395 1.1 skrll value += addend;
396 1.1 skrll
397 1.1 skrll /* The value is relative to the start of the instruction,
398 1.1 skrll not the relocation offset. Subtract 1 to account for
399 1.1 skrll this minor issue. */
400 1.1 skrll value -= 1;
401 1.1 skrll
402 1.1 skrll bfd_put_8 (input_bfd, value, hit_data);
403 1.1 skrll return bfd_reloc_ok;
404 1.1 skrll
405 1.1 skrll default:
406 1.1 skrll return bfd_reloc_notsupported;
407 1.1 skrll }
408 1.1 skrll }
409 1.1 skrll
410 1.1 skrll /* Relocate an H8 ELF section. */
412 1.1 skrll static bfd_boolean
413 1.1 skrll elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
414 1.1 skrll bfd *input_bfd, asection *input_section,
415 1.1 skrll bfd_byte *contents, Elf_Internal_Rela *relocs,
416 1.1 skrll Elf_Internal_Sym *local_syms,
417 1.1 skrll asection **local_sections)
418 1.1 skrll {
419 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
420 1.1 skrll struct elf_link_hash_entry **sym_hashes;
421 1.1 skrll Elf_Internal_Rela *rel, *relend;
422 1.1 skrll
423 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
424 1.1 skrll sym_hashes = elf_sym_hashes (input_bfd);
425 1.1 skrll
426 1.1 skrll rel = relocs;
427 1.1 skrll relend = relocs + input_section->reloc_count;
428 1.1 skrll for (; rel < relend; rel++)
429 1.1 skrll {
430 1.1 skrll unsigned int r_type;
431 1.1 skrll unsigned long r_symndx;
432 1.1 skrll Elf_Internal_Sym *sym;
433 1.1 skrll asection *sec;
434 1.1 skrll struct elf_link_hash_entry *h;
435 1.1 skrll bfd_vma relocation;
436 1.1 skrll bfd_reloc_status_type r;
437 1.1 skrll arelent bfd_reloc;
438 1.1 skrll reloc_howto_type *howto;
439 1.1 skrll
440 1.1 skrll elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
441 1.1 skrll howto = bfd_reloc.howto;
442 1.1 skrll
443 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info);
444 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info);
445 1.1 skrll h = NULL;
446 1.1 skrll sym = NULL;
447 1.1 skrll sec = NULL;
448 1.1 skrll if (r_symndx < symtab_hdr->sh_info)
449 1.1 skrll {
450 1.1 skrll sym = local_syms + r_symndx;
451 1.1 skrll sec = local_sections[r_symndx];
452 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
453 1.1 skrll }
454 1.1 skrll else
455 1.1 skrll {
456 1.1 skrll bfd_boolean unresolved_reloc, warned;
457 1.1 skrll
458 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
459 1.1 skrll r_symndx, symtab_hdr, sym_hashes,
460 1.1 skrll h, sec, relocation,
461 1.1 skrll unresolved_reloc, warned);
462 1.1 skrll }
463 1.1 skrll
464 1.1 skrll if (sec != NULL && elf_discarded_section (sec))
465 1.1 skrll {
466 1.1 skrll /* For relocs against symbols from removed linkonce sections,
467 1.1 skrll or sections discarded by a linker script, we just want the
468 1.1 skrll section contents zeroed. Avoid any special processing. */
469 1.1 skrll _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
470 1.1 skrll rel->r_info = 0;
471 1.1 skrll rel->r_addend = 0;
472 1.1 skrll continue;
473 1.1 skrll }
474 1.1 skrll
475 1.1 skrll if (info->relocatable)
476 1.1 skrll continue;
477 1.1 skrll
478 1.1 skrll r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
479 1.1 skrll input_section,
480 1.1 skrll contents, rel->r_offset,
481 1.1 skrll relocation, rel->r_addend,
482 1.1 skrll info, sec, h == NULL);
483 1.1 skrll
484 1.1 skrll if (r != bfd_reloc_ok)
485 1.1 skrll {
486 1.1 skrll const char *name;
487 1.1 skrll const char *msg = (const char *) 0;
488 1.1 skrll
489 1.1 skrll if (h != NULL)
490 1.1 skrll name = h->root.root.string;
491 1.1 skrll else
492 1.1 skrll {
493 1.1 skrll name = (bfd_elf_string_from_elf_section
494 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name));
495 1.1 skrll if (name == NULL || *name == '\0')
496 1.1 skrll name = bfd_section_name (input_bfd, sec);
497 1.1 skrll }
498 1.1 skrll
499 1.1 skrll switch (r)
500 1.1 skrll {
501 1.1 skrll case bfd_reloc_overflow:
502 1.1 skrll if (! ((*info->callbacks->reloc_overflow)
503 1.1 skrll (info, (h ? &h->root : NULL), name, howto->name,
504 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
505 1.1 skrll rel->r_offset)))
506 1.1 skrll return FALSE;
507 1.1 skrll break;
508 1.1 skrll
509 1.1 skrll case bfd_reloc_undefined:
510 1.1 skrll if (! ((*info->callbacks->undefined_symbol)
511 1.1 skrll (info, name, input_bfd, input_section,
512 1.1 skrll rel->r_offset, TRUE)))
513 1.1 skrll return FALSE;
514 1.1 skrll break;
515 1.1 skrll
516 1.1 skrll case bfd_reloc_outofrange:
517 1.1 skrll msg = _("internal error: out of range error");
518 1.1 skrll goto common_error;
519 1.1 skrll
520 1.1 skrll case bfd_reloc_notsupported:
521 1.1 skrll msg = _("internal error: unsupported relocation error");
522 1.1 skrll goto common_error;
523 1.1 skrll
524 1.1 skrll case bfd_reloc_dangerous:
525 1.1 skrll msg = _("internal error: dangerous error");
526 1.1 skrll goto common_error;
527 1.1 skrll
528 1.1 skrll default:
529 1.1 skrll msg = _("internal error: unknown error");
530 1.1 skrll /* fall through */
531 1.1 skrll
532 1.1 skrll common_error:
533 1.1 skrll if (!((*info->callbacks->warning)
534 1.1 skrll (info, msg, name, input_bfd, input_section,
535 1.1 skrll rel->r_offset)))
536 1.1 skrll return FALSE;
537 1.1 skrll break;
538 1.1 skrll }
539 1.1 skrll }
540 1.1 skrll }
541 1.1 skrll
542 1.1 skrll return TRUE;
543 1.1 skrll }
544 1.1 skrll
545 1.1 skrll /* Object files encode the specific H8 model they were compiled
546 1.1 skrll for in the ELF flags field.
547 1.1 skrll
548 1.1 skrll Examine that field and return the proper BFD machine type for
549 1.1 skrll the object file. */
550 1.1 skrll static unsigned long
551 1.1 skrll elf32_h8_mach (flagword flags)
552 1.1 skrll {
553 1.1 skrll switch (flags & EF_H8_MACH)
554 1.1 skrll {
555 1.1 skrll case E_H8_MACH_H8300:
556 1.1 skrll default:
557 1.1 skrll return bfd_mach_h8300;
558 1.1 skrll
559 1.1 skrll case E_H8_MACH_H8300H:
560 1.1 skrll return bfd_mach_h8300h;
561 1.1 skrll
562 1.1 skrll case E_H8_MACH_H8300S:
563 1.1 skrll return bfd_mach_h8300s;
564 1.1 skrll
565 1.1 skrll case E_H8_MACH_H8300HN:
566 1.1 skrll return bfd_mach_h8300hn;
567 1.1 skrll
568 1.1 skrll case E_H8_MACH_H8300SN:
569 1.1 skrll return bfd_mach_h8300sn;
570 1.1 skrll
571 1.1 skrll case E_H8_MACH_H8300SX:
572 1.1 skrll return bfd_mach_h8300sx;
573 1.1 skrll
574 1.1 skrll case E_H8_MACH_H8300SXN:
575 1.1 skrll return bfd_mach_h8300sxn;
576 1.1 skrll }
577 1.1 skrll }
578 1.1 skrll
579 1.1 skrll /* The final processing done just before writing out a H8 ELF object
580 1.1 skrll file. We use this opportunity to encode the BFD machine type
581 1.1 skrll into the flags field in the object file. */
582 1.1 skrll
583 1.1 skrll static void
584 1.1 skrll elf32_h8_final_write_processing (bfd *abfd,
585 1.1 skrll bfd_boolean linker ATTRIBUTE_UNUSED)
586 1.1 skrll {
587 1.1 skrll unsigned long val;
588 1.1 skrll
589 1.1 skrll switch (bfd_get_mach (abfd))
590 1.1 skrll {
591 1.1 skrll default:
592 1.1 skrll case bfd_mach_h8300:
593 1.1 skrll val = E_H8_MACH_H8300;
594 1.1 skrll break;
595 1.1 skrll
596 1.1 skrll case bfd_mach_h8300h:
597 1.1 skrll val = E_H8_MACH_H8300H;
598 1.1 skrll break;
599 1.1 skrll
600 1.1 skrll case bfd_mach_h8300s:
601 1.1 skrll val = E_H8_MACH_H8300S;
602 1.1 skrll break;
603 1.1 skrll
604 1.1 skrll case bfd_mach_h8300hn:
605 1.1 skrll val = E_H8_MACH_H8300HN;
606 1.1 skrll break;
607 1.1 skrll
608 1.1 skrll case bfd_mach_h8300sn:
609 1.1 skrll val = E_H8_MACH_H8300SN;
610 1.1 skrll break;
611 1.1 skrll
612 1.1 skrll case bfd_mach_h8300sx:
613 1.1 skrll val = E_H8_MACH_H8300SX;
614 1.1 skrll break;
615 1.1 skrll
616 1.1 skrll case bfd_mach_h8300sxn:
617 1.1 skrll val = E_H8_MACH_H8300SXN;
618 1.1 skrll break;
619 1.1 skrll }
620 1.1 skrll
621 1.1 skrll elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
622 1.1 skrll elf_elfheader (abfd)->e_flags |= val;
623 1.1 skrll }
624 1.1 skrll
625 1.1 skrll /* Return nonzero if ABFD represents a valid H8 ELF object file; also
626 1.1 skrll record the encoded machine type found in the ELF flags. */
627 1.1 skrll
628 1.1 skrll static bfd_boolean
629 1.1 skrll elf32_h8_object_p (bfd *abfd)
630 1.1 skrll {
631 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
632 1.1 skrll elf32_h8_mach (elf_elfheader (abfd)->e_flags));
633 1.1 skrll return TRUE;
634 1.1 skrll }
635 1.1 skrll
636 1.1 skrll /* Merge backend specific data from an object file to the output
637 1.1 skrll object file when linking. The only data we need to copy at this
638 1.1 skrll time is the architecture/machine information. */
639 1.1 skrll
640 1.1 skrll static bfd_boolean
641 1.1 skrll elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
642 1.1 skrll {
643 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
644 1.1 skrll || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
645 1.1 skrll return TRUE;
646 1.1 skrll
647 1.1 skrll if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
648 1.1 skrll && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
649 1.1 skrll {
650 1.1 skrll if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
651 1.1 skrll bfd_get_mach (ibfd)))
652 1.1 skrll return FALSE;
653 1.1 skrll }
654 1.1 skrll
655 1.1 skrll return TRUE;
656 1.1 skrll }
657 1.1 skrll
658 1.1 skrll /* This function handles relaxing for the H8..
659 1.1 skrll
660 1.1 skrll There are a few relaxing opportunities available on the H8:
661 1.1 skrll
662 1.1 skrll jmp/jsr:24 -> bra/bsr:8 2 bytes
663 1.1 skrll The jmp may be completely eliminated if the previous insn is a
664 1.1 skrll conditional branch to the insn after the jump. In that case
665 1.1 skrll we invert the branch and delete the jump and save 4 bytes.
666 1.1 skrll
667 1.1 skrll bCC:16 -> bCC:8 2 bytes
668 1.1 skrll bsr:16 -> bsr:8 2 bytes
669 1.1 skrll
670 1.1 skrll bset:16 -> bset:8 2 bytes
671 1.1 skrll bset:24/32 -> bset:8 4 bytes
672 1.1 skrll (also applicable to other bit manipulation instructions)
673 1.1 skrll
674 1.1 skrll mov.b:16 -> mov.b:8 2 bytes
675 1.1 skrll mov.b:24/32 -> mov.b:8 4 bytes
676 1.1 skrll
677 1.1 skrll bset:24/32 -> bset:16 2 bytes
678 1.1 skrll (also applicable to other bit manipulation instructions)
679 1.1 skrll
680 1.1 skrll mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
681 1.1 skrll
682 1.1 skrll static bfd_boolean
683 1.1 skrll elf32_h8_relax_section (bfd *abfd, asection *sec,
684 1.1 skrll struct bfd_link_info *link_info, bfd_boolean *again)
685 1.1 skrll {
686 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
687 1.1 skrll Elf_Internal_Rela *internal_relocs;
688 1.1 skrll Elf_Internal_Rela *irel, *irelend;
689 1.1 skrll bfd_byte *contents = NULL;
690 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
691 1.1 skrll static asection *last_input_section = NULL;
692 1.1 skrll static Elf_Internal_Rela *last_reloc = NULL;
693 1.1 skrll
694 1.1 skrll /* Assume nothing changes. */
695 1.1 skrll *again = FALSE;
696 1.1 skrll
697 1.1 skrll /* We don't have to do anything for a relocatable link, if
698 1.1 skrll this section does not have relocs, or if this is not a
699 1.1 skrll code section. */
700 1.1 skrll if (link_info->relocatable
701 1.1 skrll || (sec->flags & SEC_RELOC) == 0
702 1.1 skrll || sec->reloc_count == 0
703 1.1 skrll || (sec->flags & SEC_CODE) == 0)
704 1.1 skrll return TRUE;
705 1.1 skrll
706 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
707 1.1 skrll
708 1.1 skrll /* Get a copy of the native relocations. */
709 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
710 1.1 skrll (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
711 1.1 skrll link_info->keep_memory));
712 1.1 skrll if (internal_relocs == NULL)
713 1.1 skrll goto error_return;
714 1.1 skrll
715 1.1 skrll if (sec != last_input_section)
716 1.1 skrll last_reloc = NULL;
717 1.1 skrll
718 1.1 skrll last_input_section = sec;
719 1.1 skrll
720 1.1 skrll /* Walk through the relocs looking for relaxing opportunities. */
721 1.1 skrll irelend = internal_relocs + sec->reloc_count;
722 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++)
723 1.1 skrll {
724 1.1 skrll bfd_vma symval;
725 1.1 skrll
726 1.1 skrll /* Keep track of the previous reloc so that we can delete
727 1.1 skrll some long jumps created by the compiler. */
728 1.1 skrll if (irel != internal_relocs)
729 1.1 skrll last_reloc = irel - 1;
730 1.1 skrll
731 1.1 skrll if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
732 1.1 skrll && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
733 1.1 skrll && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
734 1.1 skrll && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
735 1.1 skrll && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
736 1.1 skrll continue;
737 1.1 skrll
738 1.1 skrll /* Get the section contents if we haven't done so already. */
739 1.1 skrll if (contents == NULL)
740 1.1 skrll {
741 1.1 skrll /* Get cached copy if it exists. */
742 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != NULL)
743 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
744 1.1 skrll else
745 1.1 skrll {
746 1.1 skrll /* Go get them off disk. */
747 1.1 skrll if (!bfd_malloc_and_get_section (abfd, sec, &contents))
748 1.1 skrll goto error_return;
749 1.1 skrll }
750 1.1 skrll }
751 1.1 skrll
752 1.1 skrll /* Read this BFD's local symbols if we haven't done so already. */
753 1.1 skrll if (isymbuf == NULL && symtab_hdr->sh_info != 0)
754 1.1 skrll {
755 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
756 1.1 skrll if (isymbuf == NULL)
757 1.1 skrll isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
758 1.1 skrll symtab_hdr->sh_info, 0,
759 1.1 skrll NULL, NULL, NULL);
760 1.1 skrll if (isymbuf == NULL)
761 1.1 skrll goto error_return;
762 1.1 skrll }
763 1.1 skrll
764 1.1 skrll /* Get the value of the symbol referred to by the reloc. */
765 1.1 skrll if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
766 1.1 skrll {
767 1.1 skrll /* A local symbol. */
768 1.1 skrll Elf_Internal_Sym *isym;
769 1.1 skrll asection *sym_sec;
770 1.1 skrll
771 1.1 skrll isym = isymbuf + ELF32_R_SYM (irel->r_info);
772 1.1 skrll sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
773 1.1 skrll symval = isym->st_value;
774 1.1 skrll /* If the reloc is absolute, it will not have
775 1.1 skrll a symbol or section associated with it. */
776 1.1 skrll if (sym_sec)
777 1.1 skrll symval += sym_sec->output_section->vma
778 1.1 skrll + sym_sec->output_offset;
779 1.1 skrll }
780 1.1 skrll else
781 1.1 skrll {
782 1.1 skrll unsigned long indx;
783 1.1 skrll struct elf_link_hash_entry *h;
784 1.1 skrll
785 1.1 skrll /* An external symbol. */
786 1.1 skrll indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
787 1.1 skrll h = elf_sym_hashes (abfd)[indx];
788 1.1 skrll BFD_ASSERT (h != NULL);
789 1.1 skrll if (h->root.type != bfd_link_hash_defined
790 1.1 skrll && h->root.type != bfd_link_hash_defweak)
791 1.1 skrll {
792 1.1 skrll /* This appears to be a reference to an undefined
793 1.1 skrll symbol. Just ignore it--it will be caught by the
794 1.1 skrll regular reloc processing. */
795 1.1 skrll continue;
796 1.1 skrll }
797 1.1 skrll
798 1.1 skrll symval = (h->root.u.def.value
799 1.1 skrll + h->root.u.def.section->output_section->vma
800 1.1 skrll + h->root.u.def.section->output_offset);
801 1.1 skrll }
802 1.1 skrll
803 1.1 skrll /* For simplicity of coding, we are going to modify the section
804 1.1 skrll contents, the section relocs, and the BFD symbol table. We
805 1.1 skrll must tell the rest of the code not to free up this
806 1.1 skrll information. It would be possible to instead create a table
807 1.1 skrll of changes which have to be made, as is done in coff-mips.c;
808 1.1 skrll that would be more work, but would require less memory when
809 1.1 skrll the linker is run. */
810 1.1 skrll switch (ELF32_R_TYPE (irel->r_info))
811 1.1 skrll {
812 1.1 skrll /* Try to turn a 24-bit absolute branch/call into an 8-bit
813 1.1 skrll pc-relative branch/call. */
814 1.1 skrll case R_H8_DIR24R8:
815 1.1 skrll {
816 1.1 skrll bfd_vma value = symval + irel->r_addend;
817 1.1 skrll bfd_vma dot, gap;
818 1.1 skrll
819 1.1 skrll /* Get the address of this instruction. */
820 1.1 skrll dot = (sec->output_section->vma
821 1.1 skrll + sec->output_offset + irel->r_offset - 1);
822 1.1 skrll
823 1.1 skrll /* Compute the distance from this insn to the branch target. */
824 1.1 skrll gap = value - dot;
825 1.1 skrll
826 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can
827 1.1 skrll relax this jump. +130 is valid since the target will move
828 1.1 skrll two bytes closer if we do relax this branch. */
829 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130)
830 1.1 skrll {
831 1.1 skrll unsigned char code;
832 1.1 skrll
833 1.1 skrll /* Note that we've changed the relocs, section contents,
834 1.1 skrll etc. */
835 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
836 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
837 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
838 1.1 skrll
839 1.1 skrll /* Get the instruction code being relaxed. */
840 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
841 1.1 skrll
842 1.1 skrll /* If the previous instruction conditionally jumped around
843 1.1 skrll this instruction, we may be able to reverse the condition
844 1.1 skrll and redirect the previous instruction to the target of
845 1.1 skrll this instruction.
846 1.1 skrll
847 1.1 skrll Such sequences are used by the compiler to deal with
848 1.1 skrll long conditional branches.
849 1.1 skrll
850 1.1 skrll Only perform this optimisation for jumps (code 0x5a) not
851 1.1 skrll subroutine calls, as otherwise it could transform:
852 1.1 skrll
853 1.1 skrll mov.w r0,r0
854 1.1 skrll beq .L1
855 1.1 skrll jsr @_bar
856 1.1 skrll .L1: rts
857 1.1 skrll _bar: rts
858 1.1 skrll into:
859 1.1 skrll mov.w r0,r0
860 1.1 skrll bne _bar
861 1.1 skrll rts
862 1.1 skrll _bar: rts
863 1.1 skrll
864 1.1 skrll which changes the call (jsr) into a branch (bne). */
865 1.1 skrll if (code == 0x5a
866 1.1 skrll && (int) gap <= 130
867 1.1 skrll && (int) gap >= -128
868 1.1 skrll && last_reloc
869 1.1 skrll && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
870 1.1 skrll && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
871 1.1 skrll {
872 1.1 skrll bfd_vma last_value;
873 1.1 skrll asection *last_sym_sec;
874 1.1 skrll Elf_Internal_Sym *last_sym;
875 1.1 skrll
876 1.1 skrll /* We will need to examine the symbol used by the
877 1.1 skrll previous relocation. */
878 1.1 skrll
879 1.1 skrll last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
880 1.1 skrll last_sym_sec
881 1.1 skrll = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
882 1.1 skrll last_value = (last_sym->st_value
883 1.1 skrll + last_sym_sec->output_section->vma
884 1.1 skrll + last_sym_sec->output_offset);
885 1.1 skrll
886 1.1 skrll /* Verify that the previous relocation was for a
887 1.1 skrll branch around this instruction and that no symbol
888 1.1 skrll exists at the current location. */
889 1.1 skrll if (last_value == dot + 4
890 1.1 skrll && last_reloc->r_offset + 2 == irel->r_offset
891 1.1 skrll && ! elf32_h8_symbol_address_p (abfd, sec, dot))
892 1.1 skrll {
893 1.1 skrll /* We can eliminate this jump. Twiddle the
894 1.1 skrll previous relocation as necessary. */
895 1.1 skrll irel->r_info
896 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
897 1.1 skrll ELF32_R_TYPE (R_H8_NONE));
898 1.1 skrll
899 1.1 skrll last_reloc->r_info
900 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
901 1.1 skrll ELF32_R_TYPE (R_H8_PCREL8));
902 1.1 skrll last_reloc->r_addend = irel->r_addend;
903 1.1 skrll
904 1.1 skrll code = bfd_get_8 (abfd,
905 1.1 skrll contents + last_reloc->r_offset - 1);
906 1.1 skrll code ^= 1;
907 1.1 skrll bfd_put_8 (abfd,
908 1.1 skrll code,
909 1.1 skrll contents + last_reloc->r_offset - 1);
910 1.1 skrll
911 1.1 skrll /* Delete four bytes of data. */
912 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
913 1.1 skrll irel->r_offset - 1,
914 1.1 skrll 4))
915 1.1 skrll goto error_return;
916 1.1 skrll
917 1.1 skrll *again = TRUE;
918 1.1 skrll break;
919 1.1 skrll }
920 1.1 skrll }
921 1.1 skrll
922 1.1 skrll if (code == 0x5e)
923 1.1 skrll /* This is jsr. */
924 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
925 1.1 skrll else if (code == 0x5a)
926 1.1 skrll /* This is jmp. */
927 1.1 skrll bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
928 1.1 skrll else
929 1.1 skrll abort ();
930 1.1 skrll
931 1.1 skrll /* Fix the relocation's type. */
932 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
933 1.1 skrll R_H8_PCREL8);
934 1.1 skrll
935 1.1 skrll /* Delete two bytes of data. */
936 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
937 1.1 skrll irel->r_offset + 1, 2))
938 1.1 skrll goto error_return;
939 1.1 skrll
940 1.1 skrll /* That will change things, so, we should relax again.
941 1.1 skrll Note that this is not required, and it may be slow. */
942 1.1 skrll *again = TRUE;
943 1.1 skrll }
944 1.1 skrll break;
945 1.1 skrll }
946 1.1 skrll
947 1.1 skrll /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
948 1.1 skrll branch. */
949 1.1 skrll case R_H8_PCREL16:
950 1.1 skrll {
951 1.1 skrll bfd_vma value = symval + irel->r_addend;
952 1.1 skrll bfd_vma dot;
953 1.1 skrll bfd_vma gap;
954 1.1 skrll
955 1.1 skrll /* Get the address of this instruction. */
956 1.1 skrll dot = (sec->output_section->vma
957 1.1 skrll + sec->output_offset
958 1.1 skrll + irel->r_offset - 2);
959 1.1 skrll
960 1.1 skrll gap = value - dot;
961 1.1 skrll
962 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can
963 1.1 skrll relax this jump. +130 is valid since the target will move
964 1.1 skrll two bytes closer if we do relax this branch. */
965 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130)
966 1.1 skrll {
967 1.1 skrll unsigned char code;
968 1.1 skrll
969 1.1 skrll /* Note that we've changed the relocs, section contents,
970 1.1 skrll etc. */
971 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
972 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
973 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
974 1.1 skrll
975 1.1 skrll /* Get the opcode. */
976 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
977 1.1 skrll
978 1.1 skrll if (code == 0x58)
979 1.1 skrll {
980 1.1 skrll /* bCC:16 -> bCC:8 */
981 1.1 skrll /* Get the second byte of the original insn, which
982 1.1 skrll contains the condition code. */
983 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
984 1.1 skrll
985 1.1 skrll /* Compute the fisrt byte of the relaxed
986 1.1 skrll instruction. The original sequence 0x58 0xX0
987 1.1 skrll is relaxed to 0x4X, where X represents the
988 1.1 skrll condition code. */
989 1.1 skrll code &= 0xf0;
990 1.1 skrll code >>= 4;
991 1.1 skrll code |= 0x40;
992 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
993 1.1 skrll }
994 1.1 skrll else if (code == 0x5c)
995 1.1 skrll /* This is bsr. */
996 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
997 1.1 skrll else
998 1.1 skrll abort ();
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 skrll unsigned char code;
1211 1.1 skrll
1212 1.1 skrll /* Note that we've changed the relocs, section contents,
1213 1.1 skrll etc. */
1214 1.1 skrll elf_section_data (sec)->relocs = internal_relocs;
1215 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1216 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1217 1.1 skrll
1218 1.1 skrll /* Get the opcode. */
1219 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1220 1.1 skrll
1221 1.1 skrll /* Fix the opcode. For all the instructions that
1222 1.1 skrll belong to this relaxation, we simply need to turn
1223 1.1 skrll off bit 0x20 in the previous byte. */
1224 1.1 skrll code &= ~0x20;
1225 1.1 skrll
1226 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1227 1.1 skrll
1228 1.1 skrll /* Fix the relocation's type. */
1229 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1230 1.1 skrll R_H8_DIR16);
1231 1.1 skrll
1232 1.1 skrll /* Delete two bytes of data. */
1233 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec,
1234 1.1 skrll irel->r_offset + 1, 2))
1235 1.1 skrll goto error_return;
1236 1.1 skrll
1237 1.1 skrll /* That will change things, so, we should relax again.
1238 1.1 skrll Note that this is not required, and it may be slow. */
1239 1.1 skrll *again = TRUE;
1240 1.1 skrll }
1241 1.1 skrll break;
1242 1.1 skrll }
1243 1.1 skrll
1244 1.1 skrll default:
1245 1.1 skrll break;
1246 1.1 skrll }
1247 1.1 skrll }
1248 1.1 skrll
1249 1.1 skrll if (isymbuf != NULL
1250 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1251 1.1 skrll {
1252 1.1 skrll if (! link_info->keep_memory)
1253 1.1 skrll free (isymbuf);
1254 1.1 skrll else
1255 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf;
1256 1.1 skrll }
1257 1.1 skrll
1258 1.1 skrll if (contents != NULL
1259 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
1260 1.1 skrll {
1261 1.1 skrll if (! link_info->keep_memory)
1262 1.1 skrll free (contents);
1263 1.1 skrll else
1264 1.1 skrll {
1265 1.1 skrll /* Cache the section contents for elf_link_input_bfd. */
1266 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents;
1267 1.1 skrll }
1268 1.1 skrll }
1269 1.1 skrll
1270 1.1 skrll if (internal_relocs != NULL
1271 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
1272 1.1 skrll free (internal_relocs);
1273 1.1 skrll
1274 1.1 skrll return TRUE;
1275 1.1 skrll
1276 1.1 skrll error_return:
1277 1.1 skrll if (isymbuf != NULL
1278 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1279 1.1 skrll free (isymbuf);
1280 1.1 skrll if (contents != NULL
1281 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents)
1282 1.1 skrll free (contents);
1283 1.1 skrll if (internal_relocs != NULL
1284 1.1 skrll && elf_section_data (sec)->relocs != internal_relocs)
1285 1.1 skrll free (internal_relocs);
1286 1.1 skrll return FALSE;
1287 1.1 skrll }
1288 1.1 skrll
1289 1.1 skrll /* Delete some bytes from a section while relaxing. */
1290 1.1 skrll
1291 1.1 skrll static bfd_boolean
1292 1.1 skrll elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1293 1.1 skrll {
1294 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1295 1.1 skrll unsigned int sec_shndx;
1296 1.1 skrll bfd_byte *contents;
1297 1.1 skrll Elf_Internal_Rela *irel, *irelend;
1298 1.1 skrll Elf_Internal_Rela *irelalign;
1299 1.1 skrll Elf_Internal_Sym *isym;
1300 1.1 skrll Elf_Internal_Sym *isymend;
1301 1.1 skrll bfd_vma toaddr;
1302 1.1 skrll struct elf_link_hash_entry **sym_hashes;
1303 1.1 skrll struct elf_link_hash_entry **end_hashes;
1304 1.1 skrll unsigned int symcount;
1305 1.1 skrll
1306 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1307 1.1 skrll
1308 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents;
1309 1.1 skrll
1310 1.1 skrll /* The deletion must stop at the next ALIGN reloc for an aligment
1311 1.1 skrll power larger than the number of bytes we are deleting. */
1312 1.1 skrll
1313 1.1 skrll irelalign = NULL;
1314 1.1 skrll toaddr = sec->size;
1315 1.1 skrll
1316 1.1 skrll irel = elf_section_data (sec)->relocs;
1317 1.1 skrll irelend = irel + sec->reloc_count;
1318 1.1 skrll
1319 1.1 skrll /* Actually delete the bytes. */
1320 1.1 skrll memmove (contents + addr, contents + addr + count,
1321 1.1 skrll (size_t) (toaddr - addr - count));
1322 1.1 skrll sec->size -= count;
1323 1.1 skrll
1324 1.1 skrll /* Adjust all the relocs. */
1325 1.1 skrll for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1326 1.1 skrll {
1327 1.1 skrll /* Get the new reloc address. */
1328 1.1 skrll if ((irel->r_offset > addr
1329 1.1 skrll && irel->r_offset < toaddr))
1330 1.1 skrll irel->r_offset -= count;
1331 1.1 skrll }
1332 1.1 skrll
1333 1.1 skrll /* Adjust the local symbols defined in this section. */
1334 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1335 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1336 1.1 skrll isymend = isym + symtab_hdr->sh_info;
1337 1.1 skrll for (; isym < isymend; isym++)
1338 1.1 skrll {
1339 1.1 skrll if (isym->st_shndx == sec_shndx
1340 1.1 skrll && isym->st_value > addr
1341 1.1 skrll && isym->st_value < toaddr)
1342 1.1 skrll isym->st_value -= count;
1343 1.1 skrll }
1344 1.1 skrll
1345 1.1 skrll /* Now adjust the global symbols defined in this section. */
1346 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1347 1.1 skrll - symtab_hdr->sh_info);
1348 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
1349 1.1 skrll end_hashes = sym_hashes + symcount;
1350 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++)
1351 1.1 skrll {
1352 1.1 skrll struct elf_link_hash_entry *sym_hash = *sym_hashes;
1353 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined
1354 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak)
1355 1.1 skrll && sym_hash->root.u.def.section == sec
1356 1.1 skrll && sym_hash->root.u.def.value > addr
1357 1.1 skrll && sym_hash->root.u.def.value < toaddr)
1358 1.1 skrll {
1359 1.1 skrll sym_hash->root.u.def.value -= count;
1360 1.1 skrll }
1361 1.1 skrll }
1362 1.1 skrll
1363 1.1 skrll return TRUE;
1364 1.1 skrll }
1365 1.1 skrll
1366 1.1 skrll /* Return TRUE if a symbol exists at the given address, else return
1367 1.1 skrll FALSE. */
1368 1.1 skrll static bfd_boolean
1369 1.1 skrll elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1370 1.1 skrll {
1371 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1372 1.1 skrll unsigned int sec_shndx;
1373 1.1 skrll Elf_Internal_Sym *isym;
1374 1.1 skrll Elf_Internal_Sym *isymend;
1375 1.1 skrll struct elf_link_hash_entry **sym_hashes;
1376 1.1 skrll struct elf_link_hash_entry **end_hashes;
1377 1.1 skrll unsigned int symcount;
1378 1.1 skrll
1379 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1380 1.1 skrll
1381 1.1 skrll /* Examine all the symbols. */
1382 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1383 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1384 1.1 skrll isymend = isym + symtab_hdr->sh_info;
1385 1.1 skrll for (; isym < isymend; isym++)
1386 1.1 skrll {
1387 1.1 skrll if (isym->st_shndx == sec_shndx
1388 1.1 skrll && isym->st_value == addr)
1389 1.1 skrll return TRUE;
1390 1.1 skrll }
1391 1.1 skrll
1392 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1393 1.1 skrll - symtab_hdr->sh_info);
1394 1.1 skrll sym_hashes = elf_sym_hashes (abfd);
1395 1.1 skrll end_hashes = sym_hashes + symcount;
1396 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++)
1397 1.1 skrll {
1398 1.1 skrll struct elf_link_hash_entry *sym_hash = *sym_hashes;
1399 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined
1400 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak)
1401 1.1 skrll && sym_hash->root.u.def.section == sec
1402 1.1 skrll && sym_hash->root.u.def.value == addr)
1403 1.1 skrll return TRUE;
1404 1.1 skrll }
1405 1.1 skrll
1406 1.1 skrll return FALSE;
1407 1.1 skrll }
1408 1.1 skrll
1409 1.1 skrll /* This is a version of bfd_generic_get_relocated_section_contents
1410 1.1 skrll which uses elf32_h8_relocate_section. */
1411 1.1 skrll
1412 1.1 skrll static bfd_byte *
1413 1.1 skrll elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1414 1.1 skrll struct bfd_link_info *link_info,
1415 1.1 skrll struct bfd_link_order *link_order,
1416 1.1 skrll bfd_byte *data,
1417 1.1 skrll bfd_boolean relocatable,
1418 1.1 skrll asymbol **symbols)
1419 1.1 skrll {
1420 1.1 skrll Elf_Internal_Shdr *symtab_hdr;
1421 1.1 skrll asection *input_section = link_order->u.indirect.section;
1422 1.1 skrll bfd *input_bfd = input_section->owner;
1423 1.1 skrll asection **sections = NULL;
1424 1.1 skrll Elf_Internal_Rela *internal_relocs = NULL;
1425 1.1 skrll Elf_Internal_Sym *isymbuf = NULL;
1426 1.1 skrll
1427 1.1 skrll /* We only need to handle the case of relaxing, or of having a
1428 1.1 skrll particular set of section contents, specially. */
1429 1.1 skrll if (relocatable
1430 1.1 skrll || elf_section_data (input_section)->this_hdr.contents == NULL)
1431 1.1 skrll return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1432 1.1 skrll link_order, data,
1433 1.1 skrll relocatable,
1434 1.1 skrll symbols);
1435 1.1 skrll
1436 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1437 1.1 skrll
1438 1.1 skrll memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1439 1.1 skrll (size_t) input_section->size);
1440 1.1 skrll
1441 1.1 skrll if ((input_section->flags & SEC_RELOC) != 0
1442 1.1 skrll && input_section->reloc_count > 0)
1443 1.1 skrll {
1444 1.1 skrll asection **secpp;
1445 1.1 skrll Elf_Internal_Sym *isym, *isymend;
1446 1.1 skrll bfd_size_type amt;
1447 1.1 skrll
1448 1.1 skrll internal_relocs = (_bfd_elf_link_read_relocs
1449 1.1 skrll (input_bfd, input_section, (PTR) NULL,
1450 1.1 skrll (Elf_Internal_Rela *) NULL, FALSE));
1451 1.1 skrll if (internal_relocs == NULL)
1452 1.1 skrll goto error_return;
1453 1.1 skrll
1454 1.1 skrll if (symtab_hdr->sh_info != 0)
1455 1.1 skrll {
1456 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1457 1.1 skrll if (isymbuf == NULL)
1458 1.1 skrll isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1459 1.1 skrll symtab_hdr->sh_info, 0,
1460 1.1 skrll NULL, NULL, NULL);
1461 1.1 skrll if (isymbuf == NULL)
1462 1.1 skrll goto error_return;
1463 1.1 skrll }
1464 1.1 skrll
1465 1.1 skrll amt = symtab_hdr->sh_info;
1466 1.1 skrll amt *= sizeof (asection *);
1467 1.1 skrll sections = (asection **) bfd_malloc (amt);
1468 1.1 skrll if (sections == NULL && amt != 0)
1469 1.1 skrll goto error_return;
1470 1.1 skrll
1471 1.1 skrll isymend = isymbuf + symtab_hdr->sh_info;
1472 1.1 skrll for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1473 1.1 skrll {
1474 1.1 skrll asection *isec;
1475 1.1 skrll
1476 1.1 skrll if (isym->st_shndx == SHN_UNDEF)
1477 1.1 skrll isec = bfd_und_section_ptr;
1478 1.1 skrll else if (isym->st_shndx == SHN_ABS)
1479 1.1 skrll isec = bfd_abs_section_ptr;
1480 1.1 skrll else if (isym->st_shndx == SHN_COMMON)
1481 1.1 skrll isec = bfd_com_section_ptr;
1482 1.1 skrll else
1483 1.1 skrll isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1484 1.1 skrll
1485 1.1 skrll *secpp = isec;
1486 1.1 skrll }
1487 1.1 skrll
1488 1.1 skrll if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1489 1.1 skrll input_section, data, internal_relocs,
1490 1.1 skrll isymbuf, sections))
1491 1.1 skrll goto error_return;
1492 1.1 skrll
1493 1.1 skrll if (sections != NULL)
1494 1.1 skrll free (sections);
1495 1.1 skrll if (isymbuf != NULL
1496 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1497 1.1 skrll free (isymbuf);
1498 1.1 skrll if (elf_section_data (input_section)->relocs != internal_relocs)
1499 1.1 skrll free (internal_relocs);
1500 1.1 skrll }
1501 1.1 skrll
1502 1.1 skrll return data;
1503 1.1 skrll
1504 1.1 skrll error_return:
1505 1.1 skrll if (sections != NULL)
1506 1.1 skrll free (sections);
1507 1.1 skrll if (isymbuf != NULL
1508 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf)
1509 1.1 skrll free (isymbuf);
1510 1.1 skrll if (internal_relocs != NULL
1511 1.1 skrll && elf_section_data (input_section)->relocs != internal_relocs)
1512 1.1 skrll free (internal_relocs);
1513 1.1 skrll return NULL;
1514 1.1 skrll }
1515 1.1 skrll
1516 1.1 skrll
1517 1.1 skrll #define TARGET_BIG_SYM bfd_elf32_h8300_vec
1518 1.1 skrll #define TARGET_BIG_NAME "elf32-h8300"
1519 1.1 skrll #define ELF_ARCH bfd_arch_h8300
1520 1.1 skrll #define ELF_MACHINE_CODE EM_H8_300
1521 1.1 skrll #define ELF_MAXPAGESIZE 0x1
1522 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1523 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1524 1.1 skrll #define elf_info_to_howto elf32_h8_info_to_howto
1525 1.1 skrll #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1526 1.1 skrll
1527 1.1 skrll /* So we can set/examine bits in e_flags to get the specific
1528 1.1 skrll H8 architecture in use. */
1529 1.1 skrll #define elf_backend_final_write_processing \
1530 1.1 skrll elf32_h8_final_write_processing
1531 1.1 skrll #define elf_backend_object_p \
1532 1.1 skrll elf32_h8_object_p
1533 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \
1534 1.1 skrll elf32_h8_merge_private_bfd_data
1535 1.1 skrll
1536 1.1 skrll /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1537 1.1 skrll defaults to using _bfd_generic_link_hash_table_create, but
1538 1.1 skrll bfd_elf_size_dynamic_sections uses
1539 1.1 skrll dynobj = elf_hash_table (info)->dynobj;
1540 1.1 skrll and thus requires an elf hash table. */
1541 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1542 1.1 skrll
1543 1.1 skrll /* Use an H8 specific linker, not the ELF generic linker. */
1544 1.1 skrll #define elf_backend_relocate_section elf32_h8_relocate_section
1545 1.1 skrll #define elf_backend_rela_normal 1
1546 1.1 skrll #define elf_backend_can_gc_sections 1
1547 1.1 skrll
1548 1.1 skrll /* And relaxing stuff. */
1549 1.1 skrll #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1550 1.1 skrll #define bfd_elf32_bfd_get_relocated_section_contents \
1551 1.1 skrll elf32_h8_get_relocated_section_contents
1552 1.1 skrll
1553 1.1 skrll
1554 #include "elf32-target.h"
1555