1 /* IQ2000-specific support for 32-bit ELF.
2 Copyright (C) 2003, 2004 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 #include "elf/iq2000.h"
26 /* Forward declarations. */
28 /* Private relocation functions. */
29 static bfd_reloc_status_type iq2000_elf_relocate_hi16
PARAMS ((bfd
*, Elf_Internal_Rela
*, bfd_byte
*, bfd_vma
));
30 static reloc_howto_type
* iq2000_reloc_type_lookup
PARAMS ((bfd
*, bfd_reloc_code_real_type
));
31 static void iq2000_info_to_howto_rela
PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
32 static bfd_boolean iq2000_elf_relocate_section
PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
33 static bfd_reloc_status_type iq2000_final_link_relocate
PARAMS ((reloc_howto_type
*, bfd
*, asection
*, bfd_byte
*, Elf_Internal_Rela
*, bfd_vma
));
34 static bfd_boolean iq2000_elf_gc_sweep_hook
PARAMS ((bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*));
35 static asection
* iq2000_elf_gc_mark_hook
PARAMS ((asection
*sec
, struct bfd_link_info
*, Elf_Internal_Rela
*, struct elf_link_hash_entry
*, Elf_Internal_Sym
*));
36 static reloc_howto_type
* iq2000_reloc_type_lookup
PARAMS ((bfd
*, bfd_reloc_code_real_type
));
37 static int elf32_iq2000_machine
PARAMS ((bfd
*));
38 static bfd_boolean iq2000_elf_object_p
PARAMS ((bfd
*));
39 static bfd_boolean iq2000_elf_set_private_flags
PARAMS ((bfd
*, flagword
));
40 static bfd_boolean iq2000_elf_copy_private_bfd_data
PARAMS ((bfd
*, bfd
*));
41 static bfd_boolean iq2000_elf_merge_private_bfd_data
PARAMS ((bfd
*, bfd
*));
42 static bfd_boolean iq2000_elf_print_private_bfd_data
PARAMS ((bfd
*, PTR
));
43 static bfd_boolean iq2000_elf_check_relocs
PARAMS ((bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*));
44 static bfd_reloc_status_type iq2000_elf_howto_hi16_reloc
PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
47 static reloc_howto_type iq2000_elf_howto_table
[] =
49 /* This reloc does nothing. */
51 HOWTO (R_IQ2000_NONE
, /* type */
53 2, /* size (0 = byte, 1 = short, 2 = long) */
55 FALSE
, /* pc_relative */
57 complain_overflow_bitfield
, /* complain_on_overflow */
58 bfd_elf_generic_reloc
, /* special_function */
59 "R_IQ2000_NONE", /* name */
60 FALSE
, /* partial_inplace */
63 FALSE
), /* pcrel_offset */
65 /* A 16 bit absolute relocation. */
66 HOWTO (R_IQ2000_16
, /* type */
68 1, /* size (0 = byte, 1 = short, 2 = long) */
70 FALSE
, /* pc_relative */
72 complain_overflow_bitfield
, /* complain_on_overflow */
73 bfd_elf_generic_reloc
, /* special_function */
74 "R_IQ2000_16", /* name */
75 FALSE
, /* partial_inplace */
76 0x0000, /* src_mask */
77 0xffff, /* dst_mask */
78 FALSE
), /* pcrel_offset */
80 /* A 32 bit absolute relocation. */
81 HOWTO (R_IQ2000_32
, /* type */
83 2, /* size (0 = byte, 1 = short, 2 = long) */
85 FALSE
, /* pc_relative */
87 complain_overflow_bitfield
, /* complain_on_overflow */
88 bfd_elf_generic_reloc
, /* special_function */
89 "R_IQ2000_32", /* name */
90 FALSE
, /* partial_inplace */
91 0x00000000, /* src_mask */
92 0x7fffffff, /* dst_mask */
93 FALSE
), /* pcrel_offset */
95 /* 26 bit branch address. */
96 HOWTO (R_IQ2000_26
, /* type */
98 2, /* size (0 = byte, 1 = short, 2 = long) */
100 FALSE
, /* pc_relative */
102 complain_overflow_dont
, /* complain_on_overflow */
103 /* This needs complex overflow
104 detection, because the upper four
105 bits must match the PC. */
106 bfd_elf_generic_reloc
, /* special_function */
107 "R_IQ2000_26", /* name */
108 FALSE
, /* partial_inplace */
109 0x00000000, /* src_mask */
110 0x03ffffff, /* dst_mask */
111 FALSE
), /* pcrel_offset */
113 /* 16 bit PC relative reference. */
114 HOWTO (R_IQ2000_PC16
, /* type */
116 2, /* size (0 = byte, 1 = short, 2 = long) */
118 TRUE
, /* pc_relative */
120 complain_overflow_signed
, /* complain_on_overflow */
121 bfd_elf_generic_reloc
, /* special_function */
122 "R_IQ2000_PC16", /* name */
123 FALSE
, /* partial_inplace */
124 0x0000, /* src_mask */
125 0xffff, /* dst_mask */
126 TRUE
), /* pcrel_offset */
128 /* high 16 bits of symbol value. */
129 HOWTO (R_IQ2000_HI16
, /* type */
131 2, /* size (0 = byte, 1 = short, 2 = long) */
133 FALSE
, /* pc_relative */
135 complain_overflow_dont
, /* complain_on_overflow */
136 iq2000_elf_howto_hi16_reloc
, /* special_function */
137 "R_IQ2000_HI16", /* name */
138 FALSE
, /* partial_inplace */
139 0x0000, /* src_mask */
140 0x7fff, /* dst_mask */
141 FALSE
), /* pcrel_offset */
143 /* Low 16 bits of symbol value. */
144 HOWTO (R_IQ2000_LO16
, /* type */
146 2, /* size (0 = byte, 1 = short, 2 = long) */
148 FALSE
, /* pc_relative */
150 complain_overflow_dont
, /* complain_on_overflow */
151 bfd_elf_generic_reloc
, /* special_function */
152 "R_IQ2000_LO16", /* name */
153 FALSE
, /* partial_inplace */
154 0x0000, /* src_mask */
155 0xffff, /* dst_mask */
156 FALSE
), /* pcrel_offset */
158 /* 16-bit jump offset. */
159 HOWTO (R_IQ2000_OFFSET_16
, /* type */
161 2, /* size (0 = byte, 1 = short, 2 = long) */
163 FALSE
, /* pc_relative */
165 complain_overflow_dont
, /* complain_on_overflow */
166 bfd_elf_generic_reloc
, /* special_function */
167 "R_IQ2000_OFFSET_16", /* name */
168 FALSE
, /* partial_inplace */
169 0x0000, /* src_mask */
170 0xffff, /* dst_mask */
171 FALSE
), /* pcrel_offset */
173 /* 21-bit jump offset. */
174 HOWTO (R_IQ2000_OFFSET_21
, /* type */
176 2, /* size (0 = byte, 1 = short, 2 = long) */
178 FALSE
, /* pc_relative */
180 complain_overflow_dont
, /* complain_on_overflow */
181 bfd_elf_generic_reloc
, /* special_function */
182 "R_IQ2000_OFFSET_21", /* name */
183 FALSE
, /* partial_inplace */
184 0x000000, /* src_mask */
185 0x1fffff, /* dst_mask */
186 FALSE
), /* pcrel_offset */
188 /* unsigned high 16 bits of value. */
189 HOWTO (R_IQ2000_OFFSET_21
, /* type */
191 2, /* size (0 = byte, 1 = short, 2 = long) */
193 FALSE
, /* pc_relative */
195 complain_overflow_dont
, /* complain_on_overflow */
196 bfd_elf_generic_reloc
, /* special_function */
197 "R_IQ2000_UHI16", /* name */
198 FALSE
, /* partial_inplace */
199 0x0000, /* src_mask */
200 0x7fff, /* dst_mask */
201 FALSE
), /* pcrel_offset */
203 /* A 32 bit absolute debug relocation. */
204 HOWTO (R_IQ2000_32_DEBUG
, /* type */
206 2, /* size (0 = byte, 1 = short, 2 = long) */
208 FALSE
, /* pc_relative */
210 complain_overflow_bitfield
, /* complain_on_overflow */
211 bfd_elf_generic_reloc
, /* special_function */
212 "R_IQ2000_32", /* name */
213 FALSE
, /* partial_inplace */
214 0x00000000, /* src_mask */
215 0xffffffff, /* dst_mask */
216 FALSE
), /* pcrel_offset */
220 /* GNU extension to record C++ vtable hierarchy. */
221 static reloc_howto_type iq2000_elf_vtinherit_howto
=
222 HOWTO (R_IQ2000_GNU_VTINHERIT
, /* type */
224 2, /* size (0 = byte, 1 = short, 2 = long) */
226 FALSE
, /* pc_relative */
228 complain_overflow_dont
, /* complain_on_overflow */
229 NULL
, /* special_function */
230 "R_IQ2000_GNU_VTINHERIT", /* name */
231 FALSE
, /* partial_inplace */
234 FALSE
); /* pcrel_offset */
236 /* GNU extension to record C++ vtable member usage. */
237 static reloc_howto_type iq2000_elf_vtentry_howto
=
238 HOWTO (R_IQ2000_GNU_VTENTRY
, /* type */
240 2, /* size (0 = byte, 1 = short, 2 = long) */
242 FALSE
, /* pc_relative */
244 complain_overflow_dont
, /* complain_on_overflow */
245 NULL
, /* special_function */
246 "R_IQ2000_GNU_VTENTRY", /* name */
247 FALSE
, /* partial_inplace */
250 FALSE
); /* pcrel_offset */
253 /* Map BFD reloc types to IQ2000 ELF reloc types. */
255 struct iq2000_reloc_map
257 bfd_reloc_code_real_type bfd_reloc_val
;
258 unsigned int iq2000_reloc_val
;
261 static const struct iq2000_reloc_map iq2000_reloc_map
[] =
263 { BFD_RELOC_NONE
, R_IQ2000_NONE
},
264 { BFD_RELOC_16
, R_IQ2000_16
},
265 { BFD_RELOC_32
, R_IQ2000_32
},
266 { BFD_RELOC_MIPS_JMP
, R_IQ2000_26
},
267 { BFD_RELOC_16_PCREL_S2
, R_IQ2000_PC16
},
268 { BFD_RELOC_HI16
, R_IQ2000_HI16
},
269 { BFD_RELOC_LO16
, R_IQ2000_LO16
},
270 { BFD_RELOC_IQ2000_OFFSET_16
,R_IQ2000_OFFSET_16
},
271 { BFD_RELOC_IQ2000_OFFSET_21
,R_IQ2000_OFFSET_21
},
272 { BFD_RELOC_IQ2000_UHI16
, R_IQ2000_UHI16
},
273 { BFD_RELOC_VTABLE_INHERIT
, R_IQ2000_GNU_VTINHERIT
},
274 { BFD_RELOC_VTABLE_ENTRY
, R_IQ2000_GNU_VTENTRY
},
277 static bfd_reloc_status_type
278 iq2000_elf_howto_hi16_reloc (abfd
,
285 bfd
*abfd ATTRIBUTE_UNUSED
;
286 arelent
*reloc_entry
;
289 asection
*input_section
;
291 char **error_message ATTRIBUTE_UNUSED
;
293 bfd_reloc_status_type ret
;
296 /* If we're relocating, and this an external symbol, we don't want
297 to change anything. */
298 if (output_bfd
!= (bfd
*) NULL
299 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
300 && reloc_entry
->addend
== 0)
302 reloc_entry
->address
+= input_section
->output_offset
;
306 if (bfd_is_com_section (symbol
->section
))
309 relocation
= symbol
->value
;
311 relocation
+= symbol
->section
->output_section
->vma
;
312 relocation
+= symbol
->section
->output_offset
;
313 relocation
+= reloc_entry
->addend
;
315 /* if %lo will have sign-extension, compensate by add 0x10000 to hi portion */
316 if (relocation
& 0x8000)
317 reloc_entry
->addend
+= 0x10000;
319 /* Now do the reloc in the usual way. */
320 ret
= bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
321 input_section
, output_bfd
, error_message
);
323 /* put it back the way it was */
324 if (relocation
& 0x8000)
325 reloc_entry
->addend
-= 0x10000;
330 static bfd_reloc_status_type
331 iq2000_elf_relocate_hi16 (input_bfd
, relhi
, contents
, value
)
333 Elf_Internal_Rela
*relhi
;
339 insn
= bfd_get_32 (input_bfd
, contents
+ relhi
->r_offset
);
341 value
+= relhi
->r_addend
;
342 value
&= 0x7fffffff; /* mask off top-bit which is Harvard mask bit */
344 /* if top-bit of %lo value is on, this means that %lo will
345 sign-propagate and so we compensate by adding 1 to %hi value */
350 insn
= ((insn
& ~0xFFFF) | value
);
352 bfd_put_32 (input_bfd
, insn
, contents
+ relhi
->r_offset
);
356 static reloc_howto_type
*
357 iq2000_reloc_type_lookup (abfd
, code
)
358 bfd
* abfd ATTRIBUTE_UNUSED
;
359 bfd_reloc_code_real_type code
;
361 /* Note that the iq2000_elf_howto_table is indxed by the R_
362 constants. Thus, the order that the howto records appear in the
363 table *must* match the order of the relocation types defined in
364 include/elf/iq2000.h. */
369 return &iq2000_elf_howto_table
[ (int) R_IQ2000_NONE
];
371 return &iq2000_elf_howto_table
[ (int) R_IQ2000_16
];
373 return &iq2000_elf_howto_table
[ (int) R_IQ2000_32
];
374 case BFD_RELOC_MIPS_JMP
:
375 return &iq2000_elf_howto_table
[ (int) R_IQ2000_26
];
376 case BFD_RELOC_IQ2000_OFFSET_16
:
377 return &iq2000_elf_howto_table
[ (int) R_IQ2000_OFFSET_16
];
378 case BFD_RELOC_IQ2000_OFFSET_21
:
379 return &iq2000_elf_howto_table
[ (int) R_IQ2000_OFFSET_21
];
380 case BFD_RELOC_16_PCREL_S2
:
381 return &iq2000_elf_howto_table
[ (int) R_IQ2000_PC16
];
383 return &iq2000_elf_howto_table
[ (int) R_IQ2000_HI16
];
384 case BFD_RELOC_IQ2000_UHI16
:
385 return &iq2000_elf_howto_table
[ (int) R_IQ2000_UHI16
];
387 return &iq2000_elf_howto_table
[ (int) R_IQ2000_LO16
];
388 case BFD_RELOC_VTABLE_INHERIT
:
389 return &iq2000_elf_vtinherit_howto
;
390 case BFD_RELOC_VTABLE_ENTRY
:
391 return &iq2000_elf_vtentry_howto
;
393 /* Pacify gcc -Wall. */
400 /* Perform a single relocation. By default we use the standard BFD
403 static bfd_reloc_status_type
404 iq2000_final_link_relocate (howto
, input_bfd
, input_section
, contents
, rel
, relocation
)
405 reloc_howto_type
* howto
;
407 asection
* input_section
;
409 Elf_Internal_Rela
* rel
;
412 return _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
413 contents
, rel
->r_offset
,
414 relocation
, rel
->r_addend
);
417 /* Set the howto pointer for a IQ2000 ELF reloc. */
420 iq2000_info_to_howto_rela (abfd
, cache_ptr
, dst
)
421 bfd
* abfd ATTRIBUTE_UNUSED
;
423 Elf_Internal_Rela
* dst
;
427 r_type
= ELF32_R_TYPE (dst
->r_info
);
430 case R_IQ2000_GNU_VTINHERIT
:
431 cache_ptr
->howto
= & iq2000_elf_vtinherit_howto
;
434 case R_IQ2000_GNU_VTENTRY
:
435 cache_ptr
->howto
= & iq2000_elf_vtentry_howto
;
439 cache_ptr
->howto
= & iq2000_elf_howto_table
[r_type
];
444 /* Look through the relocs for a section during the first phase.
445 Since we don't do .gots or .plts, we just need to consider the
446 virtual table relocs for gc. */
449 iq2000_elf_check_relocs (abfd
, info
, sec
, relocs
)
451 struct bfd_link_info
*info
;
453 const Elf_Internal_Rela
*relocs
;
455 Elf_Internal_Shdr
*symtab_hdr
;
456 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
457 const Elf_Internal_Rela
*rel
;
458 const Elf_Internal_Rela
*rel_end
;
459 bfd_boolean changed
= FALSE
;
461 if (info
->relocatable
)
464 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
465 sym_hashes
= elf_sym_hashes (abfd
);
466 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof(Elf32_External_Sym
);
467 if (!elf_bad_symtab (abfd
))
468 sym_hashes_end
-= symtab_hdr
->sh_info
;
470 rel_end
= relocs
+ sec
->reloc_count
;
471 for (rel
= relocs
; rel
< rel_end
; rel
++)
473 struct elf_link_hash_entry
*h
;
474 unsigned long r_symndx
;
476 r_symndx
= ELF32_R_SYM (rel
->r_info
);
477 if (r_symndx
< symtab_hdr
->sh_info
)
480 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
482 switch (ELF32_R_TYPE (rel
->r_info
))
484 /* This relocation describes the C++ object vtable hierarchy.
485 Reconstruct it for later use during GC. */
486 case R_IQ2000_GNU_VTINHERIT
:
487 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
491 /* This relocation describes which C++ vtable entries are actually
492 used. Record for later use during GC. */
493 case R_IQ2000_GNU_VTENTRY
:
494 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
499 /* For debug section, change to special harvard-aware relocations */
500 if (memcmp (sec
->name
, ".debug", 6) == 0
501 || memcmp (sec
->name
, ".stab", 5) == 0
502 || memcmp (sec
->name
, ".eh_frame", 9) == 0)
504 ((Elf_Internal_Rela
*) rel
)->r_info
505 = ELF32_R_INFO (ELF32_R_SYM (rel
->r_info
), R_IQ2000_32_DEBUG
);
513 /* Note that we've changed relocs, otherwise if !info->keep_memory
514 we'll free the relocs and lose our changes. */
515 (const Elf_Internal_Rela
*) (elf_section_data (sec
)->relocs
) = relocs
;
521 /* Relocate a IQ2000 ELF section.
522 There is some attempt to make this function usable for many architectures,
523 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
524 if only to serve as a learning tool.
526 The RELOCATE_SECTION function is called by the new ELF backend linker
527 to handle the relocations for a section.
529 The relocs are always passed as Rela structures; if the section
530 actually uses Rel structures, the r_addend field will always be
533 This function is responsible for adjusting the section contents as
534 necessary, and (if using Rela relocs and generating a relocatable
535 output file) adjusting the reloc addend as necessary.
537 This function does not have to worry about setting the reloc
538 address or the reloc symbol index.
540 LOCAL_SYMS is a pointer to the swapped in local symbols.
542 LOCAL_SECTIONS is an array giving the section in the input file
543 corresponding to the st_shndx field of each local symbol.
545 The global hash table entry for the global symbols can be found
546 via elf_sym_hashes (input_bfd).
548 When generating relocatable output, this function must handle
549 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
550 going to be the section symbol corresponding to the output
551 section, which means that the addend must be adjusted
555 iq2000_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
556 contents
, relocs
, local_syms
, local_sections
)
557 bfd
* output_bfd ATTRIBUTE_UNUSED
;
558 struct bfd_link_info
* info
;
560 asection
* input_section
;
562 Elf_Internal_Rela
* relocs
;
563 Elf_Internal_Sym
* local_syms
;
564 asection
** local_sections
;
566 Elf_Internal_Shdr
* symtab_hdr
;
567 struct elf_link_hash_entry
** sym_hashes
;
568 Elf_Internal_Rela
* rel
;
569 Elf_Internal_Rela
* relend
;
571 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
572 sym_hashes
= elf_sym_hashes (input_bfd
);
573 relend
= relocs
+ input_section
->reloc_count
;
575 for (rel
= relocs
; rel
< relend
; rel
++)
577 reloc_howto_type
* howto
;
578 unsigned long r_symndx
;
579 Elf_Internal_Sym
* sym
;
581 struct elf_link_hash_entry
* h
;
583 bfd_reloc_status_type r
;
584 const char * name
= NULL
;
587 r_type
= ELF32_R_TYPE (rel
->r_info
);
589 if ( r_type
== R_IQ2000_GNU_VTINHERIT
590 || r_type
== R_IQ2000_GNU_VTENTRY
)
593 r_symndx
= ELF32_R_SYM (rel
->r_info
);
595 /* This is a final link. */
596 howto
= iq2000_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
601 if (r_symndx
< symtab_hdr
->sh_info
)
603 sym
= local_syms
+ r_symndx
;
604 sec
= local_sections
[r_symndx
];
605 relocation
= (sec
->output_section
->vma
609 name
= bfd_elf_string_from_elf_section
610 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
611 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
613 fprintf (stderr
, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
614 sec
->name
, name
, sym
->st_name
,
615 sec
->output_section
->vma
, sec
->output_offset
,
616 sym
->st_value
, rel
->r_addend
);
621 bfd_boolean unresolved_reloc
;
624 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
625 r_symndx
, symtab_hdr
, sym_hashes
,
627 unresolved_reloc
, warned
);
629 name
= h
->root
.root
.string
;
635 r
= iq2000_elf_relocate_hi16 (input_bfd
, rel
, contents
, relocation
);
643 r
= iq2000_final_link_relocate (howto
, input_bfd
, input_section
,
644 contents
, rel
, relocation
);
648 if (r
!= bfd_reloc_ok
)
650 const char * msg
= (const char *) NULL
;
654 case bfd_reloc_overflow
:
655 r
= info
->callbacks
->reloc_overflow
656 (info
, name
, howto
->name
, (bfd_vma
) 0,
657 input_bfd
, input_section
, rel
->r_offset
);
660 case bfd_reloc_undefined
:
661 r
= info
->callbacks
->undefined_symbol
662 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
665 case bfd_reloc_outofrange
:
666 msg
= _("internal error: out of range error");
669 case bfd_reloc_notsupported
:
670 msg
= _("internal error: unsupported relocation error");
673 case bfd_reloc_dangerous
:
674 msg
= _("internal error: dangerous relocation");
678 msg
= _("internal error: unknown error");
683 r
= info
->callbacks
->warning
684 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
695 /* Update the got entry reference counts for the section being
699 iq2000_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
700 bfd
* abfd ATTRIBUTE_UNUSED
;
701 struct bfd_link_info
* info ATTRIBUTE_UNUSED
;
702 asection
* sec ATTRIBUTE_UNUSED
;
703 const Elf_Internal_Rela
* relocs ATTRIBUTE_UNUSED
;
708 /* Return the section that should be marked against GC for a given
712 iq2000_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
)
714 struct bfd_link_info
* info ATTRIBUTE_UNUSED
;
715 Elf_Internal_Rela
* rel
;
716 struct elf_link_hash_entry
* h
;
717 Elf_Internal_Sym
* sym
;
721 switch (ELF32_R_TYPE (rel
->r_info
))
723 case R_IQ2000_GNU_VTINHERIT
:
724 case R_IQ2000_GNU_VTENTRY
:
728 switch (h
->root
.type
)
730 case bfd_link_hash_defined
:
731 case bfd_link_hash_defweak
:
732 return h
->root
.u
.def
.section
;
734 case bfd_link_hash_common
:
735 return h
->root
.u
.c
.p
->section
;
743 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
749 /* Return the MACH for an e_flags value. */
752 elf32_iq2000_machine (abfd
)
755 switch (elf_elfheader (abfd
)->e_flags
& EF_IQ2000_CPU_MASK
)
757 case EF_IQ2000_CPU_IQ2000
: return bfd_mach_iq2000
;
758 case EF_IQ2000_CPU_IQ10
: return bfd_mach_iq10
;
761 return bfd_mach_iq2000
;
765 /* Function to set the ELF flag bits. */
768 iq2000_elf_set_private_flags (abfd
, flags
)
772 elf_elfheader (abfd
)->e_flags
= flags
;
773 elf_flags_init (abfd
) = TRUE
;
777 /* Copy backend specific data from one object module to another. */
780 iq2000_elf_copy_private_bfd_data (ibfd
, obfd
)
784 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
785 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
788 BFD_ASSERT (!elf_flags_init (obfd
)
789 || elf_elfheader (obfd
)->e_flags
== elf_elfheader (ibfd
)->e_flags
);
791 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
792 elf_flags_init (obfd
) = TRUE
;
796 /* Merge backend specific data from an object file to the output
797 object file when linking. */
800 iq2000_elf_merge_private_bfd_data (ibfd
, obfd
)
804 flagword old_flags
, old_partial
;
805 flagword new_flags
, new_partial
;
806 bfd_boolean error
= FALSE
;
810 new_opt
[0] = old_opt
[0] = '\0';
811 new_flags
= elf_elfheader (ibfd
)->e_flags
;
812 old_flags
= elf_elfheader (obfd
)->e_flags
;
815 (*_bfd_error_handler
) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
816 old_flags
, new_flags
, elf_flags_init (obfd
) ? "yes" : "no",
817 bfd_get_filename (ibfd
));
820 if (!elf_flags_init (obfd
))
822 /* First call, no flags set. */
823 elf_flags_init (obfd
) = TRUE
;
824 elf_elfheader (obfd
)->e_flags
= new_flags
;
827 else if (new_flags
== old_flags
)
828 /* Compatible flags are ok. */
831 else /* Possibly incompatible flags. */
833 /* Warn if different cpu is used (allow a specific cpu to override
835 new_partial
= (new_flags
& EF_IQ2000_CPU_MASK
);
836 old_partial
= (old_flags
& EF_IQ2000_CPU_MASK
);
837 if (new_partial
== old_partial
)
844 default: strcat (new_opt
, " -m2000"); break;
845 case EF_IQ2000_CPU_IQ2000
: strcat (new_opt
, " -m2000"); break;
846 case EF_IQ2000_CPU_IQ10
: strcat (new_opt
, " -m10"); break;
851 default: strcat (old_opt
, " -m2000"); break;
852 case EF_IQ2000_CPU_IQ2000
: strcat (old_opt
, " -m2000"); break;
853 case EF_IQ2000_CPU_IQ10
: strcat (old_opt
, " -m10"); break;
857 /* Print out any mismatches from above. */
861 (*_bfd_error_handler
)
862 (_("%s: compiled with %s and linked with modules compiled with %s"),
863 bfd_get_filename (ibfd
), new_opt
, old_opt
);
866 new_flags
&= ~ EF_IQ2000_ALL_FLAGS
;
867 old_flags
&= ~ EF_IQ2000_ALL_FLAGS
;
869 /* Warn about any other mismatches. */
870 if (new_flags
!= old_flags
)
873 (*_bfd_error_handler
)
874 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
875 bfd_get_filename (ibfd
), (long)new_flags
, (long)old_flags
);
880 bfd_set_error (bfd_error_bad_value
);
887 iq2000_elf_print_private_bfd_data (abfd
, ptr
)
891 FILE *file
= (FILE *) ptr
;
894 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
896 /* Print normal ELF private data. */
897 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
899 flags
= elf_elfheader (abfd
)->e_flags
;
900 fprintf (file
, _("private flags = 0x%lx:"), (long)flags
);
902 switch (flags
& EF_IQ2000_CPU_MASK
)
905 case EF_IQ2000_CPU_IQ2000
: fprintf (file
, " -m2000"); break;
906 case EF_IQ2000_CPU_IQ10
: fprintf (file
, " -m10"); break;
915 iq2000_elf_object_p (abfd
)
918 /* Irix 5 and 6 is broken. Object file symbol tables are not always
919 sorted correctly such that local symbols precede global symbols,
920 and the sh_info field in the symbol table is not always right. */
921 elf_bad_symtab (abfd
) = TRUE
;
923 bfd_default_set_arch_mach (abfd
, bfd_arch_iq2000
,
924 elf32_iq2000_machine (abfd
));
929 #define ELF_ARCH bfd_arch_iq2000
930 #define ELF_MACHINE_CODE EM_IQ2000
931 #define ELF_MAXPAGESIZE 0x1000
933 #define TARGET_BIG_SYM bfd_elf32_iq2000_vec
934 #define TARGET_BIG_NAME "elf32-iq2000"
936 #define elf_info_to_howto_rel NULL
937 #define elf_info_to_howto iq2000_info_to_howto_rela
938 #define elf_backend_relocate_section iq2000_elf_relocate_section
939 #define elf_backend_gc_mark_hook iq2000_elf_gc_mark_hook
940 #define elf_backend_gc_sweep_hook iq2000_elf_gc_sweep_hook
941 #define elf_backend_check_relocs iq2000_elf_check_relocs
942 #define elf_backend_object_p iq2000_elf_object_p
943 #define elf_backend_rela_normal 1
945 #define elf_backend_can_gc_sections 1
947 #define bfd_elf32_bfd_reloc_type_lookup iq2000_reloc_type_lookup
948 #define bfd_elf32_bfd_set_private_flags iq2000_elf_set_private_flags
949 #define bfd_elf32_bfd_copy_private_bfd_data iq2000_elf_copy_private_bfd_data
950 #define bfd_elf32_bfd_merge_private_bfd_data iq2000_elf_merge_private_bfd_data
951 #define bfd_elf32_bfd_print_private_bfd_data iq2000_elf_print_private_bfd_data
953 #include "elf32-target.h"