gmp-utils: New API to simply use of GMP's integer/rational/float objects
[binutils-gdb.git] / bfd / elf32-cr16.c
blobc93fd9da8f84ccc4bf2f68f87cbaac3649d4a094
1 /* BFD back-end for National Semiconductor's CR16 ELF
2 Copyright (C) 2007-2020 Free Software Foundation, Inc.
3 Written by M R Swami Reddy.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "libiberty.h"
26 #include "elf-bfd.h"
27 #include "elf/cr16.h"
28 #include "elf32-cr16.h"
30 /* The cr16 linker needs to keep track of the number of relocs that
31 it decides to copy in check_relocs for each symbol. This is so
32 that it can discard PC relative relocs if it doesn't need them when
33 linking with -Bsymbolic. We store the information in a field
34 extending the regular ELF linker hash table. */
36 struct elf32_cr16_link_hash_entry
38 /* The basic elf link hash table entry. */
39 struct elf_link_hash_entry root;
41 /* For function symbols, the number of times this function is
42 called directly (ie by name). */
43 unsigned int direct_calls;
45 /* For function symbols, the size of this function's stack
46 (if <= 255 bytes). We stuff this into "call" instructions
47 to this target when it's valid and profitable to do so.
49 This does not include stack allocated by movm! */
50 unsigned char stack_size;
52 /* For function symbols, arguments (if any) for movm instruction
53 in the prologue. We stuff this value into "call" instructions
54 to the target when it's valid and profitable to do so. */
55 unsigned char movm_args;
57 /* For function symbols, the amount of stack space that would be allocated
58 by the movm instruction. This is redundant with movm_args, but we
59 add it to the hash table to avoid computing it over and over. */
60 unsigned char movm_stack_size;
62 /* Used to mark functions which have had redundant parts of their
63 prologue deleted. */
64 #define CR16_DELETED_PROLOGUE_BYTES 0x1
65 unsigned char flags;
67 /* Calculated value. */
68 bfd_vma value;
71 /* cr16_reloc_map array maps BFD relocation enum into a CRGAS relocation type. */
73 struct cr16_reloc_map
75 bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum. */
76 unsigned short cr16_reloc_type; /* CR16 relocation type. */
79 static const struct cr16_reloc_map cr16_reloc_map[R_CR16_MAX] =
81 {BFD_RELOC_NONE, R_CR16_NONE},
82 {BFD_RELOC_CR16_NUM8, R_CR16_NUM8},
83 {BFD_RELOC_CR16_NUM16, R_CR16_NUM16},
84 {BFD_RELOC_CR16_NUM32, R_CR16_NUM32},
85 {BFD_RELOC_CR16_NUM32a, R_CR16_NUM32a},
86 {BFD_RELOC_CR16_REGREL4, R_CR16_REGREL4},
87 {BFD_RELOC_CR16_REGREL4a, R_CR16_REGREL4a},
88 {BFD_RELOC_CR16_REGREL14, R_CR16_REGREL14},
89 {BFD_RELOC_CR16_REGREL14a, R_CR16_REGREL14a},
90 {BFD_RELOC_CR16_REGREL16, R_CR16_REGREL16},
91 {BFD_RELOC_CR16_REGREL20, R_CR16_REGREL20},
92 {BFD_RELOC_CR16_REGREL20a, R_CR16_REGREL20a},
93 {BFD_RELOC_CR16_ABS20, R_CR16_ABS20},
94 {BFD_RELOC_CR16_ABS24, R_CR16_ABS24},
95 {BFD_RELOC_CR16_IMM4, R_CR16_IMM4},
96 {BFD_RELOC_CR16_IMM8, R_CR16_IMM8},
97 {BFD_RELOC_CR16_IMM16, R_CR16_IMM16},
98 {BFD_RELOC_CR16_IMM20, R_CR16_IMM20},
99 {BFD_RELOC_CR16_IMM24, R_CR16_IMM24},
100 {BFD_RELOC_CR16_IMM32, R_CR16_IMM32},
101 {BFD_RELOC_CR16_IMM32a, R_CR16_IMM32a},
102 {BFD_RELOC_CR16_DISP4, R_CR16_DISP4},
103 {BFD_RELOC_CR16_DISP8, R_CR16_DISP8},
104 {BFD_RELOC_CR16_DISP16, R_CR16_DISP16},
105 {BFD_RELOC_CR16_DISP24, R_CR16_DISP24},
106 {BFD_RELOC_CR16_DISP24a, R_CR16_DISP24a},
107 {BFD_RELOC_CR16_SWITCH8, R_CR16_SWITCH8},
108 {BFD_RELOC_CR16_SWITCH16, R_CR16_SWITCH16},
109 {BFD_RELOC_CR16_SWITCH32, R_CR16_SWITCH32},
110 {BFD_RELOC_CR16_GOT_REGREL20, R_CR16_GOT_REGREL20},
111 {BFD_RELOC_CR16_GOTC_REGREL20, R_CR16_GOTC_REGREL20},
112 {BFD_RELOC_CR16_GLOB_DAT, R_CR16_GLOB_DAT}
115 static reloc_howto_type cr16_elf_howto_table[] =
117 HOWTO (R_CR16_NONE, /* type */
118 0, /* rightshift */
119 3, /* size */
120 0, /* bitsize */
121 FALSE, /* pc_relative */
122 0, /* bitpos */
123 complain_overflow_dont, /* complain_on_overflow */
124 bfd_elf_generic_reloc, /* special_function */
125 "R_CR16_NONE", /* name */
126 FALSE, /* partial_inplace */
127 0, /* src_mask */
128 0, /* dst_mask */
129 FALSE), /* pcrel_offset */
131 HOWTO (R_CR16_NUM8, /* type */
132 0, /* rightshift */
133 0, /* size */
134 8, /* bitsize */
135 FALSE, /* pc_relative */
136 0, /* bitpos */
137 complain_overflow_bitfield,/* complain_on_overflow */
138 bfd_elf_generic_reloc, /* special_function */
139 "R_CR16_NUM8", /* name */
140 FALSE, /* partial_inplace */
141 0x0, /* src_mask */
142 0xff, /* dst_mask */
143 FALSE), /* pcrel_offset */
145 HOWTO (R_CR16_NUM16, /* type */
146 0, /* rightshift */
147 1, /* size */
148 16, /* bitsize */
149 FALSE, /* pc_relative */
150 0, /* bitpos */
151 complain_overflow_bitfield,/* complain_on_overflow */
152 bfd_elf_generic_reloc, /* special_function */
153 "R_CR16_NUM16", /* name */
154 FALSE, /* partial_inplace */
155 0x0, /* src_mask */
156 0xffff, /* dst_mask */
157 FALSE), /* pcrel_offset */
159 HOWTO (R_CR16_NUM32, /* type */
160 0, /* rightshift */
161 2, /* size */
162 32, /* bitsize */
163 FALSE, /* pc_relative */
164 0, /* bitpos */
165 complain_overflow_bitfield,/* complain_on_overflow */
166 bfd_elf_generic_reloc, /* special_function */
167 "R_CR16_NUM32", /* name */
168 FALSE, /* partial_inplace */
169 0x0, /* src_mask */
170 0xffffffff, /* dst_mask */
171 FALSE), /* pcrel_offset */
173 HOWTO (R_CR16_NUM32a, /* type */
174 1, /* rightshift */
175 2, /* size */
176 32, /* bitsize */
177 FALSE, /* pc_relative */
178 0, /* bitpos */
179 complain_overflow_bitfield,/* complain_on_overflow */
180 bfd_elf_generic_reloc, /* special_function */
181 "R_CR16_NUM32a", /* name */
182 FALSE, /* partial_inplace */
183 0x0, /* src_mask */
184 0xffffffff, /* dst_mask */
185 FALSE), /* pcrel_offset */
187 HOWTO (R_CR16_REGREL4, /* type */
188 0, /* rightshift */
189 0, /* size */
190 4, /* bitsize */
191 FALSE, /* pc_relative */
192 0, /* bitpos */
193 complain_overflow_bitfield,/* complain_on_overflow */
194 bfd_elf_generic_reloc, /* special_function */
195 "R_CR16_REGREL4", /* name */
196 FALSE, /* partial_inplace */
197 0x0, /* src_mask */
198 0xf, /* dst_mask */
199 FALSE), /* pcrel_offset */
201 HOWTO (R_CR16_REGREL4a, /* type */
202 0, /* rightshift */
203 0, /* size */
204 4, /* bitsize */
205 FALSE, /* pc_relative */
206 0, /* bitpos */
207 complain_overflow_bitfield,/* complain_on_overflow */
208 bfd_elf_generic_reloc, /* special_function */
209 "R_CR16_REGREL4a", /* name */
210 FALSE, /* partial_inplace */
211 0x0, /* src_mask */
212 0xf, /* dst_mask */
213 FALSE), /* pcrel_offset */
215 HOWTO (R_CR16_REGREL14, /* type */
216 0, /* rightshift */
217 1, /* size */
218 14, /* bitsize */
219 FALSE, /* pc_relative */
220 0, /* bitpos */
221 complain_overflow_bitfield,/* complain_on_overflow */
222 bfd_elf_generic_reloc, /* special_function */
223 "R_CR16_REGREL14", /* name */
224 FALSE, /* partial_inplace */
225 0x0, /* src_mask */
226 0x3fff, /* dst_mask */
227 FALSE), /* pcrel_offset */
229 HOWTO (R_CR16_REGREL14a, /* type */
230 0, /* rightshift */
231 1, /* size */
232 14, /* bitsize */
233 FALSE, /* pc_relative */
234 0, /* bitpos */
235 complain_overflow_bitfield,/* complain_on_overflow */
236 bfd_elf_generic_reloc, /* special_function */
237 "R_CR16_REGREL14a", /* name */
238 FALSE, /* partial_inplace */
239 0x0, /* src_mask */
240 0x3fff, /* dst_mask */
241 FALSE), /* pcrel_offset */
243 HOWTO (R_CR16_REGREL16, /* type */
244 0, /* rightshift */
245 1, /* size */
246 16, /* bitsize */
247 FALSE, /* pc_relative */
248 0, /* bitpos */
249 complain_overflow_bitfield,/* complain_on_overflow */
250 bfd_elf_generic_reloc, /* special_function */
251 "R_CR16_REGREL16", /* name */
252 FALSE, /* partial_inplace */
253 0x0, /* src_mask */
254 0xffff, /* dst_mask */
255 FALSE), /* pcrel_offset */
257 HOWTO (R_CR16_REGREL20, /* type */
258 0, /* rightshift */
259 2, /* size */
260 20, /* bitsize */
261 FALSE, /* pc_relative */
262 0, /* bitpos */
263 complain_overflow_bitfield,/* complain_on_overflow */
264 bfd_elf_generic_reloc, /* special_function */
265 "R_CR16_REGREL20", /* name */
266 FALSE, /* partial_inplace */
267 0x0, /* src_mask */
268 0xfffff, /* dst_mask */
269 FALSE), /* pcrel_offset */
271 HOWTO (R_CR16_REGREL20a, /* type */
272 0, /* rightshift */
273 2, /* size */
274 20, /* bitsize */
275 FALSE, /* pc_relative */
276 0, /* bitpos */
277 complain_overflow_bitfield,/* complain_on_overflow */
278 bfd_elf_generic_reloc, /* special_function */
279 "R_CR16_REGREL20a", /* name */
280 FALSE, /* partial_inplace */
281 0x0, /* src_mask */
282 0xfffff, /* dst_mask */
283 FALSE), /* pcrel_offset */
285 HOWTO (R_CR16_ABS20, /* type */
286 0, /* rightshift */
287 2, /* size */
288 20, /* bitsize */
289 FALSE, /* pc_relative */
290 0, /* bitpos */
291 complain_overflow_bitfield,/* complain_on_overflow */
292 bfd_elf_generic_reloc, /* special_function */
293 "R_CR16_ABS20", /* name */
294 FALSE, /* partial_inplace */
295 0x0, /* src_mask */
296 0xfffff, /* dst_mask */
297 FALSE), /* pcrel_offset */
299 HOWTO (R_CR16_ABS24, /* type */
300 0, /* rightshift */
301 2, /* size */
302 24, /* bitsize */
303 FALSE, /* pc_relative */
304 0, /* bitpos */
305 complain_overflow_bitfield,/* complain_on_overflow */
306 bfd_elf_generic_reloc, /* special_function */
307 "R_CR16_ABS24", /* name */
308 FALSE, /* partial_inplace */
309 0x0, /* src_mask */
310 0xffffff, /* dst_mask */
311 FALSE), /* pcrel_offset */
313 HOWTO (R_CR16_IMM4, /* type */
314 0, /* rightshift */
315 0, /* size */
316 4, /* bitsize */
317 FALSE, /* pc_relative */
318 0, /* bitpos */
319 complain_overflow_bitfield,/* complain_on_overflow */
320 bfd_elf_generic_reloc, /* special_function */
321 "R_CR16_IMM4", /* name */
322 FALSE, /* partial_inplace */
323 0x0, /* src_mask */
324 0xf, /* dst_mask */
325 FALSE), /* pcrel_offset */
327 HOWTO (R_CR16_IMM8, /* type */
328 0, /* rightshift */
329 0, /* size */
330 8, /* bitsize */
331 FALSE, /* pc_relative */
332 0, /* bitpos */
333 complain_overflow_bitfield,/* complain_on_overflow */
334 bfd_elf_generic_reloc, /* special_function */
335 "R_CR16_IMM8", /* name */
336 FALSE, /* partial_inplace */
337 0x0, /* src_mask */
338 0xff, /* dst_mask */
339 FALSE), /* pcrel_offset */
341 HOWTO (R_CR16_IMM16, /* type */
342 0, /* rightshift */
343 1, /* size */
344 16, /* bitsize */
345 FALSE, /* pc_relative */
346 0, /* bitpos */
347 complain_overflow_bitfield,/* complain_on_overflow */
348 bfd_elf_generic_reloc, /* special_function */
349 "R_CR16_IMM16", /* name */
350 FALSE, /* partial_inplace */
351 0x0, /* src_mask */
352 0xffff, /* dst_mask */
353 FALSE), /* pcrel_offset */
355 HOWTO (R_CR16_IMM20, /* type */
356 0, /* rightshift */
357 2, /* size */
358 20, /* bitsize */
359 FALSE, /* pc_relative */
360 0, /* bitpos */
361 complain_overflow_bitfield,/* complain_on_overflow */
362 bfd_elf_generic_reloc, /* special_function */
363 "R_CR16_IMM20", /* name */
364 FALSE, /* partial_inplace */
365 0x0, /* src_mask */
366 0xfffff, /* dst_mask */
367 FALSE), /* pcrel_offset */
369 HOWTO (R_CR16_IMM24, /* type */
370 0, /* rightshift */
371 2, /* size */
372 24, /* bitsize */
373 FALSE, /* pc_relative */
374 0, /* bitpos */
375 complain_overflow_bitfield,/* complain_on_overflow */
376 bfd_elf_generic_reloc, /* special_function */
377 "R_CR16_IMM24", /* name */
378 FALSE, /* partial_inplace */
379 0x0, /* src_mask */
380 0xffffff, /* dst_mask */
381 FALSE), /* pcrel_offset */
383 HOWTO (R_CR16_IMM32, /* type */
384 0, /* rightshift */
385 2, /* size */
386 32, /* bitsize */
387 FALSE, /* pc_relative */
388 0, /* bitpos */
389 complain_overflow_bitfield,/* complain_on_overflow */
390 bfd_elf_generic_reloc, /* special_function */
391 "R_CR16_IMM32", /* name */
392 FALSE, /* partial_inplace */
393 0x0, /* src_mask */
394 0xffffffff, /* dst_mask */
395 FALSE), /* pcrel_offset */
397 HOWTO (R_CR16_IMM32a, /* type */
398 1, /* rightshift */
399 2, /* size */
400 32, /* bitsize */
401 FALSE, /* pc_relative */
402 0, /* bitpos */
403 complain_overflow_bitfield,/* complain_on_overflow */
404 bfd_elf_generic_reloc, /* special_function */
405 "R_CR16_IMM32a", /* name */
406 FALSE, /* partial_inplace */
407 0x0, /* src_mask */
408 0xffffffff, /* dst_mask */
409 FALSE), /* pcrel_offset */
411 HOWTO (R_CR16_DISP4, /* type */
412 1, /* rightshift */
413 0, /* size (0 = byte, 1 = short, 2 = long) */
414 4, /* bitsize */
415 TRUE, /* pc_relative */
416 0, /* bitpos */
417 complain_overflow_unsigned, /* complain_on_overflow */
418 bfd_elf_generic_reloc, /* special_function */
419 "R_CR16_DISP4", /* name */
420 FALSE, /* partial_inplace */
421 0x0, /* src_mask */
422 0xf, /* dst_mask */
423 FALSE), /* pcrel_offset */
425 HOWTO (R_CR16_DISP8, /* type */
426 1, /* rightshift */
427 0, /* size (0 = byte, 1 = short, 2 = long) */
428 8, /* bitsize */
429 TRUE, /* pc_relative */
430 0, /* bitpos */
431 complain_overflow_unsigned, /* complain_on_overflow */
432 bfd_elf_generic_reloc, /* special_function */
433 "R_CR16_DISP8", /* name */
434 FALSE, /* partial_inplace */
435 0x0, /* src_mask */
436 0x1ff, /* dst_mask */
437 FALSE), /* pcrel_offset */
439 HOWTO (R_CR16_DISP16, /* type */
440 0, /* rightshift REVIITS: To sync with WinIDEA*/
441 1, /* size (0 = byte, 1 = short, 2 = long) */
442 16, /* bitsize */
443 TRUE, /* pc_relative */
444 0, /* bitpos */
445 complain_overflow_unsigned, /* complain_on_overflow */
446 bfd_elf_generic_reloc, /* special_function */
447 "R_CR16_DISP16", /* name */
448 FALSE, /* partial_inplace */
449 0x0, /* src_mask */
450 0x1ffff, /* dst_mask */
451 FALSE), /* pcrel_offset */
452 /* REVISIT: DISP24 should be left-shift by 2 as per ISA doc
453 but its not done, to sync with WinIDEA and CR16 4.1 tools */
454 HOWTO (R_CR16_DISP24, /* type */
455 0, /* rightshift */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
457 24, /* bitsize */
458 TRUE, /* pc_relative */
459 0, /* bitpos */
460 complain_overflow_unsigned, /* complain_on_overflow */
461 bfd_elf_generic_reloc, /* special_function */
462 "R_CR16_DISP24", /* name */
463 FALSE, /* partial_inplace */
464 0x0, /* src_mask */
465 0x1ffffff, /* dst_mask */
466 FALSE), /* pcrel_offset */
468 HOWTO (R_CR16_DISP24a, /* type */
469 0, /* rightshift */
470 2, /* size (0 = byte, 1 = short, 2 = long) */
471 24, /* bitsize */
472 TRUE, /* pc_relative */
473 0, /* bitpos */
474 complain_overflow_unsigned, /* complain_on_overflow */
475 bfd_elf_generic_reloc, /* special_function */
476 "R_CR16_DISP24a", /* name */
477 FALSE, /* partial_inplace */
478 0x0, /* src_mask */
479 0xffffff, /* dst_mask */
480 FALSE), /* pcrel_offset */
482 /* An 8 bit switch table entry. This is generated for an expression
483 such as ``.byte L1 - L2''. The offset holds the difference
484 between the reloc address and L2. */
485 HOWTO (R_CR16_SWITCH8, /* type */
486 0, /* rightshift */
487 0, /* size (0 = byte, 1 = short, 2 = long) */
488 8, /* bitsize */
489 FALSE, /* pc_relative */
490 0, /* bitpos */
491 complain_overflow_unsigned, /* complain_on_overflow */
492 bfd_elf_generic_reloc, /* special_function */
493 "R_CR16_SWITCH8", /* name */
494 FALSE, /* partial_inplace */
495 0x0, /* src_mask */
496 0xff, /* dst_mask */
497 TRUE), /* pcrel_offset */
499 /* A 16 bit switch table entry. This is generated for an expression
500 such as ``.word L1 - L2''. The offset holds the difference
501 between the reloc address and L2. */
502 HOWTO (R_CR16_SWITCH16, /* type */
503 0, /* rightshift */
504 1, /* size (0 = byte, 1 = short, 2 = long) */
505 16, /* bitsize */
506 FALSE, /* pc_relative */
507 0, /* bitpos */
508 complain_overflow_unsigned, /* complain_on_overflow */
509 bfd_elf_generic_reloc, /* special_function */
510 "R_CR16_SWITCH16", /* name */
511 FALSE, /* partial_inplace */
512 0x0, /* src_mask */
513 0xffff, /* dst_mask */
514 TRUE), /* pcrel_offset */
516 /* A 32 bit switch table entry. This is generated for an expression
517 such as ``.long L1 - L2''. The offset holds the difference
518 between the reloc address and L2. */
519 HOWTO (R_CR16_SWITCH32, /* type */
520 0, /* rightshift */
521 2, /* size (0 = byte, 1 = short, 2 = long) */
522 32, /* bitsize */
523 FALSE, /* pc_relative */
524 0, /* bitpos */
525 complain_overflow_unsigned, /* complain_on_overflow */
526 bfd_elf_generic_reloc, /* special_function */
527 "R_CR16_SWITCH32", /* name */
528 FALSE, /* partial_inplace */
529 0x0, /* src_mask */
530 0xffffffff, /* dst_mask */
531 TRUE), /* pcrel_offset */
533 HOWTO (R_CR16_GOT_REGREL20, /* type */
534 0, /* rightshift */
535 2, /* size */
536 20, /* bitsize */
537 FALSE, /* pc_relative */
538 0, /* bitpos */
539 complain_overflow_bitfield,/* complain_on_overflow */
540 bfd_elf_generic_reloc, /* special_function */
541 "R_CR16_GOT_REGREL20", /* name */
542 TRUE, /* partial_inplace */
543 0x0, /* src_mask */
544 0xfffff, /* dst_mask */
545 FALSE), /* pcrel_offset */
547 HOWTO (R_CR16_GOTC_REGREL20, /* type */
548 0, /* rightshift */
549 2, /* size */
550 20, /* bitsize */
551 FALSE, /* pc_relative */
552 0, /* bitpos */
553 complain_overflow_bitfield,/* complain_on_overflow */
554 bfd_elf_generic_reloc, /* special_function */
555 "R_CR16_GOTC_REGREL20", /* name */
556 TRUE, /* partial_inplace */
557 0x0, /* src_mask */
558 0xfffff, /* dst_mask */
559 FALSE), /* pcrel_offset */
561 HOWTO (R_CR16_GLOB_DAT, /* type */
562 0, /* rightshift */
563 2, /* size (0 = byte, 1 = short, 2 = long) */
564 32, /* bitsize */
565 FALSE, /* pc_relative */
566 0, /* bitpos */
567 complain_overflow_unsigned, /* complain_on_overflow */
568 bfd_elf_generic_reloc, /* special_function */
569 "R_CR16_GLOB_DAT", /* name */
570 FALSE, /* partial_inplace */
571 0x0, /* src_mask */
572 0xffffffff, /* dst_mask */
573 TRUE) /* pcrel_offset */
577 /* Create the GOT section. */
579 static bfd_boolean
580 _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
582 flagword flags;
583 asection * s;
584 struct elf_link_hash_entry * h;
585 const struct elf_backend_data * bed = get_elf_backend_data (abfd);
586 struct elf_link_hash_table *htab = elf_hash_table (info);
587 int ptralign;
589 /* This function may be called more than once. */
590 if (htab->sgot != NULL)
591 return TRUE;
593 switch (bed->s->arch_size)
595 case 16:
596 ptralign = 1;
597 break;
599 case 32:
600 ptralign = 2;
601 break;
603 default:
604 bfd_set_error (bfd_error_bad_value);
605 return FALSE;
608 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
609 | SEC_LINKER_CREATED);
611 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
612 htab->sgot= s;
613 if (s == NULL
614 || !bfd_set_section_alignment (s, ptralign))
615 return FALSE;
617 if (bed->want_got_plt)
619 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
620 htab->sgotplt = s;
621 if (s == NULL
622 || !bfd_set_section_alignment (s, ptralign))
623 return FALSE;
626 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
627 (or .got.plt) section. We don't do this in the linker script
628 because we don't want to define the symbol if we are not creating
629 a global offset table. */
630 h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
631 htab->hgot = h;
632 if (h == NULL)
633 return FALSE;
635 /* The first bit of the global offset table is the header. */
636 s->size += bed->got_header_size;
638 return TRUE;
642 /* Retrieve a howto ptr using a BFD reloc_code. */
644 static reloc_howto_type *
645 elf_cr16_reloc_type_lookup (bfd *abfd,
646 bfd_reloc_code_real_type code)
648 unsigned int i;
650 for (i = 0; i < R_CR16_MAX; i++)
651 if (code == cr16_reloc_map[i].bfd_reloc_enum)
652 return &cr16_elf_howto_table[cr16_reloc_map[i].cr16_reloc_type];
654 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
655 abfd, code);
656 return NULL;
659 static reloc_howto_type *
660 elf_cr16_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
661 const char *r_name)
663 unsigned int i;
665 for (i = 0; ARRAY_SIZE (cr16_elf_howto_table); i++)
666 if (cr16_elf_howto_table[i].name != NULL
667 && strcasecmp (cr16_elf_howto_table[i].name, r_name) == 0)
668 return cr16_elf_howto_table + i;
670 return NULL;
673 /* Retrieve a howto ptr using an internal relocation entry. */
675 static bfd_boolean
676 elf_cr16_info_to_howto (bfd *abfd, arelent *cache_ptr,
677 Elf_Internal_Rela *dst)
679 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
681 if (r_type >= R_CR16_MAX)
683 /* xgettext:c-format */
684 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
685 abfd, r_type);
686 bfd_set_error (bfd_error_bad_value);
687 return FALSE;
689 cache_ptr->howto = cr16_elf_howto_table + r_type;
690 return TRUE;
693 /* Look through the relocs for a section during the first phase.
694 Since we don't do .gots or .plts, we just need to consider the
695 virtual table relocs for gc. */
697 static bfd_boolean
698 cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
699 const Elf_Internal_Rela *relocs)
701 Elf_Internal_Shdr *symtab_hdr;
702 Elf_Internal_Sym * isymbuf = NULL;
703 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
704 const Elf_Internal_Rela *rel;
705 const Elf_Internal_Rela *rel_end;
706 bfd * dynobj;
707 bfd_vma * local_got_offsets;
708 asection * sgot;
709 asection * srelgot;
711 sgot = NULL;
712 srelgot = NULL;
713 bfd_boolean result = FALSE;
715 if (bfd_link_relocatable (info))
716 return TRUE;
718 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
719 sym_hashes = elf_sym_hashes (abfd);
720 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
721 if (!elf_bad_symtab (abfd))
722 sym_hashes_end -= symtab_hdr->sh_info;
724 dynobj = elf_hash_table (info)->dynobj;
725 local_got_offsets = elf_local_got_offsets (abfd);
726 rel_end = relocs + sec->reloc_count;
727 for (rel = relocs; rel < rel_end; rel++)
729 struct elf_link_hash_entry *h;
730 unsigned long r_symndx;
732 r_symndx = ELF32_R_SYM (rel->r_info);
733 if (r_symndx < symtab_hdr->sh_info)
734 h = NULL;
735 else
737 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
738 while (h->root.type == bfd_link_hash_indirect
739 || h->root.type == bfd_link_hash_warning)
740 h = (struct elf_link_hash_entry *) h->root.u.i.link;
743 /* Some relocs require a global offset table. */
744 if (dynobj == NULL)
746 switch (ELF32_R_TYPE (rel->r_info))
748 case R_CR16_GOT_REGREL20:
749 case R_CR16_GOTC_REGREL20:
750 elf_hash_table (info)->dynobj = dynobj = abfd;
751 if (! _bfd_cr16_elf_create_got_section (dynobj, info))
752 goto fail;
753 break;
755 default:
756 break;
760 switch (ELF32_R_TYPE (rel->r_info))
762 case R_CR16_GOT_REGREL20:
763 case R_CR16_GOTC_REGREL20:
764 /* This symbol requires a global offset table entry. */
766 sgot = elf_hash_table (info)->sgot;
767 srelgot = elf_hash_table (info)->srelgot;
768 BFD_ASSERT (sgot != NULL && srelgot != NULL);
770 if (h != NULL)
772 if (h->got.offset != (bfd_vma) -1)
773 /* We have already allocated space in the .got. */
774 break;
776 h->got.offset = sgot->size;
778 /* Make sure this symbol is output as a dynamic symbol. */
779 if (h->dynindx == -1)
781 if (! bfd_elf_link_record_dynamic_symbol (info, h))
782 goto fail;
785 srelgot->size += sizeof (Elf32_External_Rela);
787 else
789 /* This is a global offset table entry for a local
790 symbol. */
791 if (local_got_offsets == NULL)
793 size_t size;
794 unsigned int i;
796 size = symtab_hdr->sh_info * sizeof (bfd_vma);
797 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
799 if (local_got_offsets == NULL)
800 goto fail;
802 elf_local_got_offsets (abfd) = local_got_offsets;
804 for (i = 0; i < symtab_hdr->sh_info; i++)
805 local_got_offsets[i] = (bfd_vma) -1;
808 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
809 /* We have already allocated space in the .got. */
810 break;
812 local_got_offsets[r_symndx] = sgot->size;
814 if (bfd_link_executable (info))
815 /* If we are generating a shared object, we need to
816 output a R_CR16_RELATIVE reloc so that the dynamic
817 linker can adjust this GOT entry. */
818 srelgot->size += sizeof (Elf32_External_Rela);
821 sgot->size += 4;
822 break;
827 result = TRUE;
828 fail:
829 free (isymbuf);
831 return result;
834 /* Perform a relocation as part of a final link. */
836 static bfd_reloc_status_type
837 cr16_elf_final_link_relocate (reloc_howto_type *howto,
838 bfd *input_bfd,
839 bfd *output_bfd ATTRIBUTE_UNUSED,
840 asection *input_section,
841 bfd_byte *contents,
842 bfd_vma offset,
843 bfd_vma Rvalue,
844 bfd_vma addend,
845 struct elf_link_hash_entry * h,
846 unsigned long symndx ATTRIBUTE_UNUSED,
847 struct bfd_link_info *info ATTRIBUTE_UNUSED,
848 asection *sec ATTRIBUTE_UNUSED,
849 int is_local ATTRIBUTE_UNUSED)
851 unsigned short r_type = howto->type;
852 bfd_byte *hit_data = contents + offset;
853 bfd_vma reloc_bits, check, Rvalue1;
855 switch (r_type)
857 case R_CR16_IMM4:
858 case R_CR16_IMM20:
859 case R_CR16_ABS20:
860 break;
862 case R_CR16_IMM8:
863 case R_CR16_IMM16:
864 case R_CR16_IMM32:
865 case R_CR16_IMM32a:
866 case R_CR16_REGREL4:
867 case R_CR16_REGREL4a:
868 case R_CR16_REGREL14:
869 case R_CR16_REGREL14a:
870 case R_CR16_REGREL16:
871 case R_CR16_REGREL20:
872 case R_CR16_REGREL20a:
873 case R_CR16_GOT_REGREL20:
874 case R_CR16_GOTC_REGREL20:
875 case R_CR16_ABS24:
876 case R_CR16_DISP16:
877 case R_CR16_DISP24:
878 /* 'hit_data' is relative to the start of the instruction, not the
879 relocation offset. Advance it to account for the exact offset. */
880 hit_data += 2;
881 break;
883 case R_CR16_NONE:
884 return bfd_reloc_ok;
885 break;
887 case R_CR16_DISP4:
888 if (is_local)
889 Rvalue += -1;
890 break;
892 case R_CR16_DISP8:
893 case R_CR16_DISP24a:
894 if (is_local)
895 Rvalue -= -1;
896 break;
898 case R_CR16_SWITCH8:
899 case R_CR16_SWITCH16:
900 case R_CR16_SWITCH32:
901 /* We only care about the addend, where the difference between
902 expressions is kept. */
903 Rvalue = 0;
905 default:
906 break;
909 if (howto->pc_relative)
911 /* Subtract the address of the section containing the location. */
912 Rvalue -= (input_section->output_section->vma
913 + input_section->output_offset);
914 /* Subtract the position of the location within the section. */
915 Rvalue -= offset;
918 /* Add in supplied addend. */
919 Rvalue += addend;
921 /* Complain if the bitfield overflows, whether it is considered
922 as signed or unsigned. */
923 check = Rvalue >> howto->rightshift;
925 reloc_bits = ((bfd_vma) 1 << (howto->bitsize - 1) << 1) - 1;
927 /* For GOT and GOTC relocs no boundary checks applied. */
928 if (!((r_type == R_CR16_GOT_REGREL20)
929 || (r_type == R_CR16_GOTC_REGREL20)))
931 if (((bfd_vma) check & ~reloc_bits) != 0
932 && (((bfd_vma) check & ~reloc_bits)
933 != (-(bfd_vma) 1 & ~reloc_bits)))
935 /* The above right shift is incorrect for a signed
936 value. See if turning on the upper bits fixes the
937 overflow. */
938 if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
940 check |= ((bfd_vma) -1
941 & ~((bfd_vma) -1 >> howto->rightshift));
943 if (((bfd_vma) check & ~reloc_bits)
944 != (-(bfd_vma) 1 & ~reloc_bits))
945 return bfd_reloc_overflow;
947 else
948 return bfd_reloc_overflow;
951 /* Drop unwanted bits from the value we are relocating to. */
952 Rvalue >>= (bfd_vma) howto->rightshift;
954 /* Apply dst_mask to select only relocatable part of the insn. */
955 Rvalue &= howto->dst_mask;
958 switch (howto->size)
960 case 0:
961 if (r_type == R_CR16_DISP8)
963 Rvalue1 = bfd_get_16 (input_bfd, hit_data);
964 Rvalue = ((Rvalue1 & 0xf000) | ((Rvalue << 4) & 0xf00)
965 | (Rvalue1 & 0x00f0) | (Rvalue & 0xf));
966 bfd_put_16 (input_bfd, Rvalue, hit_data);
968 else if (r_type == R_CR16_IMM4)
970 Rvalue1 = bfd_get_16 (input_bfd, hit_data);
971 Rvalue = (((Rvalue1 & 0xff) << 8) | ((Rvalue << 4) & 0xf0)
972 | ((Rvalue1 & 0x0f00) >> 8));
973 bfd_put_16 (input_bfd, Rvalue, hit_data);
975 else if (r_type == R_CR16_DISP4)
977 Rvalue1 = bfd_get_16 (input_bfd, hit_data);
978 Rvalue = (Rvalue1 | ((Rvalue & 0xf) << 4));
979 bfd_put_16 (input_bfd, Rvalue, hit_data);
981 else
983 bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
985 break;
987 case 1:
988 if (r_type == R_CR16_DISP16)
990 Rvalue |= (bfd_get_16 (input_bfd, hit_data));
991 Rvalue = ((Rvalue & 0xfffe) | ((Rvalue >> 16) & 0x1));
993 if (r_type == R_CR16_IMM16)
995 Rvalue1 = bfd_get_16 (input_bfd, hit_data);
997 Rvalue1 = (Rvalue1 ^ 0x8000) - 0x8000;
998 Rvalue += Rvalue1;
1000 /* Check for range. */
1001 if (Rvalue > 0xffff)
1002 return bfd_reloc_overflow;
1005 bfd_put_16 (input_bfd, Rvalue, hit_data);
1006 break;
1008 case 2:
1009 if ((r_type == R_CR16_ABS20) || (r_type == R_CR16_IMM20))
1011 Rvalue1 = (bfd_get_16 (input_bfd, hit_data + 2)
1012 | (((bfd_get_16 (input_bfd, hit_data) & 0xf) << 16)));
1014 Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1015 Rvalue += Rvalue1;
1017 /* Check for range. */
1018 if (Rvalue > 0xfffff)
1019 return bfd_reloc_overflow;
1021 bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
1022 | ((Rvalue >> 16) & 0xf)), hit_data);
1023 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1025 else if (r_type == R_CR16_GOT_REGREL20)
1027 asection *sgot = elf_hash_table (info)->sgot;
1028 bfd_vma off;
1030 if (h != NULL)
1032 off = h->got.offset;
1033 BFD_ASSERT (off != (bfd_vma) -1);
1035 if (! elf_hash_table (info)->dynamic_sections_created
1036 || SYMBOL_REFERENCES_LOCAL (info, h))
1037 /* This is actually a static link, or it is a
1038 -Bsymbolic link and the symbol is defined
1039 locally, or the symbol was forced to be local
1040 because of a version file. We must initialize
1041 this entry in the global offset table.
1042 When doing a dynamic link, we create a .rela.got
1043 relocation entry to initialize the value. This
1044 is done in the finish_dynamic_symbol routine. */
1045 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1047 else
1049 off = elf_local_got_offsets (input_bfd)[symndx];
1050 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1053 Rvalue = sgot->output_offset + off;
1054 Rvalue += addend;
1056 /* REVISIT: if ((long) Rvalue > 0xffffff ||
1057 (long) Rvalue < -0x800000). */
1058 if (Rvalue > 0xffffff)
1059 return bfd_reloc_overflow;
1062 bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
1063 | (((Rvalue >> 16) & 0xf) << 8), hit_data);
1064 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1067 else if (r_type == R_CR16_GOTC_REGREL20)
1069 asection *sgot = elf_hash_table (info)->sgot;
1070 bfd_vma off;
1072 if (h != NULL)
1074 off = h->got.offset;
1075 BFD_ASSERT (off != (bfd_vma) -1);
1077 Rvalue >>= 1; /* For code symbols. */
1079 if (! elf_hash_table (info)->dynamic_sections_created
1080 || SYMBOL_REFERENCES_LOCAL (info, h))
1081 /* This is actually a static link, or it is a
1082 -Bsymbolic link and the symbol is defined
1083 locally, or the symbol was forced to be local
1084 because of a version file. We must initialize
1085 this entry in the global offset table.
1086 When doing a dynamic link, we create a .rela.got
1087 relocation entry to initialize the value. This
1088 is done in the finish_dynamic_symbol routine. */
1089 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1091 else
1093 off = elf_local_got_offsets (input_bfd)[symndx];
1094 Rvalue >>= 1;
1095 bfd_put_32 (output_bfd, Rvalue, sgot->contents + off);
1098 Rvalue = sgot->output_offset + off;
1099 Rvalue += addend;
1101 /* Check if any value in DISP. */
1102 Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1103 Rvalue1 = ((Rvalue1 >> 16) | ((Rvalue1 & 0xfff) >> 8 << 16));
1105 Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1106 Rvalue += Rvalue1;
1108 /* Check for range. */
1109 /* REVISIT: if ((long) Rvalue > 0xffffff
1110 || (long) Rvalue < -0x800000). */
1111 if (Rvalue > 0xffffff)
1112 return bfd_reloc_overflow;
1114 bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
1115 | (((Rvalue >> 16) & 0xf) << 8), hit_data);
1116 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1118 else
1120 if (r_type == R_CR16_ABS24)
1122 Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1123 Rvalue1 = ((Rvalue1 >> 16)
1124 | ((Rvalue1 & 0xfff) >> 8 << 16)
1125 | ((Rvalue1 & 0xf) << 20));
1127 Rvalue1 = (Rvalue1 ^ 0x800000) - 0x800000;
1128 Rvalue += Rvalue1;
1130 /* Check for Range. */
1131 if (Rvalue > 0xffffff)
1132 return bfd_reloc_overflow;
1134 Rvalue = ((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf)<<8)
1135 | (bfd_get_32 (input_bfd, hit_data) & 0xf0f0))
1136 | ((Rvalue & 0xffff) << 16));
1138 else if (r_type == R_CR16_DISP24)
1140 Rvalue = ((((Rvalue >> 20)& 0xf) | (((Rvalue >>16) & 0xf)<<8)
1141 | (bfd_get_16 (input_bfd, hit_data)))
1142 | (((Rvalue & 0xfffe) | ((Rvalue >> 24) & 0x1)) << 16));
1144 else if ((r_type == R_CR16_IMM32) || (r_type == R_CR16_IMM32a))
1146 Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1147 Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
1148 | ((Rvalue1 & 0xffff) << 16));
1150 Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
1151 Rvalue += Rvalue1;
1153 /* Check for range. */
1154 if (Rvalue > 0xffffffff)
1155 return bfd_reloc_overflow;
1157 Rvalue = (((Rvalue >> 16) & 0xffff) | (Rvalue & 0xffff) << 16);
1159 else if (r_type == R_CR16_DISP24a)
1161 Rvalue = (((Rvalue & 0xfffffe) | (Rvalue >> 23)));
1162 Rvalue = (((Rvalue >> 16) & 0xff) | ((Rvalue & 0xffff) << 16)
1163 | bfd_get_32 (input_bfd, hit_data));
1165 else if ((r_type == R_CR16_REGREL20)
1166 || (r_type == R_CR16_REGREL20a))
1168 Rvalue1 = bfd_get_32 (input_bfd, hit_data);
1169 Rvalue1 = (((Rvalue1 >> 16) & 0xffff)
1170 | ((Rvalue1 & 0xfff) >> 8 << 16));
1172 Rvalue1 = (Rvalue1 ^ 0x80000) - 0x80000;
1173 Rvalue += Rvalue1;
1175 /* Check for range. */
1176 if (Rvalue > 0xfffff)
1177 return bfd_reloc_overflow;
1179 Rvalue = (((((Rvalue >> 20) & 0xf) | (((Rvalue >> 16) & 0xf) << 8)
1180 | ((Rvalue & 0xffff) << 16)))
1181 | (bfd_get_32 (input_bfd, hit_data) & 0xf0ff));
1184 else if (r_type == R_CR16_NUM32)
1186 Rvalue1 = (bfd_get_32 (input_bfd, hit_data));
1188 Rvalue1 = (Rvalue1 ^ 0x80000000) - 0x80000000;
1189 Rvalue += Rvalue1;
1191 /* Check for Range. */
1192 if (Rvalue > 0xffffffff)
1193 return bfd_reloc_overflow;
1196 bfd_put_32 (input_bfd, Rvalue, hit_data);
1198 break;
1200 default:
1201 return bfd_reloc_notsupported;
1204 return bfd_reloc_ok;
1207 /* Delete some bytes from a section while relaxing. */
1209 static bfd_boolean
1210 elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd,
1211 asection *sec, bfd_vma addr, int count)
1213 Elf_Internal_Shdr *symtab_hdr;
1214 unsigned int sec_shndx;
1215 bfd_byte *contents;
1216 Elf_Internal_Rela *irel, *irelend;
1217 bfd_vma toaddr;
1218 Elf_Internal_Sym *isym;
1219 Elf_Internal_Sym *isymend;
1220 struct elf_link_hash_entry **sym_hashes;
1221 struct elf_link_hash_entry **end_hashes;
1222 struct elf_link_hash_entry **start_hashes;
1223 unsigned int symcount;
1225 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1227 contents = elf_section_data (sec)->this_hdr.contents;
1229 toaddr = sec->size;
1231 irel = elf_section_data (sec)->relocs;
1232 irelend = irel + sec->reloc_count;
1234 /* Actually delete the bytes. */
1235 memmove (contents + addr, contents + addr + count,
1236 (size_t) (toaddr - addr - count));
1237 sec->size -= count;
1239 /* Adjust all the relocs. */
1240 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1241 /* Get the new reloc address. */
1242 if ((irel->r_offset > addr && irel->r_offset < toaddr))
1243 irel->r_offset -= count;
1245 /* Adjust the local symbols defined in this section. */
1246 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1247 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1248 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1250 if (isym->st_shndx == sec_shndx
1251 && isym->st_value > addr
1252 && isym->st_value < toaddr)
1254 /* Adjust the addend of SWITCH relocations in this section,
1255 which reference this local symbol. */
1256 #if 0
1257 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1259 unsigned long r_symndx;
1260 Elf_Internal_Sym *rsym;
1261 bfd_vma addsym, subsym;
1263 /* Skip if not a SWITCH relocation. */
1264 if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH8
1265 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16
1266 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32)
1267 continue;
1269 r_symndx = ELF32_R_SYM (irel->r_info);
1270 rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx;
1272 /* Skip if not the local adjusted symbol. */
1273 if (rsym != isym)
1274 continue;
1276 addsym = isym->st_value;
1277 subsym = addsym - irel->r_addend;
1279 /* Fix the addend only when -->> (addsym > addr >= subsym). */
1280 if (subsym <= addr)
1281 irel->r_addend -= count;
1282 else
1283 continue;
1285 #endif
1287 isym->st_value -= count;
1291 /* Now adjust the global symbols defined in this section. */
1292 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1293 - symtab_hdr->sh_info);
1294 sym_hashes = start_hashes = elf_sym_hashes (abfd);
1295 end_hashes = sym_hashes + symcount;
1297 for (; sym_hashes < end_hashes; sym_hashes++)
1299 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1301 /* The '--wrap SYMBOL' option is causing a pain when the object file,
1302 containing the definition of __wrap_SYMBOL, includes a direct
1303 call to SYMBOL as well. Since both __wrap_SYMBOL and SYMBOL reference
1304 the same symbol (which is __wrap_SYMBOL), but still exist as two
1305 different symbols in 'sym_hashes', we don't want to adjust
1306 the global symbol __wrap_SYMBOL twice.
1307 This check is only relevant when symbols are being wrapped. */
1308 if (link_info->wrap_hash != NULL)
1310 struct elf_link_hash_entry **cur_sym_hashes;
1312 /* Loop only over the symbols whom been already checked. */
1313 for (cur_sym_hashes = start_hashes; cur_sym_hashes < sym_hashes;
1314 cur_sym_hashes++)
1315 /* If the current symbol is identical to 'sym_hash', that means
1316 the symbol was already adjusted (or at least checked). */
1317 if (*cur_sym_hashes == sym_hash)
1318 break;
1320 /* Don't adjust the symbol again. */
1321 if (cur_sym_hashes < sym_hashes)
1322 continue;
1325 if ((sym_hash->root.type == bfd_link_hash_defined
1326 || sym_hash->root.type == bfd_link_hash_defweak)
1327 && sym_hash->root.u.def.section == sec
1328 && sym_hash->root.u.def.value > addr
1329 && sym_hash->root.u.def.value < toaddr)
1330 sym_hash->root.u.def.value -= count;
1333 return TRUE;
1336 /* Relocate a CR16 ELF section. */
1338 static bfd_boolean
1339 elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1340 bfd *input_bfd, asection *input_section,
1341 bfd_byte *contents, Elf_Internal_Rela *relocs,
1342 Elf_Internal_Sym *local_syms,
1343 asection **local_sections)
1345 Elf_Internal_Shdr *symtab_hdr;
1346 struct elf_link_hash_entry **sym_hashes;
1347 Elf_Internal_Rela *rel, *relend;
1349 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1350 sym_hashes = elf_sym_hashes (input_bfd);
1352 rel = relocs;
1353 relend = relocs + input_section->reloc_count;
1354 for (; rel < relend; rel++)
1356 int r_type;
1357 reloc_howto_type *howto;
1358 unsigned long r_symndx;
1359 Elf_Internal_Sym *sym;
1360 asection *sec;
1361 struct elf_link_hash_entry *h;
1362 bfd_vma relocation;
1363 bfd_reloc_status_type r;
1365 r_symndx = ELF32_R_SYM (rel->r_info);
1366 r_type = ELF32_R_TYPE (rel->r_info);
1367 howto = cr16_elf_howto_table + (r_type);
1369 h = NULL;
1370 sym = NULL;
1371 sec = NULL;
1372 if (r_symndx < symtab_hdr->sh_info)
1374 sym = local_syms + r_symndx;
1375 sec = local_sections[r_symndx];
1376 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1378 else
1380 bfd_boolean unresolved_reloc, warned, ignored;
1382 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1383 r_symndx, symtab_hdr, sym_hashes,
1384 h, sec, relocation,
1385 unresolved_reloc, warned, ignored);
1388 if (sec != NULL && discarded_section (sec))
1389 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1390 rel, 1, relend, howto, 0, contents);
1392 if (bfd_link_relocatable (info))
1393 continue;
1395 r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd,
1396 input_section,
1397 contents, rel->r_offset,
1398 relocation, rel->r_addend,
1399 (struct elf_link_hash_entry *) h,
1400 r_symndx,
1401 info, sec, h == NULL);
1403 if (r != bfd_reloc_ok)
1405 const char *name;
1406 const char *msg = NULL;
1408 if (h != NULL)
1409 name = h->root.root.string;
1410 else
1412 name = (bfd_elf_string_from_elf_section
1413 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1414 if (name == NULL || *name == '\0')
1415 name = bfd_section_name (sec);
1418 switch (r)
1420 case bfd_reloc_overflow:
1421 (*info->callbacks->reloc_overflow)
1422 (info, (h ? &h->root : NULL), name, howto->name,
1423 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1424 break;
1426 case bfd_reloc_undefined:
1427 (*info->callbacks->undefined_symbol)
1428 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1429 break;
1431 case bfd_reloc_outofrange:
1432 msg = _("internal error: out of range error");
1433 goto common_error;
1435 case bfd_reloc_notsupported:
1436 msg = _("internal error: unsupported relocation error");
1437 goto common_error;
1439 case bfd_reloc_dangerous:
1440 msg = _("internal error: dangerous error");
1441 goto common_error;
1443 default:
1444 msg = _("internal error: unknown error");
1445 /* Fall through. */
1447 common_error:
1448 (*info->callbacks->warning) (info, msg, name, input_bfd,
1449 input_section, rel->r_offset);
1450 break;
1455 return TRUE;
1458 /* This is a version of bfd_generic_get_relocated_section_contents
1459 which uses elf32_cr16_relocate_section. */
1461 static bfd_byte *
1462 elf32_cr16_get_relocated_section_contents (bfd *output_bfd,
1463 struct bfd_link_info *link_info,
1464 struct bfd_link_order *link_order,
1465 bfd_byte *data,
1466 bfd_boolean relocatable,
1467 asymbol **symbols)
1469 Elf_Internal_Shdr *symtab_hdr;
1470 asection *input_section = link_order->u.indirect.section;
1471 bfd *input_bfd = input_section->owner;
1472 asection **sections = NULL;
1473 Elf_Internal_Rela *internal_relocs = NULL;
1474 Elf_Internal_Sym *isymbuf = NULL;
1476 /* We only need to handle the case of relaxing, or of having a
1477 particular set of section contents, specially. */
1478 if (relocatable
1479 || elf_section_data (input_section)->this_hdr.contents == NULL)
1480 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1481 link_order, data,
1482 relocatable,
1483 symbols);
1485 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1487 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1488 (size_t) input_section->size);
1490 if ((input_section->flags & SEC_RELOC) != 0
1491 && input_section->reloc_count > 0)
1493 Elf_Internal_Sym *isym;
1494 Elf_Internal_Sym *isymend;
1495 asection **secpp;
1496 bfd_size_type amt;
1498 internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
1499 NULL, NULL, FALSE);
1500 if (internal_relocs == NULL)
1501 goto error_return;
1503 if (symtab_hdr->sh_info != 0)
1505 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1506 if (isymbuf == NULL)
1507 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1508 symtab_hdr->sh_info, 0,
1509 NULL, NULL, NULL);
1510 if (isymbuf == NULL)
1511 goto error_return;
1514 amt = symtab_hdr->sh_info;
1515 amt *= sizeof (asection *);
1516 sections = bfd_malloc (amt);
1517 if (sections == NULL && amt != 0)
1518 goto error_return;
1520 isymend = isymbuf + symtab_hdr->sh_info;
1521 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1523 asection *isec;
1525 if (isym->st_shndx == SHN_UNDEF)
1526 isec = bfd_und_section_ptr;
1527 else if (isym->st_shndx == SHN_ABS)
1528 isec = bfd_abs_section_ptr;
1529 else if (isym->st_shndx == SHN_COMMON)
1530 isec = bfd_com_section_ptr;
1531 else
1532 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1534 *secpp = isec;
1537 if (! elf32_cr16_relocate_section (output_bfd, link_info, input_bfd,
1538 input_section, data, internal_relocs,
1539 isymbuf, sections))
1540 goto error_return;
1542 free (sections);
1543 if (symtab_hdr->contents != (unsigned char *) isymbuf)
1544 free (isymbuf);
1545 if (elf_section_data (input_section)->relocs != internal_relocs)
1546 free (internal_relocs);
1549 return data;
1551 error_return:
1552 free (sections);
1553 if (symtab_hdr->contents != (unsigned char *) isymbuf)
1554 free (isymbuf);
1555 if (elf_section_data (input_section)->relocs != internal_relocs)
1556 free (internal_relocs);
1557 return NULL;
1560 /* Assorted hash table functions. */
1562 /* Initialize an entry in the link hash table. */
1564 /* Create an entry in an CR16 ELF linker hash table. */
1566 static struct bfd_hash_entry *
1567 elf32_cr16_link_hash_newfunc (struct bfd_hash_entry *entry,
1568 struct bfd_hash_table *table,
1569 const char *string)
1571 struct elf32_cr16_link_hash_entry *ret =
1572 (struct elf32_cr16_link_hash_entry *) entry;
1574 /* Allocate the structure if it has not already been allocated by a
1575 subclass. */
1576 if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
1577 ret = ((struct elf32_cr16_link_hash_entry *)
1578 bfd_hash_allocate (table,
1579 sizeof (struct elf32_cr16_link_hash_entry)));
1580 if (ret == (struct elf32_cr16_link_hash_entry *) NULL)
1581 return (struct bfd_hash_entry *) ret;
1583 /* Call the allocation method of the superclass. */
1584 ret = ((struct elf32_cr16_link_hash_entry *)
1585 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1586 table, string));
1587 if (ret != (struct elf32_cr16_link_hash_entry *) NULL)
1589 ret->direct_calls = 0;
1590 ret->stack_size = 0;
1591 ret->movm_args = 0;
1592 ret->movm_stack_size = 0;
1593 ret->flags = 0;
1594 ret->value = 0;
1597 return (struct bfd_hash_entry *) ret;
1600 /* Create an cr16 ELF linker hash table. */
1602 static struct bfd_link_hash_table *
1603 elf32_cr16_link_hash_table_create (bfd *abfd)
1605 struct elf_link_hash_table *ret;
1606 size_t amt = sizeof (struct elf_link_hash_table);
1608 ret = (struct elf_link_hash_table *) bfd_zmalloc (amt);
1609 if (ret == (struct elf_link_hash_table *) NULL)
1610 return NULL;
1612 if (!_bfd_elf_link_hash_table_init (ret, abfd,
1613 elf32_cr16_link_hash_newfunc,
1614 sizeof (struct elf32_cr16_link_hash_entry),
1615 GENERIC_ELF_DATA))
1617 free (ret);
1618 return NULL;
1621 return &ret->root;
1624 static unsigned long
1625 elf_cr16_mach (flagword flags)
1627 switch (flags)
1629 case EM_CR16:
1630 default:
1631 return bfd_mach_cr16;
1635 /* The final processing done just before writing out a CR16 ELF object
1636 file. This gets the CR16 architecture right based on the machine
1637 number. */
1639 static bfd_boolean
1640 _bfd_cr16_elf_final_write_processing (bfd *abfd)
1642 unsigned long val;
1643 switch (bfd_get_mach (abfd))
1645 default:
1646 case bfd_mach_cr16:
1647 val = EM_CR16;
1648 break;
1650 elf_elfheader (abfd)->e_flags |= val;
1651 return _bfd_elf_final_write_processing (abfd);
1655 static bfd_boolean
1656 _bfd_cr16_elf_object_p (bfd *abfd)
1658 bfd_default_set_arch_mach (abfd, bfd_arch_cr16,
1659 elf_cr16_mach (elf_elfheader (abfd)->e_flags));
1660 return TRUE;
1663 /* Merge backend specific data from an object file to the output
1664 object file when linking. */
1666 static bfd_boolean
1667 _bfd_cr16_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
1669 bfd *obfd = info->output_bfd;
1671 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1672 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1673 return TRUE;
1675 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1676 && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
1678 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
1679 bfd_get_mach (ibfd)))
1680 return FALSE;
1683 return TRUE;
1687 /* This function handles relaxing for the CR16.
1689 There's quite a few relaxing opportunites available on the CR16:
1691 * bcond:24 -> bcond:16 1 byte
1692 * bcond:16 -> bcond:8 1 byte
1693 * arithmetic imm32 -> arithmetic imm20 12 bits
1694 * arithmetic imm20/imm16 -> arithmetic imm4 12/16 bits
1696 Symbol- and reloc-reading infrastructure copied from elf-m10200.c. */
1698 static bfd_boolean
1699 elf32_cr16_relax_section (bfd *abfd, asection *sec,
1700 struct bfd_link_info *link_info, bfd_boolean *again)
1702 Elf_Internal_Shdr *symtab_hdr;
1703 Elf_Internal_Rela *internal_relocs;
1704 Elf_Internal_Rela *irel, *irelend;
1705 bfd_byte *contents = NULL;
1706 Elf_Internal_Sym *isymbuf = NULL;
1708 /* Assume nothing changes. */
1709 *again = FALSE;
1711 /* We don't have to do anything for a relocatable link, if
1712 this section does not have relocs, or if this is not a
1713 code section. */
1714 if (bfd_link_relocatable (link_info)
1715 || (sec->flags & SEC_RELOC) == 0
1716 || sec->reloc_count == 0
1717 || (sec->flags & SEC_CODE) == 0)
1718 return TRUE;
1720 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1722 /* Get a copy of the native relocations. */
1723 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
1724 link_info->keep_memory);
1725 if (internal_relocs == NULL)
1726 goto error_return;
1728 /* Walk through them looking for relaxing opportunities. */
1729 irelend = internal_relocs + sec->reloc_count;
1730 for (irel = internal_relocs; irel < irelend; irel++)
1732 bfd_vma symval;
1734 /* If this isn't something that can be relaxed, then ignore
1735 this reloc. */
1736 if (ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP16
1737 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_DISP24
1738 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM32
1739 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM20
1740 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_IMM16)
1741 continue;
1743 /* Get the section contents if we haven't done so already. */
1744 if (contents == NULL)
1746 /* Get cached copy if it exists. */
1747 if (elf_section_data (sec)->this_hdr.contents != NULL)
1748 contents = elf_section_data (sec)->this_hdr.contents;
1749 /* Go get them off disk. */
1750 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1751 goto error_return;
1754 /* Read this BFD's local symbols if we haven't done so already. */
1755 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1757 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1758 if (isymbuf == NULL)
1759 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1760 symtab_hdr->sh_info, 0,
1761 NULL, NULL, NULL);
1762 if (isymbuf == NULL)
1763 goto error_return;
1766 /* Get the value of the symbol referred to by the reloc. */
1767 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1769 /* A local symbol. */
1770 Elf_Internal_Sym *isym;
1771 asection *sym_sec;
1773 isym = isymbuf + ELF32_R_SYM (irel->r_info);
1774 if (isym->st_shndx == SHN_UNDEF)
1775 sym_sec = bfd_und_section_ptr;
1776 else if (isym->st_shndx == SHN_ABS)
1777 sym_sec = bfd_abs_section_ptr;
1778 else if (isym->st_shndx == SHN_COMMON)
1779 sym_sec = bfd_com_section_ptr;
1780 else
1781 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1782 symval = (isym->st_value
1783 + sym_sec->output_section->vma
1784 + sym_sec->output_offset);
1786 else
1788 unsigned long indx;
1789 struct elf_link_hash_entry *h;
1791 /* An external symbol. */
1792 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1793 h = elf_sym_hashes (abfd)[indx];
1794 BFD_ASSERT (h != NULL);
1796 if (h->root.type != bfd_link_hash_defined
1797 && h->root.type != bfd_link_hash_defweak)
1798 /* This appears to be a reference to an undefined
1799 symbol. Just ignore it--it will be caught by the
1800 regular reloc processing. */
1801 continue;
1803 symval = (h->root.u.def.value
1804 + h->root.u.def.section->output_section->vma
1805 + h->root.u.def.section->output_offset);
1808 /* For simplicity of coding, we are going to modify the section
1809 contents, the section relocs, and the BFD symbol table. We
1810 must tell the rest of the code not to free up this
1811 information. It would be possible to instead create a table
1812 of changes which have to be made, as is done in coff-mips.c;
1813 that would be more work, but would require less memory when
1814 the linker is run. */
1816 /* Try to turn a 24 branch/call into a 16bit relative
1817 branch/call. */
1818 if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP24)
1820 bfd_vma value = symval;
1822 /* Deal with pc-relative gunk. */
1823 value -= (sec->output_section->vma + sec->output_offset);
1824 value -= irel->r_offset;
1825 value += irel->r_addend;
1827 /* See if the value will fit in 16 bits, note the high value is
1828 0xfffe + 2 as the target will be two bytes closer if we are
1829 able to relax. */
1830 if ((long) value < 0x10000 && (long) value > -0x10002)
1832 unsigned int code;
1834 /* Get the opcode. */
1835 code = (unsigned int) bfd_get_32 (abfd,
1836 contents + irel->r_offset);
1838 /* Verify it's a 'bcond' and fix the opcode. */
1839 if ((code & 0xffff) == 0x0010)
1840 bfd_put_16 (abfd, 0x1800 | ((0xf & (code >> 20)) << 4),
1841 contents + irel->r_offset);
1842 else
1843 continue;
1845 /* Note that we've changed the relocs, section contents, etc. */
1846 elf_section_data (sec)->relocs = internal_relocs;
1847 elf_section_data (sec)->this_hdr.contents = contents;
1848 symtab_hdr->contents = (unsigned char *) isymbuf;
1850 /* Fix the relocation's type. */
1851 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1852 R_CR16_DISP16);
1854 /* Delete two bytes of data. */
1855 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1856 irel->r_offset + 2, 2))
1857 goto error_return;
1859 /* That will change things, so, we should relax again.
1860 Note that this is not required, and it may be slow. */
1861 *again = TRUE;
1865 /* Try to turn a 16bit pc-relative branch into an
1866 8bit pc-relative branch. */
1867 if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_DISP16)
1869 bfd_vma value = symval;
1871 /* Deal with pc-relative gunk. */
1872 value -= (sec->output_section->vma + sec->output_offset);
1873 value -= irel->r_offset;
1874 value += irel->r_addend;
1876 /* See if the value will fit in 8 bits, note the high value is
1877 0xfc + 2 as the target will be two bytes closer if we are
1878 able to relax. */
1879 /*if ((long) value < 0x1fa && (long) value > -0x100) REVISIT:range */
1880 if ((long) value < 0xfa && (long) value > -0x100)
1882 unsigned short code;
1884 /* Get the opcode. */
1885 code = bfd_get_16 (abfd, contents + irel->r_offset);
1887 /* Verify it's a 'bcond' and fix the opcode. */
1888 if ((code & 0xff0f) == 0x1800)
1889 bfd_put_16 (abfd, (code & 0xf0f0), contents + irel->r_offset);
1890 else
1891 continue;
1893 /* Note that we've changed the relocs, section contents, etc. */
1894 elf_section_data (sec)->relocs = internal_relocs;
1895 elf_section_data (sec)->this_hdr.contents = contents;
1896 symtab_hdr->contents = (unsigned char *) isymbuf;
1898 /* Fix the relocation's type. */
1899 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1900 R_CR16_DISP8);
1902 /* Delete two bytes of data. */
1903 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1904 irel->r_offset + 2, 2))
1905 goto error_return;
1907 /* That will change things, so, we should relax again.
1908 Note that this is not required, and it may be slow. */
1909 *again = TRUE;
1913 /* Try to turn a 32-bit IMM address into a 20/16-bit IMM address */
1914 if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM32)
1916 bfd_vma value = symval;
1917 unsigned short is_add_mov = 0;
1918 bfd_vma value1 = 0;
1920 /* Get the existing value from the mcode */
1921 value1 = bfd_get_32 (abfd, contents + irel->r_offset + 2);
1922 value1 = (value1 >> 16) | ((value1 & 0xffff) << 16);
1924 /* See if the value will fit in 20 bits. */
1925 if ((long) (value + value1) < 0xfffff && (long) (value + value1) > 0)
1927 unsigned short code;
1929 /* Get the opcode. */
1930 code = bfd_get_16 (abfd, contents + irel->r_offset);
1932 /* Verify it's a 'arithmetic ADDD or MOVD instruction'.
1933 For ADDD and MOVD only, convert to IMM32 -> IMM20. */
1935 if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020))
1936 is_add_mov = 1;
1938 if (is_add_mov)
1940 /* Note that we've changed the relocs, section contents,
1941 etc. */
1942 elf_section_data (sec)->relocs = internal_relocs;
1943 elf_section_data (sec)->this_hdr.contents = contents;
1944 symtab_hdr->contents = (unsigned char *) isymbuf;
1946 /* Fix the opcode. */
1947 if ((code & 0xfff0) == 0x0070) /* For movd. */
1948 bfd_put_8 (abfd, 0x05, contents + irel->r_offset + 1);
1949 else /* code == 0x0020 for addd. */
1950 bfd_put_8 (abfd, 0x04, contents + irel->r_offset + 1);
1952 bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset);
1954 /* If existing value is nagavive adjust approriately
1955 place the 16-20bits (ie 4 bit) in new opcode,
1956 as the 0xffffxxxx, the higher 2 byte values removed. */
1957 if (value1 & 0x80000000)
1958 bfd_put_8 (abfd,
1959 (0x0f | (bfd_get_8 (abfd,
1960 contents + irel->r_offset))),
1961 contents + irel->r_offset);
1962 else
1963 bfd_put_8 (abfd,
1964 (((value1 >> 16) & 0xf)
1965 | (bfd_get_8 (abfd,
1966 contents + irel->r_offset))),
1967 contents + irel->r_offset);
1969 /* Fix the relocation's type. */
1970 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1971 R_CR16_IMM20);
1973 /* Delete two bytes of data. */
1974 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
1975 irel->r_offset + 2, 2))
1976 goto error_return;
1978 /* That will change things, so, we should relax again.
1979 Note that this is not required, and it may be slow. */
1980 *again = TRUE;
1984 /* See if the value will fit in 16 bits. */
1985 if ((!is_add_mov)
1986 && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0))
1988 unsigned short code;
1990 /* Get the opcode. */
1991 code = bfd_get_16 (abfd, contents + irel->r_offset);
1993 /* Note that we've changed the relocs, section contents, etc. */
1994 elf_section_data (sec)->relocs = internal_relocs;
1995 elf_section_data (sec)->this_hdr.contents = contents;
1996 symtab_hdr->contents = (unsigned char *) isymbuf;
1998 /* Fix the opcode. */
1999 if ((code & 0xf0) == 0x70) /* For movd. */
2000 bfd_put_8 (abfd, 0x54, contents + irel->r_offset + 1);
2001 else if ((code & 0xf0) == 0x20) /* For addd. */
2002 bfd_put_8 (abfd, 0x60, contents + irel->r_offset + 1);
2003 else if ((code & 0xf0) == 0x90) /* For cmpd. */
2004 bfd_put_8 (abfd, 0x56, contents + irel->r_offset + 1);
2005 else
2006 continue;
2008 bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset);
2010 /* If existing value is nagavive adjust approriately
2011 place the 12-16bits (ie 4 bit) in new opcode,
2012 as the 0xfffffxxx, the higher 2 byte values removed. */
2013 if (value1 & 0x80000000)
2014 bfd_put_8 (abfd,
2015 (0x0f | (bfd_get_8 (abfd,
2016 contents + irel->r_offset))),
2017 contents + irel->r_offset);
2018 else
2019 bfd_put_16 (abfd, value1, contents + irel->r_offset + 2);
2022 /* Fix the relocation's type. */
2023 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2024 R_CR16_IMM16);
2026 /* Delete two bytes of data. */
2027 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
2028 irel->r_offset + 2, 2))
2029 goto error_return;
2031 /* That will change things, so, we should relax again.
2032 Note that this is not required, and it may be slow. */
2033 *again = TRUE;
2037 #if 0
2038 /* Try to turn a 16bit immediate address into a 4bit
2039 immediate address. */
2040 if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
2041 || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16))
2043 bfd_vma value = symval;
2044 bfd_vma value1 = 0;
2046 /* Get the existing value from the mcode */
2047 value1 = ((bfd_get_16 (abfd, contents + irel->r_offset + 2) & 0xffff));
2049 if (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20)
2051 value1 |= ((bfd_get_16 (abfd, contents + irel->r_offset + 1)
2052 & 0xf000) << 0x4);
2055 /* See if the value will fit in 4 bits. */
2056 if ((((long) (value + value1)) < 0xf)
2057 && (((long) (value + value1)) > 0))
2059 unsigned short code;
2061 /* Get the opcode. */
2062 code = bfd_get_16 (abfd, contents + irel->r_offset);
2064 /* Note that we've changed the relocs, section contents, etc. */
2065 elf_section_data (sec)->relocs = internal_relocs;
2066 elf_section_data (sec)->this_hdr.contents = contents;
2067 symtab_hdr->contents = (unsigned char *) isymbuf;
2069 /* Fix the opcode. */
2070 if (((code & 0x0f00) == 0x0400) || ((code & 0x0f00) == 0x0500))
2072 if ((code & 0x0f00) == 0x0400) /* For movd imm20. */
2073 bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
2074 else /* For addd imm20. */
2075 bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
2076 bfd_put_8 (abfd, (code & 0xf0) >> 4,
2077 contents + irel->r_offset + 1);
2079 else
2081 if ((code & 0xfff0) == 0x56b0) /* For cmpd imm16. */
2082 bfd_put_8 (abfd, 0x56, contents + irel->r_offset);
2083 else if ((code & 0xfff0) == 0x54b0) /* For movd imm16. */
2084 bfd_put_8 (abfd, 0x54, contents + irel->r_offset);
2085 else if ((code & 0xfff0) == 0x58b0) /* For movb imm16. */
2086 bfd_put_8 (abfd, 0x58, contents + irel->r_offset);
2087 else if ((code & 0xfff0) == 0x5Ab0) /* For movw imm16. */
2088 bfd_put_8 (abfd, 0x5A, contents + irel->r_offset);
2089 else if ((code & 0xfff0) == 0x60b0) /* For addd imm16. */
2090 bfd_put_8 (abfd, 0x60, contents + irel->r_offset);
2091 else if ((code & 0xfff0) == 0x30b0) /* For addb imm16. */
2092 bfd_put_8 (abfd, 0x30, contents + irel->r_offset);
2093 else if ((code & 0xfff0) == 0x2Cb0) /* For addub imm16. */
2094 bfd_put_8 (abfd, 0x2C, contents + irel->r_offset);
2095 else if ((code & 0xfff0) == 0x32b0) /* For adduw imm16. */
2096 bfd_put_8 (abfd, 0x32, contents + irel->r_offset);
2097 else if ((code & 0xfff0) == 0x38b0) /* For subb imm16. */
2098 bfd_put_8 (abfd, 0x38, contents + irel->r_offset);
2099 else if ((code & 0xfff0) == 0x3Cb0) /* For subcb imm16. */
2100 bfd_put_8 (abfd, 0x3C, contents + irel->r_offset);
2101 else if ((code & 0xfff0) == 0x3Fb0) /* For subcw imm16. */
2102 bfd_put_8 (abfd, 0x3F, contents + irel->r_offset);
2103 else if ((code & 0xfff0) == 0x3Ab0) /* For subw imm16. */
2104 bfd_put_8 (abfd, 0x3A, contents + irel->r_offset);
2105 else if ((code & 0xfff0) == 0x50b0) /* For cmpb imm16. */
2106 bfd_put_8 (abfd, 0x50, contents + irel->r_offset);
2107 else if ((code & 0xfff0) == 0x52b0) /* For cmpw imm16. */
2108 bfd_put_8 (abfd, 0x52, contents + irel->r_offset);
2109 else
2110 continue;
2112 bfd_put_8 (abfd, (code & 0xf), contents + irel->r_offset + 1);
2115 /* Fix the relocation's type. */
2116 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2117 R_CR16_IMM4);
2119 /* Delete two bytes of data. */
2120 if (!elf32_cr16_relax_delete_bytes (link_info, abfd, sec,
2121 irel->r_offset + 2, 2))
2122 goto error_return;
2124 /* That will change things, so, we should relax again.
2125 Note that this is not required, and it may be slow. */
2126 *again = TRUE;
2129 #endif
2132 if (isymbuf != NULL
2133 && symtab_hdr->contents != (unsigned char *) isymbuf)
2135 if (! link_info->keep_memory)
2136 free (isymbuf);
2137 else
2138 /* Cache the symbols for elf_link_input_bfd. */
2139 symtab_hdr->contents = (unsigned char *) isymbuf;
2142 if (contents != NULL
2143 && elf_section_data (sec)->this_hdr.contents != contents)
2145 if (! link_info->keep_memory)
2146 free (contents);
2147 else
2148 /* Cache the section contents for elf_link_input_bfd. */
2149 elf_section_data (sec)->this_hdr.contents = contents;
2153 if (elf_section_data (sec)->relocs != internal_relocs)
2154 free (internal_relocs);
2156 return TRUE;
2158 error_return:
2159 if (symtab_hdr->contents != (unsigned char *) isymbuf)
2160 free (isymbuf);
2161 if (elf_section_data (sec)->this_hdr.contents != contents)
2162 free (contents);
2163 if (elf_section_data (sec)->relocs != internal_relocs)
2164 free (internal_relocs);
2166 return FALSE;
2169 static asection *
2170 elf32_cr16_gc_mark_hook (asection *sec,
2171 struct bfd_link_info *info,
2172 Elf_Internal_Rela *rel,
2173 struct elf_link_hash_entry *h,
2174 Elf_Internal_Sym *sym)
2176 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2179 /* Create dynamic sections when linking against a dynamic object. */
2181 static bfd_boolean
2182 _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2184 flagword flags;
2185 asection * s;
2186 const struct elf_backend_data * bed = get_elf_backend_data (abfd);
2187 struct elf_link_hash_table *htab = elf_hash_table (info);
2188 int ptralign = 0;
2190 switch (bed->s->arch_size)
2192 case 16:
2193 ptralign = 1;
2194 break;
2196 case 32:
2197 ptralign = 2;
2198 break;
2200 default:
2201 bfd_set_error (bfd_error_bad_value);
2202 return FALSE;
2205 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2206 .rel[a].bss sections. */
2208 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2209 | SEC_LINKER_CREATED);
2211 s = bfd_make_section_anyway_with_flags (abfd,
2212 (bed->default_use_rela_p
2213 ? ".rela.plt" : ".rel.plt"),
2214 flags | SEC_READONLY);
2215 htab->srelplt = s;
2216 if (s == NULL
2217 || !bfd_set_section_alignment (s, ptralign))
2218 return FALSE;
2220 if (! _bfd_cr16_elf_create_got_section (abfd, info))
2221 return FALSE;
2223 if (bed->want_dynbss)
2225 /* The .dynbss section is a place to put symbols which are defined
2226 by dynamic objects, are referenced by regular objects, and are
2227 not functions. We must allocate space for them in the process
2228 image and use a R_*_COPY reloc to tell the dynamic linker to
2229 initialize them at run time. The linker script puts the .dynbss
2230 section into the .bss section of the final image. */
2231 s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
2232 SEC_ALLOC | SEC_LINKER_CREATED);
2233 if (s == NULL)
2234 return FALSE;
2236 /* The .rel[a].bss section holds copy relocs. This section is not
2237 normally needed. We need to create it here, though, so that the
2238 linker will map it to an output section. We can't just create it
2239 only if we need it, because we will not know whether we need it
2240 until we have seen all the input files, and the first time the
2241 main linker code calls BFD after examining all the input files
2242 (size_dynamic_sections) the input sections have already been
2243 mapped to the output sections. If the section turns out not to
2244 be needed, we can discard it later. We will never need this
2245 section when generating a shared object, since they do not use
2246 copy relocs. */
2247 if (! bfd_link_executable (info))
2249 s = bfd_make_section_anyway_with_flags (abfd,
2250 (bed->default_use_rela_p
2251 ? ".rela.bss" : ".rel.bss"),
2252 flags | SEC_READONLY);
2253 if (s == NULL
2254 || !bfd_set_section_alignment (s, ptralign))
2255 return FALSE;
2259 return TRUE;
2262 /* Adjust a symbol defined by a dynamic object and referenced by a
2263 regular object. The current definition is in some section of the
2264 dynamic object, but we're not including those sections. We have to
2265 change the definition to something the rest of the link can
2266 understand. */
2268 static bfd_boolean
2269 _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
2270 struct elf_link_hash_entry * h)
2272 bfd * dynobj;
2273 asection * s;
2275 dynobj = elf_hash_table (info)->dynobj;
2277 /* Make sure we know what is going on here. */
2278 BFD_ASSERT (dynobj != NULL
2279 && (h->needs_plt
2280 || h->is_weakalias
2281 || (h->def_dynamic
2282 && h->ref_regular
2283 && !h->def_regular)));
2285 /* If this is a function, put it in the procedure linkage table. We
2286 will fill in the contents of the procedure linkage table later,
2287 when we know the address of the .got section. */
2288 if (h->type == STT_FUNC
2289 || h->needs_plt)
2291 if (! bfd_link_executable (info)
2292 && !h->def_dynamic
2293 && !h->ref_dynamic)
2295 /* This case can occur if we saw a PLT reloc in an input
2296 file, but the symbol was never referred to by a dynamic
2297 object. In such a case, we don't actually need to build
2298 a procedure linkage table, and we can just do a REL32
2299 reloc instead. */
2300 BFD_ASSERT (h->needs_plt);
2301 return TRUE;
2304 /* Make sure this symbol is output as a dynamic symbol. */
2305 if (h->dynindx == -1)
2307 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2308 return FALSE;
2311 /* We also need to make an entry in the .got.plt section, which
2312 will be placed in the .got section by the linker script. */
2314 s = elf_hash_table (info)->sgotplt;
2315 BFD_ASSERT (s != NULL);
2316 s->size += 4;
2318 /* We also need to make an entry in the .rela.plt section. */
2320 s = elf_hash_table (info)->srelplt;
2321 BFD_ASSERT (s != NULL);
2322 s->size += sizeof (Elf32_External_Rela);
2324 return TRUE;
2327 /* If this is a weak symbol, and there is a real definition, the
2328 processor independent code will have arranged for us to see the
2329 real definition first, and we can just use the same value. */
2330 if (h->is_weakalias)
2332 struct elf_link_hash_entry *def = weakdef (h);
2333 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2334 h->root.u.def.section = def->root.u.def.section;
2335 h->root.u.def.value = def->root.u.def.value;
2336 return TRUE;
2339 /* This is a reference to a symbol defined by a dynamic object which
2340 is not a function. */
2342 /* If we are creating a shared library, we must presume that the
2343 only references to the symbol are via the global offset table.
2344 For such cases we need not do anything here; the relocations will
2345 be handled correctly by relocate_section. */
2346 if (bfd_link_executable (info))
2347 return TRUE;
2349 /* If there are no references to this symbol that do not use the
2350 GOT, we don't need to generate a copy reloc. */
2351 if (!h->non_got_ref)
2352 return TRUE;
2354 /* We must allocate the symbol in our .dynbss section, which will
2355 become part of the .bss section of the executable. There will be
2356 an entry for this symbol in the .dynsym section. The dynamic
2357 object will contain position independent code, so all references
2358 from the dynamic object to this symbol will go through the global
2359 offset table. The dynamic linker will use the .dynsym entry to
2360 determine the address it must put in the global offset table, so
2361 both the dynamic object and the regular object will refer to the
2362 same memory location for the variable. */
2364 s = bfd_get_linker_section (dynobj, ".dynbss");
2365 BFD_ASSERT (s != NULL);
2367 /* We must generate a R_CR16_COPY reloc to tell the dynamic linker to
2368 copy the initial value out of the dynamic object and into the
2369 runtime process image. We need to remember the offset into the
2370 .rela.bss section we are going to use. */
2371 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2373 asection * srel;
2375 srel = bfd_get_linker_section (dynobj, ".rela.bss");
2376 BFD_ASSERT (srel != NULL);
2377 srel->size += sizeof (Elf32_External_Rela);
2378 h->needs_copy = 1;
2381 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2384 /* Set the sizes of the dynamic sections. */
2386 static bfd_boolean
2387 _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
2388 struct bfd_link_info * info)
2390 bfd * dynobj;
2391 asection * s;
2392 bfd_boolean relocs;
2394 dynobj = elf_hash_table (info)->dynobj;
2395 BFD_ASSERT (dynobj != NULL);
2397 if (elf_hash_table (info)->dynamic_sections_created)
2399 /* Set the contents of the .interp section to the interpreter. */
2400 if (bfd_link_executable (info) && !info->nointerp)
2402 #if 0
2403 s = bfd_get_linker_section (dynobj, ".interp");
2404 BFD_ASSERT (s != NULL);
2405 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2406 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2407 #endif
2410 else
2412 /* We may have created entries in the .rela.got section.
2413 However, if we are not creating the dynamic sections, we will
2414 not actually use these entries. Reset the size of .rela.got,
2415 which will cause it to get stripped from the output file
2416 below. */
2417 s = elf_hash_table (info)->srelgot;
2418 if (s != NULL)
2419 s->size = 0;
2422 /* The check_relocs and adjust_dynamic_symbol entry points have
2423 determined the sizes of the various dynamic sections. Allocate
2424 memory for them. */
2425 relocs = FALSE;
2426 for (s = dynobj->sections; s != NULL; s = s->next)
2428 const char * name;
2430 if ((s->flags & SEC_LINKER_CREATED) == 0)
2431 continue;
2433 /* It's OK to base decisions on the section name, because none
2434 of the dynobj section names depend upon the input files. */
2435 name = bfd_section_name (s);
2437 if (strcmp (name, ".plt") == 0)
2439 /* Remember whether there is a PLT. */
2442 else if (CONST_STRNEQ (name, ".rela"))
2444 if (s->size != 0)
2446 /* Remember whether there are any reloc sections other
2447 than .rela.plt. */
2448 if (strcmp (name, ".rela.plt") != 0)
2449 relocs = TRUE;
2451 /* We use the reloc_count field as a counter if we need
2452 to copy relocs into the output file. */
2453 s->reloc_count = 0;
2456 else if (! CONST_STRNEQ (name, ".got")
2457 && strcmp (name, ".dynbss") != 0)
2458 /* It's not one of our sections, so don't allocate space. */
2459 continue;
2461 if (s->size == 0)
2463 /* If we don't need this section, strip it from the
2464 output file. This is mostly to handle .rela.bss and
2465 .rela.plt. We must create both sections in
2466 create_dynamic_sections, because they must be created
2467 before the linker maps input sections to output
2468 sections. The linker does that before
2469 adjust_dynamic_symbol is called, and it is that
2470 function which decides whether anything needs to go
2471 into these sections. */
2472 s->flags |= SEC_EXCLUDE;
2473 continue;
2476 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2477 continue;
2479 /* Allocate memory for the section contents. We use bfd_zalloc
2480 here in case unused entries are not reclaimed before the
2481 section's contents are written out. This should not happen,
2482 but this way if it does, we get a R_CR16_NONE reloc
2483 instead of garbage. */
2484 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2485 if (s->contents == NULL)
2486 return FALSE;
2489 return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
2492 /* Finish up dynamic symbol handling. We set the contents of various
2493 dynamic sections here. */
2495 static bfd_boolean
2496 _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd,
2497 struct bfd_link_info * info,
2498 struct elf_link_hash_entry * h,
2499 Elf_Internal_Sym * sym)
2501 bfd * dynobj;
2503 dynobj = elf_hash_table (info)->dynobj;
2505 if (h->got.offset != (bfd_vma) -1)
2507 asection * sgot;
2508 asection * srel;
2509 Elf_Internal_Rela rel;
2511 /* This symbol has an entry in the global offset table. Set it up. */
2513 sgot = elf_hash_table (info)->sgot;
2514 srel = elf_hash_table (info)->srelgot;
2515 BFD_ASSERT (sgot != NULL && srel != NULL);
2517 rel.r_offset = (sgot->output_section->vma
2518 + sgot->output_offset
2519 + (h->got.offset & ~1));
2521 /* If this is a -Bsymbolic link, and the symbol is defined
2522 locally, we just want to emit a RELATIVE reloc. Likewise if
2523 the symbol was forced to be local because of a version file.
2524 The entry in the global offset table will already have been
2525 initialized in the relocate_section function. */
2526 if (bfd_link_executable (info)
2527 && (info->symbolic || h->dynindx == -1)
2528 && h->def_regular)
2530 rel.r_info = ELF32_R_INFO (0, R_CR16_GOT_REGREL20);
2531 rel.r_addend = (h->root.u.def.value
2532 + h->root.u.def.section->output_section->vma
2533 + h->root.u.def.section->output_offset);
2535 else
2537 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2538 rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
2539 rel.r_addend = 0;
2542 bfd_elf32_swap_reloca_out (output_bfd, &rel,
2543 (bfd_byte *) ((Elf32_External_Rela *) srel->contents
2544 + srel->reloc_count));
2545 ++ srel->reloc_count;
2548 if (h->needs_copy)
2550 asection * s;
2551 Elf_Internal_Rela rel;
2553 /* This symbol needs a copy reloc. Set it up. */
2554 BFD_ASSERT (h->dynindx != -1
2555 && (h->root.type == bfd_link_hash_defined
2556 || h->root.type == bfd_link_hash_defweak));
2558 s = bfd_get_linker_section (dynobj, ".rela.bss");
2559 BFD_ASSERT (s != NULL);
2561 rel.r_offset = (h->root.u.def.value
2562 + h->root.u.def.section->output_section->vma
2563 + h->root.u.def.section->output_offset);
2564 rel.r_info = ELF32_R_INFO (h->dynindx, R_CR16_GOT_REGREL20);
2565 rel.r_addend = 0;
2566 bfd_elf32_swap_reloca_out (output_bfd, &rel,
2567 (bfd_byte *) ((Elf32_External_Rela *) s->contents
2568 + s->reloc_count));
2569 ++ s->reloc_count;
2572 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2573 if (h == elf_hash_table (info)->hdynamic
2574 || h == elf_hash_table (info)->hgot)
2575 sym->st_shndx = SHN_ABS;
2577 return TRUE;
2580 /* Finish up the dynamic sections. */
2582 static bfd_boolean
2583 _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
2584 struct bfd_link_info * info)
2586 bfd * dynobj;
2587 asection * sgot;
2588 asection * sdyn;
2590 dynobj = elf_hash_table (info)->dynobj;
2592 sgot = elf_hash_table (info)->sgotplt;
2593 BFD_ASSERT (sgot != NULL);
2594 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
2596 if (elf_hash_table (info)->dynamic_sections_created)
2598 Elf32_External_Dyn * dyncon;
2599 Elf32_External_Dyn * dynconend;
2601 BFD_ASSERT (sdyn != NULL);
2603 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2604 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
2606 for (; dyncon < dynconend; dyncon++)
2608 Elf_Internal_Dyn dyn;
2609 asection * s;
2611 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2613 switch (dyn.d_tag)
2615 default:
2616 break;
2618 case DT_PLTGOT:
2619 s = elf_hash_table (info)->sgotplt;
2620 goto get_vma;
2622 case DT_JMPREL:
2623 s = elf_hash_table (info)->srelplt;
2624 get_vma:
2625 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2626 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2627 break;
2629 case DT_PLTRELSZ:
2630 s = elf_hash_table (info)->srelplt;
2631 dyn.d_un.d_val = s->size;
2632 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2633 break;
2639 /* Fill in the first three entries in the global offset table. */
2640 if (sgot->size > 0)
2642 if (sdyn == NULL)
2643 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2644 else
2645 bfd_put_32 (output_bfd,
2646 sdyn->output_section->vma + sdyn->output_offset,
2647 sgot->contents);
2650 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2652 return TRUE;
2655 /* Given a .data.rel section and a .emreloc in-memory section, store
2656 relocation information into the .emreloc section which can be
2657 used at runtime to relocate the section. This is called by the
2658 linker when the --embedded-relocs switch is used. This is called
2659 after the add_symbols entry point has been called for all the
2660 objects, and before the final_link entry point is called. */
2662 bfd_boolean
2663 bfd_cr16_elf32_create_embedded_relocs (bfd *abfd,
2664 struct bfd_link_info *info,
2665 asection *datasec,
2666 asection *relsec,
2667 char **errmsg)
2669 Elf_Internal_Shdr *symtab_hdr;
2670 Elf_Internal_Sym *isymbuf = NULL;
2671 Elf_Internal_Rela *internal_relocs = NULL;
2672 Elf_Internal_Rela *irel, *irelend;
2673 bfd_byte *p;
2674 bfd_size_type amt;
2676 BFD_ASSERT (! bfd_link_relocatable (info));
2678 *errmsg = NULL;
2680 if (datasec->reloc_count == 0)
2681 return TRUE;
2683 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2685 /* Get a copy of the native relocations. */
2686 internal_relocs = (_bfd_elf_link_read_relocs
2687 (abfd, datasec, NULL, NULL, info->keep_memory));
2688 if (internal_relocs == NULL)
2689 goto error_return;
2691 amt = (bfd_size_type) datasec->reloc_count * 8;
2692 relsec->contents = (bfd_byte *) bfd_alloc (abfd, amt);
2693 if (relsec->contents == NULL)
2694 goto error_return;
2696 p = relsec->contents;
2698 irelend = internal_relocs + datasec->reloc_count;
2699 for (irel = internal_relocs; irel < irelend; irel++, p += 8)
2701 asection *targetsec;
2703 /* We are going to write a four byte longword into the runtime
2704 reloc section. The longword will be the address in the data
2705 section which must be relocated. It is followed by the name
2706 of the target section NUL-padded or truncated to 8
2707 characters. */
2709 /* We can only relocate absolute longword relocs at run time. */
2710 if (!((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
2711 || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32)))
2713 *errmsg = _("unsupported relocation type");
2714 bfd_set_error (bfd_error_bad_value);
2715 goto error_return;
2718 /* Get the target section referred to by the reloc. */
2719 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2721 /* A local symbol. */
2722 Elf_Internal_Sym *isym;
2724 /* Read this BFD's local symbols if we haven't done so already. */
2725 if (isymbuf == NULL)
2727 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2728 if (isymbuf == NULL)
2729 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2730 symtab_hdr->sh_info, 0,
2731 NULL, NULL, NULL);
2732 if (isymbuf == NULL)
2733 goto error_return;
2736 isym = isymbuf + ELF32_R_SYM (irel->r_info);
2737 targetsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2739 else
2741 unsigned long indx;
2742 struct elf_link_hash_entry *h;
2744 /* An external symbol. */
2745 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2746 h = elf_sym_hashes (abfd)[indx];
2747 BFD_ASSERT (h != NULL);
2748 if (h->root.type == bfd_link_hash_defined
2749 || h->root.type == bfd_link_hash_defweak)
2750 targetsec = h->root.u.def.section;
2751 else
2752 targetsec = NULL;
2755 bfd_put_32 (abfd, irel->r_offset + datasec->output_offset, p);
2756 memset (p + 4, 0, 4);
2757 if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_NUM32a)
2758 && (targetsec != NULL) )
2759 strncpy ((char *) p + 4, targetsec->output_section->name, 4);
2762 if (symtab_hdr->contents != (unsigned char *) isymbuf)
2763 free (isymbuf);
2764 if (elf_section_data (datasec)->relocs != internal_relocs)
2765 free (internal_relocs);
2766 return TRUE;
2768 error_return:
2769 if (symtab_hdr->contents != (unsigned char *) isymbuf)
2770 free (isymbuf);
2771 if (elf_section_data (datasec)->relocs != internal_relocs)
2772 free (internal_relocs);
2773 return FALSE;
2777 /* Classify relocation types, such that combreloc can sort them
2778 properly. */
2780 static enum elf_reloc_type_class
2781 _bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2782 const asection *rel_sec ATTRIBUTE_UNUSED,
2783 const Elf_Internal_Rela *rela)
2785 switch ((int) ELF32_R_TYPE (rela->r_info))
2787 case R_CR16_GOT_REGREL20:
2788 case R_CR16_GOTC_REGREL20:
2789 return reloc_class_relative;
2790 default:
2791 return reloc_class_normal;
2795 /* Definitions for setting CR16 target vector. */
2796 #define TARGET_LITTLE_SYM cr16_elf32_vec
2797 #define TARGET_LITTLE_NAME "elf32-cr16"
2798 #define ELF_ARCH bfd_arch_cr16
2799 #define ELF_MACHINE_CODE EM_CR16
2800 #define ELF_MACHINE_ALT1 EM_CR16_OLD
2801 #define ELF_MAXPAGESIZE 0x1
2802 #define elf_symbol_leading_char '_'
2804 #define bfd_elf32_bfd_reloc_type_lookup elf_cr16_reloc_type_lookup
2805 #define bfd_elf32_bfd_reloc_name_lookup elf_cr16_reloc_name_lookup
2806 #define elf_info_to_howto elf_cr16_info_to_howto
2807 #define elf_info_to_howto_rel NULL
2808 #define elf_backend_relocate_section elf32_cr16_relocate_section
2809 #define bfd_elf32_bfd_relax_section elf32_cr16_relax_section
2810 #define bfd_elf32_bfd_get_relocated_section_contents \
2811 elf32_cr16_get_relocated_section_contents
2812 #define elf_backend_gc_mark_hook elf32_cr16_gc_mark_hook
2813 #define elf_backend_can_gc_sections 1
2814 #define elf_backend_rela_normal 1
2815 #define elf_backend_check_relocs cr16_elf_check_relocs
2816 /* So we can set bits in e_flags. */
2817 #define elf_backend_final_write_processing \
2818 _bfd_cr16_elf_final_write_processing
2819 #define elf_backend_object_p _bfd_cr16_elf_object_p
2821 #define bfd_elf32_bfd_merge_private_bfd_data \
2822 _bfd_cr16_elf_merge_private_bfd_data
2825 #define bfd_elf32_bfd_link_hash_table_create \
2826 elf32_cr16_link_hash_table_create
2828 #define elf_backend_create_dynamic_sections \
2829 _bfd_cr16_elf_create_dynamic_sections
2830 #define elf_backend_adjust_dynamic_symbol \
2831 _bfd_cr16_elf_adjust_dynamic_symbol
2832 #define elf_backend_size_dynamic_sections \
2833 _bfd_cr16_elf_size_dynamic_sections
2834 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
2835 #define elf_backend_finish_dynamic_symbol \
2836 _bfd_cr16_elf_finish_dynamic_symbol
2837 #define elf_backend_finish_dynamic_sections \
2838 _bfd_cr16_elf_finish_dynamic_sections
2840 #define elf_backend_reloc_type_class _bfd_cr16_elf_reloc_type_class
2843 #define elf_backend_want_got_plt 1
2844 #define elf_backend_plt_readonly 1
2845 #define elf_backend_want_plt_sym 0
2846 #define elf_backend_got_header_size 12
2847 #define elf_backend_dtrel_excludes_plt 1
2849 #include "elf32-target.h"