gdb/gdbserver
[deliverable/binutils-gdb.git] / bfd / elf32-dlx.c
CommitLineData
d172d4ba 1/* DLX specific support for 32-bit ELF
4a97a0e5 2 Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2011
157090f7 3 Free Software Foundation, Inc.
d172d4ba
NC
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
d172d4ba
NC
10 (at your option) any later version.
11
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.
16
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
47b0e7ad
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
d172d4ba 21
d172d4ba 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
d172d4ba
NC
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf/dlx.h"
27
d172d4ba
NC
28#define USE_REL 1
29
30#define bfd_elf32_bfd_reloc_type_lookup elf32_dlx_reloc_type_lookup
157090f7 31#define bfd_elf32_bfd_reloc_name_lookup elf32_dlx_reloc_name_lookup
d172d4ba
NC
32#define elf_info_to_howto elf32_dlx_info_to_howto
33#define elf_info_to_howto_rel elf32_dlx_info_to_howto_rel
34#define elf_backend_check_relocs elf32_dlx_check_relocs
35
4cc11e76 36/* The gas default behavior is not to preform the %hi modifier so that the
d172d4ba
NC
37 GNU assembler can have the lower 16 bits offset placed in the insn, BUT
38 we do like the gas to indicate it is %hi reloc type so when we in the link
39 loader phase we can have the corrected hi16 vale replace the buggous lo16
40 value that was placed there by gas. */
41
42static int skip_dlx_elf_hi16_reloc = 0;
43
47b0e7ad
NC
44extern int set_dlx_skip_hi16_flag (int);
45
d172d4ba 46int
47b0e7ad 47set_dlx_skip_hi16_flag (int flag)
d172d4ba
NC
48{
49 skip_dlx_elf_hi16_reloc = flag;
50 return flag;
51}
52
53static bfd_reloc_status_type
47b0e7ad
NC
54_bfd_dlx_elf_hi16_reloc (bfd *abfd,
55 arelent *reloc_entry,
56 asymbol *symbol,
57 void * data,
58 asection *input_section,
59 bfd *output_bfd,
60 char **error_message)
d172d4ba
NC
61{
62 bfd_reloc_status_type ret;
63 bfd_vma relocation;
64
65 /* If the skip flag is set then we simply do the generic relocating, this
66 is more of a hack for dlx gas/gld, so we do not need to do the %hi/%lo
67 fixup like mips gld did. */
d172d4ba
NC
68 if (skip_dlx_elf_hi16_reloc)
69 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
70 input_section, output_bfd, error_message);
71
72 /* If we're relocating, and this an external symbol, we don't want
73 to change anything. */
74 if (output_bfd != (bfd *) NULL
75 && (symbol->flags & BSF_SECTION_SYM) == 0
76 && reloc_entry->addend == 0)
77 {
78 reloc_entry->address += input_section->output_offset;
79 return bfd_reloc_ok;
80 }
81
82 ret = bfd_reloc_ok;
83
84 if (bfd_is_und_section (symbol->section)
85 && output_bfd == (bfd *) NULL)
86 ret = bfd_reloc_undefined;
87
d172d4ba
NC
88 relocation = (bfd_is_com_section (symbol->section)) ? 0 : symbol->value;
89 relocation += symbol->section->output_section->vma;
90 relocation += symbol->section->output_offset;
91 relocation += reloc_entry->addend;
92 relocation += bfd_get_16 (abfd, (bfd_byte *)data + reloc_entry->address);
93
07515404 94 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
d172d4ba
NC
95 return bfd_reloc_outofrange;
96
d172d4ba
NC
97 bfd_put_16 (abfd, (short)((relocation >> 16) & 0xFFFF),
98 (bfd_byte *)data + reloc_entry->address);
99
100 return ret;
101}
102
1049f94e 103/* ELF relocs are against symbols. If we are producing relocatable
d172d4ba
NC
104 output, and the reloc is against an external symbol, and nothing
105 has given us any additional addend, the resulting reloc will also
106 be against the same symbol. In such a case, we don't want to
107 change anything about the way the reloc is handled, since it will
108 all be done at final link time. Rather than put special case code
109 into bfd_perform_relocation, all the reloc types use this howto
110 function. It just short circuits the reloc if producing
1049f94e 111 relocatable output against an external symbol. */
d172d4ba
NC
112
113static bfd_reloc_status_type
47b0e7ad
NC
114elf32_dlx_relocate16 (bfd *abfd,
115 arelent *reloc_entry,
116 asymbol *symbol,
117 void * data,
118 asection *input_section,
119 bfd *output_bfd,
120 char **error_message ATTRIBUTE_UNUSED)
d172d4ba
NC
121{
122 unsigned long insn, vallo, allignment;
123 int val;
124
125 /* HACK: I think this first condition is necessary when producing
126 relocatable output. After the end of HACK, the code is identical
127 to bfd_elf_generic_reloc(). I would _guess_ the first change
128 belongs there rather than here. martindo 1998-10-23. */
129
130 if (skip_dlx_elf_hi16_reloc)
131 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
132 input_section, output_bfd, error_message);
133
47b0e7ad 134 /* Check undefined section and undefined symbols. */
d172d4ba
NC
135 if (bfd_is_und_section (symbol->section)
136 && output_bfd == (bfd *) NULL)
137 return bfd_reloc_undefined;
138
47b0e7ad 139 /* Can not support a long jump to sections other then .text. */
d172d4ba
NC
140 if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
141 {
4a97a0e5
AM
142 (*_bfd_error_handler) (_("BFD Link Error: branch (PC rel16) to section (%s) not supported"),
143 symbol->section->output_section->name);
d172d4ba
NC
144 return bfd_reloc_undefined;
145 }
146
147 insn = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
148 allignment = 1 << (input_section->output_section->alignment_power - 1);
149 vallo = insn & 0x0000FFFF;
150
151 if (vallo & 0x8000)
152 vallo = ~(vallo | 0xFFFF0000) + 1;
153
154 /* vallo points to the vma of next instruction. */
155 vallo += (((unsigned long)(input_section->output_section->vma +
156 input_section->output_offset) +
157 allignment) & ~allignment);
158
159 /* val is the displacement (PC relative to next instruction). */
160 val = (symbol->section->output_offset +
161 symbol->section->output_section->vma +
162 symbol->value) - vallo;
d172d4ba
NC
163
164 if (abs ((int) val) > 0x00007FFF)
165 return bfd_reloc_outofrange;
166
167 insn = (insn & 0xFFFF0000) | (val & 0x0000FFFF);
168
169 bfd_put_32 (abfd, insn,
170 (bfd_byte *) data + reloc_entry->address);
171
172 return bfd_reloc_ok;
173}
174
175static bfd_reloc_status_type
47b0e7ad
NC
176elf32_dlx_relocate26 (bfd *abfd,
177 arelent *reloc_entry,
178 asymbol *symbol,
179 void * data,
180 asection *input_section,
181 bfd *output_bfd,
182 char **error_message ATTRIBUTE_UNUSED)
d172d4ba
NC
183{
184 unsigned long insn, vallo, allignment;
185 int val;
186
187 /* HACK: I think this first condition is necessary when producing
188 relocatable output. After the end of HACK, the code is identical
189 to bfd_elf_generic_reloc(). I would _guess_ the first change
190 belongs there rather than here. martindo 1998-10-23. */
191
192 if (skip_dlx_elf_hi16_reloc)
193 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
194 input_section, output_bfd, error_message);
195
196 /* Check undefined section and undefined symbols. */
197 if (bfd_is_und_section (symbol->section)
198 && output_bfd == (bfd *) NULL)
199 return bfd_reloc_undefined;
200
201 /* Can not support a long jump to sections other then .text */
202 if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
203 {
4a97a0e5
AM
204 (*_bfd_error_handler) (_("BFD Link Error: jump (PC rel26) to section (%s) not supported"),
205 symbol->section->output_section->name);
d172d4ba
NC
206 return bfd_reloc_undefined;
207 }
208
209 insn = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
210 allignment = 1 << (input_section->output_section->alignment_power - 1);
211 vallo = insn & 0x03FFFFFF;
212
213 if (vallo & 0x03000000)
214 vallo = ~(vallo | 0xFC000000) + 1;
215
216 /* vallo is the vma for the next instruction. */
217 vallo += (((unsigned long) (input_section->output_section->vma +
218 input_section->output_offset) +
219 allignment) & ~allignment);
220
221 /* val is the displacement (PC relative to next instruction). */
222 val = (symbol->section->output_offset +
223 symbol->section->output_section->vma + symbol->value)
224 - vallo;
d172d4ba
NC
225
226 if (abs ((int) val) > 0x01FFFFFF)
227 return bfd_reloc_outofrange;
228
229 insn = (insn & 0xFC000000) | (val & 0x03FFFFFF);
230 bfd_put_32 (abfd, insn,
231 (bfd_byte *) data + reloc_entry->address);
232
233 return bfd_reloc_ok;
234}
235
47b0e7ad
NC
236static reloc_howto_type dlx_elf_howto_table[]=
237{
238 /* No relocation. */
239 HOWTO (R_DLX_NONE, /* Type. */
240 0, /* Rightshift. */
241 0, /* size (0 = byte, 1 = short, 2 = long). */
242 0, /* Bitsize. */
243 FALSE, /* PC_relative. */
244 0, /* Bitpos. */
245 complain_overflow_dont,/* Complain_on_overflow. */
246 bfd_elf_generic_reloc, /* Special_function. */
247 "R_DLX_NONE", /* Name. */
248 FALSE, /* Partial_inplace. */
249 0, /* Src_mask. */
250 0, /* Dst_mask. */
251 FALSE), /* PCrel_offset. */
252
253 /* 8 bit relocation. */
254 HOWTO (R_DLX_RELOC_8, /* Type. */
255 0, /* Rightshift. */
256 0, /* Size (0 = byte, 1 = short, 2 = long). */
257 8, /* Bitsize. */
258 FALSE, /* PC_relative. */
259 0, /* Bitpos. */
260 complain_overflow_dont,/* Complain_on_overflow. */
261 bfd_elf_generic_reloc, /* Special_function. */
262 "R_DLX_RELOC_8", /* Name. */
263 TRUE, /* Partial_inplace. */
264 0xff, /* Src_mask. */
265 0xff, /* Dst_mask. */
266 FALSE), /* PCrel_offset. */
267
268 /* 16 bit relocation. */
269 HOWTO (R_DLX_RELOC_16, /* Type. */
270 0, /* Rightshift. */
271 1, /* Size (0 = byte, 1 = short, 2 = long). */
272 16, /* Bitsize. */
273 FALSE, /* PC_relative. */
274 0, /* Bitpos. */
275 complain_overflow_dont,/* Complain_on_overflow. */
276 bfd_elf_generic_reloc, /* Special_function. */
277 "R_DLX_RELOC_16", /* Name. */
278 TRUE, /* Partial_inplace. */
279 0xffff, /* Src_mask. */
280 0xffff, /* Dst_mask. */
281 FALSE), /* PCrel_offset. */
282
283 /* 32 bit relocation. */
284 HOWTO (R_DLX_RELOC_32, /* Type. */
285 0, /* Rightshift. */
286 2, /* Size (0 = byte, 1 = short, 2 = long). */
287 32, /* Bitsize. */
288 FALSE, /* PC_relative. */
289 0, /* Bitpos. */
290 complain_overflow_dont,/* Complain_on_overflow. */
291 bfd_elf_generic_reloc, /* Special_function. */
292 "R_DLX_RELOC_32", /* Name. */
293 TRUE, /* Partial_inplace. */
294 0xffffffff, /* Src_mask. */
295 0xffffffff, /* Dst_mask. */
296 FALSE), /* PCrel_offset. */
297
298 /* GNU extension to record C++ vtable hierarchy. */
299 HOWTO (R_DLX_GNU_VTINHERIT, /* Type. */
300 0, /* Rightshift. */
301 2, /* Size (0 = byte, 1 = short, 2 = long). */
302 0, /* Bitsize. */
303 FALSE, /* PC_relative. */
304 0, /* Bitpos. */
305 complain_overflow_dont,/* Complain_on_overflow. */
306 NULL, /* Special_function. */
307 "R_DLX_GNU_VTINHERIT", /* Name. */
308 FALSE, /* Partial_inplace. */
309 0, /* Src_mask. */
310 0, /* Dst_mask. */
311 FALSE), /* PCrel_offset. */
312
313 /* GNU extension to record C++ vtable member usage. */
314 HOWTO (R_DLX_GNU_VTENTRY, /* Type. */
315 0, /* Rightshift. */
316 2, /* Size (0 = byte, 1 = short, 2 = long). */
317 0, /* Bitsize. */
318 FALSE, /* PC_relative. */
319 0, /* Bitpos. */
320 complain_overflow_dont,/* Complain_on_overflow. */
321 _bfd_elf_rel_vtable_reloc_fn,/* Special_function. */
322 "R_DLX_GNU_VTENTRY", /* Name. */
323 FALSE, /* Partial_inplace. */
324 0, /* Src_mask. */
325 0, /* Dst_mask. */
326 FALSE) /* PCrel_offset. */
327};
328
329/* 16 bit offset for pc-relative branches. */
330static reloc_howto_type elf_dlx_gnu_rel16_s2 =
331 HOWTO (R_DLX_RELOC_16_PCREL, /* Type. */
332 0, /* Rightshift. */
333 1, /* Size (0 = byte, 1 = short, 2 = long). */
334 16, /* Bitsize. */
335 TRUE, /* PC_relative. */
336 0, /* Bitpos. */
337 complain_overflow_signed, /* Complain_on_overflow. */
338 elf32_dlx_relocate16, /* Special_function. */
339 "R_DLX_RELOC_16_PCREL",/* Name. */
340 TRUE, /* Partial_inplace. */
341 0xffff, /* Src_mask. */
342 0xffff, /* Dst_mask. */
343 TRUE); /* PCrel_offset. */
344
345/* 26 bit offset for pc-relative branches. */
346static reloc_howto_type elf_dlx_gnu_rel26_s2 =
347 HOWTO (R_DLX_RELOC_26_PCREL, /* Type. */
348 0, /* Rightshift. */
349 2, /* Size (0 = byte, 1 = short, 2 = long). */
350 26, /* Bitsize. */
351 TRUE, /* PC_relative. */
352 0, /* Bitpos. */
353 complain_overflow_dont,/* Complain_on_overflow. */
354 elf32_dlx_relocate26, /* Special_function. */
355 "R_DLX_RELOC_26_PCREL",/* Name. */
356 TRUE, /* Partial_inplace. */
357 0xffff, /* Src_mask. */
358 0xffff, /* Dst_mask. */
359 TRUE); /* PCrel_offset. */
360
361/* High 16 bits of symbol value. */
362static reloc_howto_type elf_dlx_reloc_16_hi =
363 HOWTO (R_DLX_RELOC_16_HI, /* Type. */
364 16, /* Rightshift. */
365 2, /* Size (0 = byte, 1 = short, 2 = long). */
366 32, /* Bitsize. */
367 FALSE, /* PC_relative. */
368 0, /* Bitpos. */
369 complain_overflow_dont,/* Complain_on_overflow. */
370 _bfd_dlx_elf_hi16_reloc,/* Special_function. */
371 "R_DLX_RELOC_16_HI", /* Name. */
372 TRUE, /* Partial_inplace. */
373 0xFFFF, /* Src_mask. */
374 0xffff, /* Dst_mask. */
375 FALSE); /* PCrel_offset. */
376
377 /* Low 16 bits of symbol value. */
378static reloc_howto_type elf_dlx_reloc_16_lo =
379 HOWTO (R_DLX_RELOC_16_LO, /* Type. */
380 0, /* Rightshift. */
381 1, /* Size (0 = byte, 1 = short, 2 = long). */
382 16, /* Bitsize. */
383 FALSE, /* PC_relative. */
384 0, /* Bitpos. */
385 complain_overflow_dont,/* Complain_on_overflow. */
386 bfd_elf_generic_reloc, /* Special_function. */
387 "R_DLX_RELOC_16_LO", /* Name. */
388 TRUE, /* Partial_inplace. */
389 0xffff, /* Src_mask. */
390 0xffff, /* Dst_mask. */
391 FALSE); /* PCrel_offset. */
392
d172d4ba
NC
393/* A mapping from BFD reloc types to DLX ELF reloc types.
394 Stolen from elf32-mips.c.
cedb70c5 395
d172d4ba
NC
396 More about this table - for dlx elf relocation we do not really
397 need this table, if we have a rtype defined in this table will
398 caused tc_gen_relocate confused and die on us, but if we remove
4cc11e76 399 this table it will caused more problem, so for now simple solution
d172d4ba
NC
400 is to remove those entries which may cause problem. */
401struct elf_reloc_map
402{
403 bfd_reloc_code_real_type bfd_reloc_val;
404 enum elf_dlx_reloc_type elf_reloc_val;
405};
406
3f9c735e 407static const struct elf_reloc_map dlx_reloc_map[] =
47b0e7ad
NC
408{
409 { BFD_RELOC_NONE, R_DLX_NONE },
410 { BFD_RELOC_16, R_DLX_RELOC_16 },
411 { BFD_RELOC_32, R_DLX_RELOC_32 },
412 { BFD_RELOC_DLX_HI16_S, R_DLX_RELOC_16_HI },
413 { BFD_RELOC_DLX_LO16, R_DLX_RELOC_16_LO },
414 { BFD_RELOC_VTABLE_INHERIT, R_DLX_GNU_VTINHERIT },
415 { BFD_RELOC_VTABLE_ENTRY, R_DLX_GNU_VTENTRY }
416};
d172d4ba
NC
417
418/* Look through the relocs for a section during the first phase.
419 Since we don't do .gots or .plts, we just need to consider the
420 virtual table relocs for gc. */
421
b34976b6 422static bfd_boolean
47b0e7ad
NC
423elf32_dlx_check_relocs (bfd *abfd,
424 struct bfd_link_info *info,
425 asection *sec,
426 const Elf_Internal_Rela *relocs)
d172d4ba
NC
427{
428 Elf_Internal_Shdr *symtab_hdr;
5582a088 429 struct elf_link_hash_entry **sym_hashes;
d172d4ba
NC
430 const Elf_Internal_Rela *rel;
431 const Elf_Internal_Rela *rel_end;
432
1049f94e 433 if (info->relocatable)
b34976b6 434 return TRUE;
d172d4ba
NC
435
436 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
437 sym_hashes = elf_sym_hashes (abfd);
d172d4ba
NC
438
439 rel_end = relocs + sec->reloc_count;
440 for (rel = relocs; rel < rel_end; rel++)
441 {
442 struct elf_link_hash_entry *h;
443 unsigned long r_symndx;
444
445 r_symndx = ELF32_R_SYM (rel->r_info);
446 if (r_symndx < symtab_hdr->sh_info)
447 h = NULL;
448 else
973a3492
L
449 {
450 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
451 while (h->root.type == bfd_link_hash_indirect
452 || h->root.type == bfd_link_hash_warning)
453 h = (struct elf_link_hash_entry *) h->root.u.i.link;
81fbe831
AM
454
455 /* PR15323, ref flags aren't set for references in the same
456 object. */
457 h->root.non_ir_ref = 1;
973a3492 458 }
d172d4ba
NC
459
460 switch (ELF32_R_TYPE (rel->r_info))
461 {
462 /* This relocation describes the C++ object vtable hierarchy.
463 Reconstruct it for later use during GC. */
464 case R_DLX_GNU_VTINHERIT:
c152c796 465 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 466 return FALSE;
d172d4ba
NC
467 break;
468
469 /* This relocation describes which C++ vtable entries are actually
470 used. Record for later use during GC. */
471 case R_DLX_GNU_VTENTRY:
d17e0c6e
JB
472 BFD_ASSERT (h != NULL);
473 if (h != NULL
474 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 475 return FALSE;
d172d4ba
NC
476 break;
477 }
478 }
479
b34976b6 480 return TRUE;
d172d4ba
NC
481}
482
483/* Given a BFD reloc type, return a howto structure. */
484
485static reloc_howto_type *
47b0e7ad
NC
486elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
487 bfd_reloc_code_real_type code)
d172d4ba
NC
488{
489 unsigned int i;
490
491 for (i = 0; i < sizeof (dlx_reloc_map) / sizeof (struct elf_reloc_map); i++)
492 if (dlx_reloc_map[i].bfd_reloc_val == code)
493 return &dlx_elf_howto_table[(int) dlx_reloc_map[i].elf_reloc_val];
494
495 switch (code)
496 {
497 default:
498 bfd_set_error (bfd_error_bad_value);
499 return NULL;
500 case BFD_RELOC_16_PCREL_S2:
501 return &elf_dlx_gnu_rel16_s2;
502 case BFD_RELOC_DLX_JMP26:
503 return &elf_dlx_gnu_rel26_s2;
504 case BFD_RELOC_HI16_S:
505 return &elf_dlx_reloc_16_hi;
506 case BFD_RELOC_LO16:
507 return &elf_dlx_reloc_16_lo;
508 }
509}
510
157090f7
AM
511static reloc_howto_type *
512elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
513 const char *r_name)
514{
515 unsigned int i;
516
517 for (i = 0;
518 i < sizeof (dlx_elf_howto_table) / sizeof (dlx_elf_howto_table[0]);
519 i++)
520 if (dlx_elf_howto_table[i].name != NULL
521 && strcasecmp (dlx_elf_howto_table[i].name, r_name) == 0)
522 return &dlx_elf_howto_table[i];
523
524 if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0)
525 return &elf_dlx_gnu_rel16_s2;
526 if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0)
527 return &elf_dlx_gnu_rel26_s2;
528 if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0)
529 return &elf_dlx_reloc_16_hi;
530 if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0)
531 return &elf_dlx_reloc_16_lo;
532
533 return NULL;
534}
535
d172d4ba 536static reloc_howto_type *
47b0e7ad 537dlx_rtype_to_howto (unsigned int r_type)
d172d4ba
NC
538{
539 switch (r_type)
540 {
541 case R_DLX_RELOC_16_PCREL:
542 return & elf_dlx_gnu_rel16_s2;
d172d4ba
NC
543 case R_DLX_RELOC_26_PCREL:
544 return & elf_dlx_gnu_rel26_s2;
d172d4ba
NC
545 case R_DLX_RELOC_16_HI:
546 return & elf_dlx_reloc_16_hi;
d172d4ba
NC
547 case R_DLX_RELOC_16_LO:
548 return & elf_dlx_reloc_16_lo;
d172d4ba
NC
549 default:
550 BFD_ASSERT (r_type < (unsigned int) R_DLX_max);
551 return & dlx_elf_howto_table[r_type];
d172d4ba
NC
552 }
553}
554
555static void
47b0e7ad
NC
556elf32_dlx_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
557 arelent * cache_ptr ATTRIBUTE_UNUSED,
558 Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)
d172d4ba
NC
559{
560 abort ();
561}
562
563static void
47b0e7ad
NC
564elf32_dlx_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
565 arelent *cache_ptr,
566 Elf_Internal_Rela *dst)
d172d4ba
NC
567{
568 unsigned int r_type;
569
570 r_type = ELF32_R_TYPE (dst->r_info);
571 cache_ptr->howto = dlx_rtype_to_howto (r_type);
572 return;
573}
574
575#define TARGET_BIG_SYM bfd_elf32_dlx_big_vec
576#define TARGET_BIG_NAME "elf32-dlx"
577#define ELF_ARCH bfd_arch_dlx
578#define ELF_MACHINE_CODE EM_DLX
579#define ELF_MAXPAGESIZE 1 /* FIXME: This number is wrong, It should be the page size in bytes. */
580
581#include "elf32-target.h"
This page took 0.561379 seconds and 4 git commands to generate.