1 /* MeP-specific support for 32-bit ELF.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011, 2012 Free Software Foundation, Inc.
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
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20 MA 02110-1301, USA. */
27 #include "libiberty.h"
29 /* Forward declarations. */
31 /* Private relocation functions. */
33 #define MEPREL(type, size, bits, right, left, pcrel, overflow, mask) \
34 {(unsigned)type, right, size, bits, pcrel, left, overflow, mep_reloc, #type, FALSE, 0, mask, 0 }
36 #define N complain_overflow_dont
37 #define S complain_overflow_signed
38 #define U complain_overflow_unsigned
40 static bfd_reloc_status_type
mep_reloc (bfd
*, arelent
*, struct bfd_symbol
*,
41 void *, asection
*, bfd
*, char **);
43 static reloc_howto_type mep_elf_howto_table
[] =
45 /* type, size, bits, leftshift, rightshift, pcrel, OD/OS/OU, mask. */
46 MEPREL (R_MEP_NONE
, 0, 0, 0, 0, 0, N
, 0),
47 MEPREL (R_RELC
, 0, 0, 0, 0, 0, N
, 0),
49 /* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */
50 MEPREL (R_MEP_8
, 0, 8, 0, 0, 0, U
, 0xff),
51 MEPREL (R_MEP_16
, 1, 16, 0, 0, 0, U
, 0xffff),
52 MEPREL (R_MEP_32
, 2, 32, 0, 0, 0, U
, 0xffffffff),
53 MEPREL (R_MEP_PCREL8A2
, 1, 8, 1, 1, 1, S
, 0x00fe),
54 MEPREL (R_MEP_PCREL12A2
,1, 12, 1, 1, 1, S
, 0x0ffe),
55 MEPREL (R_MEP_PCREL17A2
,2, 17, 0, 1, 1, S
, 0x0000ffff),
56 MEPREL (R_MEP_PCREL24A2
,2, 24, 0, 1, 1, S
, 0x07f0ffff),
57 MEPREL (R_MEP_PCABS24A2
,2, 24, 0, 1, 0, U
, 0x07f0ffff),
58 MEPREL (R_MEP_LOW16
, 2, 16, 0, 0, 0, N
, 0x0000ffff),
59 MEPREL (R_MEP_HI16U
, 2, 32, 0,16, 0, N
, 0x0000ffff),
60 MEPREL (R_MEP_HI16S
, 2, 32, 0,16, 0, N
, 0x0000ffff),
61 MEPREL (R_MEP_GPREL
, 2, 16, 0, 0, 0, S
, 0x0000ffff),
62 MEPREL (R_MEP_TPREL
, 2, 16, 0, 0, 0, S
, 0x0000ffff),
63 MEPREL (R_MEP_TPREL7
, 1, 7, 0, 0, 0, U
, 0x007f),
64 MEPREL (R_MEP_TPREL7A2
, 1, 7, 1, 1, 0, U
, 0x007e),
65 MEPREL (R_MEP_TPREL7A4
, 1, 7, 2, 2, 0, U
, 0x007c),
66 MEPREL (R_MEP_UIMM24
, 2, 24, 0, 0, 0, U
, 0x00ffffff),
67 MEPREL (R_MEP_ADDR24A4
, 2, 24, 0, 2, 0, U
, 0x00fcffff),
68 MEPREL (R_MEP_GNU_VTINHERIT
,1, 0,16,32, 0, N
, 0x0000),
69 MEPREL (R_MEP_GNU_VTENTRY
,1, 0,16,32, 0, N
, 0x0000),
73 #define VALID_MEP_RELOC(N) ((N) >= 0 \
74 && (N) < ARRAY_SIZE (mep_elf_howto_table)
80 static bfd_reloc_status_type
82 (bfd
* abfd ATTRIBUTE_UNUSED
,
83 arelent
* reloc_entry ATTRIBUTE_UNUSED
,
84 struct bfd_symbol
* symbol ATTRIBUTE_UNUSED
,
85 void * data ATTRIBUTE_UNUSED
,
86 asection
* input_section ATTRIBUTE_UNUSED
,
87 bfd
* output_bfd ATTRIBUTE_UNUSED
,
88 char ** error_message ATTRIBUTE_UNUSED
)
95 #define BFD_RELOC_MEP_NONE BFD_RELOC_NONE
96 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
97 #define MAP(n) case BFD_RELOC_MEP_##n: type = R_MEP_##n; break
99 #define MAP(n) case BFD_RELOC_MEP_/**/n: type = R_MEP_/**/n; break
102 static reloc_howto_type
*
103 mep_reloc_type_lookup
104 (bfd
* abfd ATTRIBUTE_UNUSED
,
105 bfd_reloc_code_real_type code
)
107 unsigned int type
= 0;
121 case BFD_RELOC_VTABLE_ENTRY
:
122 type
= R_MEP_GNU_VTENTRY
;
124 case BFD_RELOC_VTABLE_INHERIT
:
125 type
= R_MEP_GNU_VTINHERIT
;
132 /* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */
156 /* Pacify gcc -Wall. */
157 (*_bfd_error_handler
) (_("mep: no reloc for code %d"), code
);
161 if (mep_elf_howto_table
[type
].type
!= type
)
163 (*_bfd_error_handler
) (_("MeP: howto %d has type %d"),
164 type
, mep_elf_howto_table
[type
].type
);
168 return mep_elf_howto_table
+ type
;
173 static reloc_howto_type
*
174 mep_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
, const char *r_name
)
179 i
< sizeof (mep_elf_howto_table
) / sizeof (mep_elf_howto_table
[0]);
181 if (mep_elf_howto_table
[i
].name
!= NULL
182 && strcasecmp (mep_elf_howto_table
[i
].name
, r_name
) == 0)
183 return &mep_elf_howto_table
[i
];
188 /* Perform a single relocation. */
190 static struct bfd_link_info
*mep_info
;
191 static int warn_tp
= 0, warn_sda
= 0;
200 struct bfd_link_hash_entry
*h
;
205 h
= bfd_link_hash_lookup (mep_info
->hash
, name
, FALSE
, FALSE
, TRUE
);
206 if (h
== 0 || h
->type
!= bfd_link_hash_defined
)
211 *cache
= (h
->u
.def
.value
212 + h
->u
.def
.section
->output_section
->vma
213 + h
->u
.def
.section
->output_offset
);
218 mep_tpoff_base (bfd_vma ofs
)
220 static bfd_vma cache
= 0;
221 return mep_lookup_global ("__tpbase", ofs
, &cache
, &warn_tp
);
225 mep_sdaoff_base (bfd_vma ofs
)
227 static bfd_vma cache
= 0;
228 return mep_lookup_global ("__sdabase", ofs
, &cache
, &warn_sda
);
231 static bfd_reloc_status_type
232 mep_final_link_relocate
233 (reloc_howto_type
* howto
,
235 asection
* input_section
,
237 Elf_Internal_Rela
* rel
,
244 bfd_reloc_status_type r
= bfd_reloc_ok
;
247 if (bfd_big_endian (input_bfd
))
258 pc
= (input_section
->output_section
->vma
259 + input_section
->output_offset
262 s
= relocation
+ rel
->r_addend
;
264 byte
= (unsigned char *)contents
+ rel
->r_offset
;
266 if (howto
->type
== R_MEP_PCREL24A2
270 /* This is an unreachable branch to an undefined weak function.
271 Silently ignore it, since the opcode can't do that but should
272 never be executed anyway. */
276 if (howto
->pc_relative
)
279 u
= (unsigned long) s
;
284 /* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */
285 case R_MEP_8
: /* 76543210 */
286 if (u
> 255) r
= bfd_reloc_overflow
;
287 byte
[0] = (u
& 0xff);
289 case R_MEP_16
: /* fedcba9876543210 */
290 if (u
> 65535) r
= bfd_reloc_overflow
;
291 byte
[0^e2
] = ((u
>> 8) & 0xff);
292 byte
[1^e2
] = (u
& 0xff);
294 case R_MEP_32
: /* vutsrqponmlkjihgfedcba9876543210 */
295 byte
[0^e4
] = ((u
>> 24) & 0xff);
296 byte
[1^e4
] = ((u
>> 16) & 0xff);
297 byte
[2^e4
] = ((u
>> 8) & 0xff);
298 byte
[3^e4
] = (u
& 0xff);
300 case R_MEP_PCREL8A2
: /* --------7654321- */
301 if (-128 > s
|| s
> 127) r
= bfd_reloc_overflow
;
302 byte
[1^e2
] = (byte
[1^e2
] & 0x01) | (s
& 0xfe);
304 case R_MEP_PCREL12A2
: /* ----ba987654321- */
305 if (-2048 > s
|| s
> 2047) r
= bfd_reloc_overflow
;
306 byte
[0^e2
] = (byte
[0^e2
] & 0xf0) | ((s
>> 8) & 0x0f);
307 byte
[1^e2
] = (byte
[1^e2
] & 0x01) | (s
& 0xfe);
309 case R_MEP_PCREL17A2
: /* ----------------gfedcba987654321 */
310 if (-65536 > s
|| s
> 65535) r
= bfd_reloc_overflow
;
311 byte
[2^e2
] = ((s
>> 9) & 0xff);
312 byte
[3^e2
] = ((s
>> 1) & 0xff);
314 case R_MEP_PCREL24A2
: /* -----7654321----nmlkjihgfedcba98 */
315 if (-8388608 > s
|| s
> 8388607) r
= bfd_reloc_overflow
;
316 byte
[0^e2
] = (byte
[0^e2
] & 0xf8) | ((s
>> 5) & 0x07);
317 byte
[1^e2
] = (byte
[1^e2
] & 0x0f) | ((s
<< 3) & 0xf0);
318 byte
[2^e2
] = ((s
>> 16) & 0xff);
319 byte
[3^e2
] = ((s
>> 8) & 0xff);
321 case R_MEP_PCABS24A2
: /* -----7654321----nmlkjihgfedcba98 */
322 if (u
> 16777215) r
= bfd_reloc_overflow
;
323 byte
[0^e2
] = (byte
[0^e2
] & 0xf8) | ((u
>> 5) & 0x07);
324 byte
[1^e2
] = (byte
[1^e2
] & 0x0f) | ((u
<< 3) & 0xf0);
325 byte
[2^e2
] = ((u
>> 16) & 0xff);
326 byte
[3^e2
] = ((u
>> 8) & 0xff);
328 case R_MEP_LOW16
: /* ----------------fedcba9876543210 */
329 byte
[2^e2
] = ((u
>> 8) & 0xff);
330 byte
[3^e2
] = (u
& 0xff);
332 case R_MEP_HI16U
: /* ----------------vutsrqponmlkjihg */
333 byte
[2^e2
] = ((u
>> 24) & 0xff);
334 byte
[3^e2
] = ((u
>> 16) & 0xff);
336 case R_MEP_HI16S
: /* ----------------vutsrqponmlkjihg */
339 byte
[2^e2
] = ((s
>> 24) & 0xff);
340 byte
[3^e2
] = ((s
>> 16) & 0xff);
342 case R_MEP_GPREL
: /* ----------------fedcba9876543210 */
343 s
-= mep_sdaoff_base(rel
->r_offset
);
344 if (-32768 > s
|| s
> 32767) r
= bfd_reloc_overflow
;
345 byte
[2^e2
] = ((s
>> 8) & 0xff);
346 byte
[3^e2
] = (s
& 0xff);
348 case R_MEP_TPREL
: /* ----------------fedcba9876543210 */
349 s
-= mep_tpoff_base(rel
->r_offset
);
350 if (-32768 > s
|| s
> 32767) r
= bfd_reloc_overflow
;
351 byte
[2^e2
] = ((s
>> 8) & 0xff);
352 byte
[3^e2
] = (s
& 0xff);
354 case R_MEP_TPREL7
: /* ---------6543210 */
355 u
-= mep_tpoff_base(rel
->r_offset
);
356 if (u
> 127) r
= bfd_reloc_overflow
;
357 byte
[1^e2
] = (byte
[1^e2
] & 0x80) | (u
& 0x7f);
359 case R_MEP_TPREL7A2
: /* ---------654321- */
360 u
-= mep_tpoff_base(rel
->r_offset
);
361 if (u
> 127) r
= bfd_reloc_overflow
;
362 byte
[1^e2
] = (byte
[1^e2
] & 0x81) | (u
& 0x7e);
364 case R_MEP_TPREL7A4
: /* ---------65432-- */
365 u
-= mep_tpoff_base(rel
->r_offset
);
366 if (u
> 127) r
= bfd_reloc_overflow
;
367 byte
[1^e2
] = (byte
[1^e2
] & 0x83) | (u
& 0x7c);
369 case R_MEP_UIMM24
: /* --------76543210nmlkjihgfedcba98 */
370 if (u
> 16777215) r
= bfd_reloc_overflow
;
371 byte
[1^e2
] = (u
& 0xff);
372 byte
[2^e2
] = ((u
>> 16) & 0xff);
373 byte
[3^e2
] = ((u
>> 8) & 0xff);
375 case R_MEP_ADDR24A4
: /* --------765432--nmlkjihgfedcba98 */
376 if (u
> 16777215) r
= bfd_reloc_overflow
;
377 byte
[1^e2
] = (byte
[1^e2
] & 0x03) | (u
& 0xfc);
378 byte
[2^e2
] = ((u
>> 16) & 0xff);
379 byte
[3^e2
] = ((u
>> 8) & 0xff);
381 case R_MEP_GNU_VTINHERIT
: /* ---------------- */
383 case R_MEP_GNU_VTENTRY
: /* ---------------- */
393 /* Set the howto pointer for a MEP ELF reloc. */
396 mep_info_to_howto_rela
397 (bfd
* abfd ATTRIBUTE_UNUSED
,
399 Elf_Internal_Rela
* dst
)
403 r_type
= ELF32_R_TYPE (dst
->r_info
);
404 cache_ptr
->howto
= & mep_elf_howto_table
[r_type
];
407 /* Relocate a MEP ELF section.
408 There is some attempt to make this function usable for many architectures,
409 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
410 if only to serve as a learning tool.
412 The RELOCATE_SECTION function is called by the new ELF backend linker
413 to handle the relocations for a section.
415 The relocs are always passed as Rela structures; if the section
416 actually uses Rel structures, the r_addend field will always be
419 This function is responsible for adjusting the section contents as
420 necessary, and (if using Rela relocs and generating a relocatable
421 output file) adjusting the reloc addend as necessary.
423 This function does not have to worry about setting the reloc
424 address or the reloc symbol index.
426 LOCAL_SYMS is a pointer to the swapped in local symbols.
428 LOCAL_SECTIONS is an array giving the section in the input file
429 corresponding to the st_shndx field of each local symbol.
431 The global hash table entry for the global symbols can be found
432 via elf_sym_hashes (input_bfd).
434 When generating relocatable output, this function must handle
435 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
436 going to be the section symbol corresponding to the output
437 section, which means that the addend must be adjusted
441 mep_elf_relocate_section
442 (bfd
* output_bfd ATTRIBUTE_UNUSED
,
443 struct bfd_link_info
* info
,
445 asection
* input_section
,
447 Elf_Internal_Rela
* relocs
,
448 Elf_Internal_Sym
* local_syms
,
449 asection
** local_sections
)
451 Elf_Internal_Shdr
* symtab_hdr
;
452 struct elf_link_hash_entry
** sym_hashes
;
453 Elf_Internal_Rela
* rel
;
454 Elf_Internal_Rela
* relend
;
456 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
457 sym_hashes
= elf_sym_hashes (input_bfd
);
458 relend
= relocs
+ input_section
->reloc_count
;
462 for (rel
= relocs
; rel
< relend
; rel
++)
464 reloc_howto_type
* howto
;
465 unsigned long r_symndx
;
466 Elf_Internal_Sym
* sym
;
468 struct elf_link_hash_entry
* h
;
470 bfd_reloc_status_type r
;
471 const char * name
= NULL
;
474 r_type
= ELF32_R_TYPE (rel
->r_info
);
475 r_symndx
= ELF32_R_SYM (rel
->r_info
);
476 howto
= mep_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
481 if (r_symndx
< symtab_hdr
->sh_info
)
483 sym
= local_syms
+ r_symndx
;
484 sec
= local_sections
[r_symndx
];
485 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
487 name
= bfd_elf_string_from_elf_section
488 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
489 name
= (name
== NULL
) ? bfd_section_name (input_bfd
, sec
) : name
;
493 bfd_boolean warned
, unresolved_reloc
, ignored
;
495 RELOC_FOR_GLOBAL_SYMBOL(info
, input_bfd
, input_section
, rel
,
496 r_symndx
, symtab_hdr
, sym_hashes
,
498 unresolved_reloc
, warned
, ignored
);
500 name
= h
->root
.root
.string
;
503 if (sec
!= NULL
&& discarded_section (sec
))
504 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
505 rel
, 1, relend
, howto
, 0, contents
);
507 if (info
->relocatable
)
510 if (r_type
== R_RELC
)
511 r
= bfd_elf_perform_complex_relocation (input_bfd
, input_section
,
512 contents
, rel
, relocation
);
514 r
= mep_final_link_relocate (howto
, input_bfd
, input_section
,
515 contents
, rel
, relocation
);
517 if (r
!= bfd_reloc_ok
)
519 const char * msg
= (const char *) NULL
;
523 case bfd_reloc_overflow
:
524 r
= info
->callbacks
->reloc_overflow
525 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
526 input_bfd
, input_section
, rel
->r_offset
);
529 case bfd_reloc_undefined
:
530 r
= info
->callbacks
->undefined_symbol
531 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
534 case bfd_reloc_outofrange
:
535 msg
= _("internal error: out of range error");
538 case bfd_reloc_notsupported
:
539 msg
= _("internal error: unsupported relocation error");
542 case bfd_reloc_dangerous
:
543 msg
= _("internal error: dangerous relocation");
547 msg
= _("internal error: unknown error");
552 r
= info
->callbacks
->warning
553 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
561 info
->callbacks
->undefined_symbol
562 (info
, "__tpbase", input_bfd
, input_section
, warn_tp
-1, TRUE
);
564 info
->callbacks
->undefined_symbol
565 (info
, "__sdabase", input_bfd
, input_section
, warn_sda
-1, TRUE
);
566 if (warn_sda
|| warn_tp
)
572 /* Function to set the ELF flag bits. */
575 mep_elf_set_private_flags (bfd
* abfd
,
578 elf_elfheader (abfd
)->e_flags
= flags
;
579 elf_flags_init (abfd
) = TRUE
;
583 /* Merge backend specific data from an object file to the output
584 object file when linking. */
587 mep_elf_merge_private_bfd_data (bfd
* ibfd
, bfd
* obfd
)
589 static bfd
*last_ibfd
= 0;
590 flagword old_flags
, new_flags
;
591 flagword old_partial
, new_partial
;
593 /* Check if we have the same endianness. */
594 if (_bfd_generic_verify_endian_match (ibfd
, obfd
) == FALSE
)
597 new_flags
= elf_elfheader (ibfd
)->e_flags
;
598 old_flags
= elf_elfheader (obfd
)->e_flags
;
601 _bfd_error_handler ("%B: old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s",
602 ibfd
, old_flags
, new_flags
, elf_flags_init (obfd
) ? "yes" : "no");
605 /* First call, no flags set. */
606 if (!elf_flags_init (obfd
))
608 elf_flags_init (obfd
) = TRUE
;
609 old_flags
= new_flags
;
611 else if ((new_flags
| old_flags
) & EF_MEP_LIBRARY
)
613 /* Non-library flags trump library flags. The choice doesn't really
614 matter if both OLD_FLAGS and NEW_FLAGS have EF_MEP_LIBRARY set. */
615 if (old_flags
& EF_MEP_LIBRARY
)
616 old_flags
= new_flags
;
620 /* Make sure they're for the same mach. Allow upgrade from the "mep"
622 new_partial
= (new_flags
& EF_MEP_CPU_MASK
);
623 old_partial
= (old_flags
& EF_MEP_CPU_MASK
);
624 if (new_partial
== old_partial
)
626 else if (new_partial
== EF_MEP_CPU_MEP
)
628 else if (old_partial
== EF_MEP_CPU_MEP
)
629 old_flags
= (old_flags
& ~EF_MEP_CPU_MASK
) | new_partial
;
632 _bfd_error_handler (_("%B and %B are for different cores"), last_ibfd
, ibfd
);
633 bfd_set_error (bfd_error_invalid_target
);
637 /* Make sure they're for the same me_module. Allow basic config to
638 mix with any other. */
639 new_partial
= (new_flags
& EF_MEP_INDEX_MASK
);
640 old_partial
= (old_flags
& EF_MEP_INDEX_MASK
);
641 if (new_partial
== old_partial
)
643 else if (new_partial
== 0)
645 else if (old_partial
== 0)
646 old_flags
= (old_flags
& ~EF_MEP_INDEX_MASK
) | new_partial
;
649 _bfd_error_handler (_("%B and %B are for different configurations"), last_ibfd
, ibfd
);
650 bfd_set_error (bfd_error_invalid_target
);
655 elf_elfheader (obfd
)->e_flags
= old_flags
;
660 /* This will be edited by the MeP configration tool. */
661 static const char * config_names
[] =
664 /* start-mepcfgtool */
669 static const char * core_names
[] =
671 "MeP", "MeP-c2", "MeP-c3", "MeP-h1"
675 mep_elf_print_private_bfd_data (bfd
* abfd
, void * ptr
)
677 FILE * file
= (FILE *) ptr
;
678 flagword flags
, partial_flags
;
680 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
682 /* Print normal ELF private data. */
683 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
685 flags
= elf_elfheader (abfd
)->e_flags
;
686 fprintf (file
, _("private flags = 0x%lx"), (unsigned long) flags
);
688 partial_flags
= (flags
& EF_MEP_CPU_MASK
) >> 24;
689 if (partial_flags
< ARRAY_SIZE (core_names
))
690 fprintf (file
, " core: %s", core_names
[(long)partial_flags
]);
692 partial_flags
= flags
& EF_MEP_INDEX_MASK
;
693 if (partial_flags
< ARRAY_SIZE (config_names
))
694 fprintf (file
, " me_module: %s", config_names
[(long)partial_flags
]);
701 /* Return the machine subcode from the ELF e_flags header. */
704 elf32_mep_machine (bfd
* abfd
)
706 switch (elf_elfheader (abfd
)->e_flags
& EF_MEP_CPU_MASK
)
709 case EF_MEP_CPU_C2
: return bfd_mach_mep
;
710 case EF_MEP_CPU_C3
: return bfd_mach_mep
;
711 case EF_MEP_CPU_C4
: return bfd_mach_mep
;
712 case EF_MEP_CPU_C5
: return bfd_mach_mep_c5
;
713 case EF_MEP_CPU_H1
: return bfd_mach_mep_h1
;
720 mep_elf_object_p (bfd
* abfd
)
722 bfd_default_set_arch_mach (abfd
, bfd_arch_mep
, elf32_mep_machine (abfd
));
727 mep_elf_section_flags (flagword
* flags
, const Elf_Internal_Shdr
* hdr
)
729 if (hdr
->sh_flags
& SHF_MEP_VLIW
)
730 * flags
|= SEC_MEP_VLIW
;
735 mep_elf_fake_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
736 Elf_Internal_Shdr
* hdr
,
739 if (sec
->flags
& SEC_MEP_VLIW
)
740 hdr
->sh_flags
|= SHF_MEP_VLIW
;
745 #define ELF_ARCH bfd_arch_mep
746 #define ELF_MACHINE_CODE EM_CYGNUS_MEP
747 #define ELF_MAXPAGESIZE 0x1000
749 #define TARGET_BIG_SYM bfd_elf32_mep_vec
750 #define TARGET_BIG_NAME "elf32-mep"
752 #define TARGET_LITTLE_SYM bfd_elf32_mep_little_vec
753 #define TARGET_LITTLE_NAME "elf32-mep-little"
755 #define elf_info_to_howto_rel NULL
756 #define elf_info_to_howto mep_info_to_howto_rela
757 #define elf_backend_relocate_section mep_elf_relocate_section
758 #define elf_backend_object_p mep_elf_object_p
759 #define elf_backend_section_flags mep_elf_section_flags
760 #define elf_backend_fake_sections mep_elf_fake_sections
762 #define bfd_elf32_bfd_reloc_type_lookup mep_reloc_type_lookup
763 #define bfd_elf32_bfd_reloc_name_lookup mep_reloc_name_lookup
764 #define bfd_elf32_bfd_set_private_flags mep_elf_set_private_flags
765 #define bfd_elf32_bfd_merge_private_bfd_data mep_elf_merge_private_bfd_data
766 #define bfd_elf32_bfd_print_private_bfd_data mep_elf_print_private_bfd_data
768 #define elf_backend_rela_normal 1
770 #include "elf32-target.h"