1 /* BFD back-end for ieee-695 objects.
2 Copyright (C) 1990-2017 Free Software Foundation, Inc.
4 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
24 #define KEEPMINUSPCININST 0
26 /* IEEE 695 format is a stream of records, which we parse using a simple one-
27 token (which is one byte in this lexicon) lookahead recursive decent
35 #include "safe-ctype.h"
36 #include "libiberty.h"
38 struct output_buffer_struct
44 static unsigned char *output_ptr_start
;
45 static unsigned char *output_ptr
;
46 static unsigned char *output_ptr_end
;
47 static unsigned char *input_ptr_start
;
48 static unsigned char *input_ptr
;
49 static unsigned char *input_ptr_end
;
50 static bfd
*input_bfd
;
51 static bfd
*output_bfd
;
52 static int output_buffer
;
55 static void block (void);
57 /* Functions for writing to ieee files in the strange way that the
61 ieee_write_byte (bfd
*abfd
, int barg
)
66 if (bfd_bwrite ((void *) &byte
, (bfd_size_type
) 1, abfd
) != 1)
72 ieee_write_2bytes (bfd
*abfd
, int bytes
)
76 buffer
[0] = bytes
>> 8;
77 buffer
[1] = bytes
& 0xff;
78 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) 2, abfd
) != 2)
84 ieee_write_int (bfd
*abfd
, bfd_vma value
)
88 if (! ieee_write_byte (abfd
, (bfd_byte
) value
))
95 /* How many significant bytes ? */
96 /* FIXME FOR LONGER INTS. */
97 if (value
& 0xff000000)
99 else if (value
& 0x00ff0000)
101 else if (value
& 0x0000ff00)
106 if (! ieee_write_byte (abfd
,
107 (bfd_byte
) ((int) ieee_number_repeat_start_enum
113 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 24)))
117 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 16)))
121 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 8)))
125 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
)))
134 ieee_write_id (bfd
*abfd
, const char *id
)
136 size_t length
= strlen (id
);
140 if (! ieee_write_byte (abfd
, (bfd_byte
) length
))
143 else if (length
< 255)
145 if (! ieee_write_byte (abfd
, ieee_extension_length_1_enum
)
146 || ! ieee_write_byte (abfd
, (bfd_byte
) length
))
149 else if (length
< 65535)
151 if (! ieee_write_byte (abfd
, ieee_extension_length_2_enum
)
152 || ! ieee_write_2bytes (abfd
, (int) length
))
158 /* xgettext:c-format */
159 (_("%B: string too long (%d chars, max 65535)"), abfd
, length
);
160 bfd_set_error (bfd_error_invalid_operation
);
164 if (bfd_bwrite ((void *) id
, (bfd_size_type
) length
, abfd
) != length
)
169 /* Functions for reading from ieee files in the strange way that the
170 standard requires. */
172 #define this_byte(ieee) *((ieee)->input_p)
173 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
176 next_byte (common_header_type
* ieee
)
180 return ieee
->input_p
< ieee
->last_byte
;
183 static unsigned short
184 read_2bytes (common_header_type
*ieee
)
186 unsigned char c1
= this_byte_and_next (ieee
);
187 unsigned char c2
= this_byte_and_next (ieee
);
189 return (c1
<< 8) | c2
;
193 bfd_get_string (common_header_type
*ieee
, char *string
, size_t length
)
197 for (i
= 0; i
< length
; i
++)
198 string
[i
] = this_byte_and_next (ieee
);
202 read_id (common_header_type
*ieee
)
207 length
= this_byte_and_next (ieee
);
209 /* Simple string of length 0 to 127. */
212 else if (length
== 0xde)
213 /* Length is next byte, allowing 0..255. */
214 length
= this_byte_and_next (ieee
);
216 else if (length
== 0xdf)
218 /* Length is next two bytes, allowing 0..65535. */
219 length
= this_byte_and_next (ieee
);
220 length
= (length
* 256) + this_byte_and_next (ieee
);
223 /* Buy memory and read string. */
224 string
= bfd_alloc (ieee
->abfd
, (bfd_size_type
) length
+ 1);
227 bfd_get_string (ieee
, string
, length
);
233 ieee_write_expression (bfd
*abfd
,
239 unsigned int term_count
= 0;
243 if (! ieee_write_int (abfd
, value
))
248 /* Badly formatted binaries can have a missing symbol,
249 so test here to prevent a seg fault. */
252 if (bfd_is_com_section (symbol
->section
)
253 || bfd_is_und_section (symbol
->section
))
255 /* Def of a common symbol. */
256 if (! ieee_write_byte (abfd
, ieee_variable_X_enum
)
257 || ! ieee_write_int (abfd
, symbol
->value
))
261 else if (! bfd_is_abs_section (symbol
->section
))
263 /* Ref to defined symbol - */
264 if (symbol
->flags
& BSF_GLOBAL
)
266 if (! ieee_write_byte (abfd
, ieee_variable_I_enum
)
267 || ! ieee_write_int (abfd
, symbol
->value
))
271 else if (symbol
->flags
& (BSF_LOCAL
| BSF_SECTION_SYM
))
273 /* This is a reference to a defined local symbol. We can
274 easily do a local as a section+offset. */
275 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
)
276 || ! ieee_write_byte (abfd
,
277 (bfd_byte
) (symbol
->section
->index
278 + IEEE_SECTION_NUMBER_BASE
)))
282 if (symbol
->value
!= 0)
284 if (! ieee_write_int (abfd
, symbol
->value
))
292 /* xgettext:c-format */
293 (_("%B: unrecognized symbol `%s' flags 0x%x"),
294 abfd
, bfd_asymbol_name (symbol
), symbol
->flags
);
295 bfd_set_error (bfd_error_invalid_operation
);
303 /* Subtract the pc from here by asking for PC of this section. */
304 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
)
305 || ! ieee_write_byte (abfd
,
306 (bfd_byte
) (sindex
+ IEEE_SECTION_NUMBER_BASE
))
307 || ! ieee_write_byte (abfd
, ieee_function_minus_enum
))
311 /* Handle the degenerate case of a 0 address. */
313 if (! ieee_write_int (abfd
, (bfd_vma
) 0))
316 while (term_count
> 1)
318 if (! ieee_write_byte (abfd
, ieee_function_plus_enum
))
326 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
329 ieee_write_int5 (bfd_byte
*buffer
, bfd_vma value
)
331 buffer
[0] = (bfd_byte
) ieee_number_repeat_4_enum
;
332 buffer
[1] = (value
>> 24) & 0xff;
333 buffer
[2] = (value
>> 16) & 0xff;
334 buffer
[3] = (value
>> 8) & 0xff;
335 buffer
[4] = (value
>> 0) & 0xff;
339 ieee_write_int5_out (bfd
*abfd
, bfd_vma value
)
343 ieee_write_int5 (b
, value
);
344 if (bfd_bwrite ((void *) b
, (bfd_size_type
) 5, abfd
) != 5)
350 parse_int (common_header_type
*ieee
, bfd_vma
*value_ptr
)
352 int value
= this_byte (ieee
);
355 if (value
>= 0 && value
<= 127)
358 return next_byte (ieee
);
360 else if (value
>= 0x80 && value
<= 0x88)
362 unsigned int count
= value
& 0xf;
365 if (! next_byte (ieee
))
369 result
= (result
<< 8) | this_byte_and_next (ieee
);
379 parse_i (common_header_type
*ieee
, bfd_boolean
*ok
)
382 *ok
= parse_int (ieee
, &x
);
387 must_parse_int (common_header_type
*ieee
)
390 BFD_ASSERT (parse_int (ieee
, &result
));
398 ieee_symbol_index_type symbol
;
402 #if KEEPMINUSPCININST
404 #define SRC_MASK(arg) arg
405 #define PCREL_OFFSET FALSE
409 #define SRC_MASK(arg) 0
410 #define PCREL_OFFSET TRUE
414 static reloc_howto_type abs32_howto
=
421 complain_overflow_bitfield
,
429 static reloc_howto_type abs16_howto
=
436 complain_overflow_bitfield
,
444 static reloc_howto_type abs8_howto
=
451 complain_overflow_bitfield
,
459 static reloc_howto_type rel32_howto
=
466 complain_overflow_signed
,
470 SRC_MASK (0xffffffff),
474 static reloc_howto_type rel16_howto
=
481 complain_overflow_signed
,
485 SRC_MASK (0x0000ffff),
489 static reloc_howto_type rel8_howto
=
496 complain_overflow_signed
,
500 SRC_MASK (0x000000ff),
504 static ieee_symbol_index_type NOSYMBOL
= {0, 0};
507 parse_expression (ieee_data_type
*ieee
,
509 ieee_symbol_index_type
*symbol
,
515 bfd_boolean loop
= TRUE
;
516 ieee_value_type stack
[10];
517 ieee_value_type
*sp
= stack
;
526 /* The stack pointer always points to the next unused location. */
527 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
528 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
530 while (loop
&& ieee
->h
.input_p
< ieee
->h
.last_byte
)
532 switch (this_byte (&(ieee
->h
)))
534 case ieee_variable_P_enum
:
535 /* P variable, current program counter for section n. */
539 if (! next_byte (&(ieee
->h
)))
542 section_n
= must_parse_int (&(ieee
->h
));
544 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
548 case ieee_variable_L_enum
:
549 /* L variable address of section N. */
550 if (! next_byte (&(ieee
->h
)))
552 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
555 case ieee_variable_R_enum
:
556 /* R variable, logical address of section module. */
557 /* FIXME, this should be different to L. */
558 if (! next_byte (&(ieee
->h
)))
560 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
563 case ieee_variable_S_enum
:
564 /* S variable, size in MAUS of section module. */
565 if (! next_byte (&(ieee
->h
)))
569 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->size
);
572 case ieee_variable_I_enum
:
573 /* Push the address of variable n. */
575 ieee_symbol_index_type sy
;
577 if (! next_byte (&(ieee
->h
)))
579 sy
.index
= (int) must_parse_int (&(ieee
->h
));
582 PUSH (sy
, bfd_abs_section_ptr
, 0);
586 case ieee_variable_X_enum
:
587 /* Push the address of external variable n. */
589 ieee_symbol_index_type sy
;
591 if (! next_byte (&(ieee
->h
)))
594 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
597 PUSH (sy
, bfd_und_section_ptr
, 0);
601 case ieee_function_minus_enum
:
603 bfd_vma value1
, value2
;
604 asection
*section1
, *section_dummy
;
605 ieee_symbol_index_type sy
;
607 if (! next_byte (&(ieee
->h
)))
610 POP (sy
, section1
, value1
);
611 POP (sy
, section_dummy
, value2
);
612 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
616 case ieee_function_plus_enum
:
618 bfd_vma value1
, value2
;
621 ieee_symbol_index_type sy1
;
622 ieee_symbol_index_type sy2
;
624 if (! next_byte (&(ieee
->h
)))
627 POP (sy1
, section1
, value1
);
628 POP (sy2
, section2
, value2
);
629 PUSH (sy1
.letter
? sy1
: sy2
,
630 bfd_is_abs_section (section1
) ? section2
: section1
,
639 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
640 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
641 if (parse_int (&(ieee
->h
), &va
))
643 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
646 /* Thats all that we can understand. */
652 /* As far as I can see there is a bug in the Microtec IEEE output
653 which I'm using to scan, whereby the comma operator is omitted
654 sometimes in an expression, giving expressions with too many
655 terms. We can tell if that's the case by ensuring that
656 sp == stack here. If not, then we've pushed something too far,
657 so we keep adding. */
658 while (sp
!= stack
+ 1)
661 ieee_symbol_index_type sy1
;
663 POP (sy1
, section1
, *extra
);
668 POP (*symbol
, dummy
, *value
);
675 #define ieee_pos(ieee) \
676 (ieee->h.input_p - ieee->h.first_byte)
678 /* Find the first part of the ieee file after HERE. */
681 ieee_part_after (ieee_data_type
*ieee
, file_ptr here
)
684 file_ptr after
= ieee
->w
.r
.me_record
;
686 /* File parts can come in any order, except that module end is
687 guaranteed to be last (and the header first). */
688 for (part
= 0; part
< N_W_VARIABLES
; part
++)
689 if (ieee
->w
.offset
[part
] > here
&& after
> ieee
->w
.offset
[part
])
690 after
= ieee
->w
.offset
[part
];
696 ieee_seek (ieee_data_type
* ieee
, file_ptr offset
)
698 /* PR 17512: file: 017-1157-0.004. */
699 if (offset
< 0 || (bfd_size_type
) offset
>= ieee
->h
.total_amt
)
701 ieee
->h
.input_p
= ieee
->h
.first_byte
+ ieee
->h
.total_amt
;
702 ieee
->h
.last_byte
= ieee
->h
.input_p
;
706 ieee
->h
.input_p
= ieee
->h
.first_byte
+ offset
;
707 ieee
->h
.last_byte
= (ieee
->h
.first_byte
+ ieee_part_after (ieee
, offset
));
711 static unsigned int last_index
;
712 static char last_type
; /* Is the index for an X or a D. */
714 static ieee_symbol_type
*
715 get_symbol (bfd
*abfd ATTRIBUTE_UNUSED
,
716 ieee_data_type
*ieee
,
717 ieee_symbol_type
*last_symbol
,
718 unsigned int *symbol_count
,
719 ieee_symbol_type
***pptr
,
720 unsigned int *max_index
,
723 /* Need a new symbol. */
724 unsigned int new_index
= must_parse_int (&(ieee
->h
));
726 if (new_index
!= last_index
|| this_type
!= last_type
)
728 ieee_symbol_type
*new_symbol
;
729 bfd_size_type amt
= sizeof (ieee_symbol_type
);
731 new_symbol
= bfd_alloc (ieee
->h
.abfd
, amt
);
735 new_symbol
->index
= new_index
;
736 last_index
= new_index
;
739 *pptr
= &new_symbol
->next
;
740 if (new_index
> *max_index
)
741 *max_index
= new_index
;
743 last_type
= this_type
;
744 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
751 ieee_slurp_external_symbols (bfd
*abfd
)
753 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
754 file_ptr offset
= ieee
->w
.r
.external_part
;
756 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
757 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
758 ieee_symbol_type
*symbol
= NULL
;
759 unsigned int symbol_count
= 0;
760 bfd_boolean loop
= TRUE
;
762 last_index
= 0xffffff;
763 ieee
->symbol_table_full
= TRUE
;
765 if (! ieee_seek (ieee
, offset
))
770 switch (this_byte (&(ieee
->h
)))
773 if (! next_byte (&(ieee
->h
)))
776 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
778 & ieee
->external_symbol_max_index
, 'I');
782 symbol
->symbol
.the_bfd
= abfd
;
783 symbol
->symbol
.name
= read_id (&(ieee
->h
));
784 symbol
->symbol
.udata
.p
= NULL
;
785 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
788 case ieee_external_symbol_enum
:
789 if (! next_byte (&(ieee
->h
)))
792 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
794 &ieee
->external_symbol_max_index
, 'D');
798 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
800 symbol
->symbol
.the_bfd
= abfd
;
801 symbol
->symbol
.name
= read_id (&(ieee
->h
));
802 symbol
->symbol
.udata
.p
= NULL
;
803 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
805 case ieee_attribute_record_enum
>> 8:
807 unsigned int symbol_name_index
;
808 unsigned int symbol_type_index
;
809 unsigned int symbol_attribute_def
;
812 switch (read_2bytes (&ieee
->h
))
814 case ieee_attribute_record_enum
:
815 symbol_name_index
= must_parse_int (&(ieee
->h
));
816 symbol_type_index
= must_parse_int (&(ieee
->h
));
817 (void) symbol_type_index
;
818 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
819 switch (symbol_attribute_def
)
823 parse_int (&ieee
->h
, &value
);
827 /* xgettext:c-format */
828 (_("%B: unimplemented ATI record %u for symbol %u"),
829 abfd
, symbol_attribute_def
, symbol_name_index
);
830 bfd_set_error (bfd_error_bad_value
);
835 case ieee_external_reference_info_record_enum
:
836 /* Skip over ATX record. */
837 parse_int (&(ieee
->h
), &value
);
838 parse_int (&(ieee
->h
), &value
);
839 parse_int (&(ieee
->h
), &value
);
840 parse_int (&(ieee
->h
), &value
);
842 case ieee_atn_record_enum
:
843 /* We may get call optimization information here,
844 which we just ignore. The format is
845 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
846 parse_int (&ieee
->h
, &value
);
847 parse_int (&ieee
->h
, &value
);
848 parse_int (&ieee
->h
, &value
);
852 /* xgettext:c-format */
853 (_("%B: unexpected ATN type %d in external part"),
855 bfd_set_error (bfd_error_bad_value
);
858 parse_int (&ieee
->h
, &value
);
859 parse_int (&ieee
->h
, &value
);
866 switch (read_2bytes (&ieee
->h
))
868 case ieee_asn_record_enum
:
869 parse_int (&ieee
->h
, &val1
);
870 parse_int (&ieee
->h
, &val1
);
875 (_("%B: unexpected type after ATN"), abfd
);
876 bfd_set_error (bfd_error_bad_value
);
884 case ieee_value_record_enum
>> 8:
886 unsigned int symbol_name_index
;
887 ieee_symbol_index_type symbol_ignore
;
888 bfd_boolean pcrel_ignore
;
891 if (! next_byte (&(ieee
->h
)))
893 if (! next_byte (&(ieee
->h
)))
896 symbol_name_index
= must_parse_int (&(ieee
->h
));
897 (void) symbol_name_index
;
898 if (! parse_expression (ieee
,
899 &symbol
->symbol
.value
,
903 &symbol
->symbol
.section
))
906 /* Fully linked IEEE-695 files tend to give every symbol
907 an absolute value. Try to convert that back into a
908 section relative value. FIXME: This won't always to
910 if (bfd_is_abs_section (symbol
->symbol
.section
)
911 && (abfd
->flags
& HAS_RELOC
) == 0)
916 val
= symbol
->symbol
.value
;
917 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
919 if (val
>= s
->vma
&& val
< s
->vma
+ s
->size
)
921 symbol
->symbol
.section
= s
;
922 symbol
->symbol
.value
-= s
->vma
;
928 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
932 case ieee_weak_external_reference_enum
:
937 if (! next_byte (&(ieee
->h
)))
940 /* Throw away the external reference index. */
941 (void) must_parse_int (&(ieee
->h
));
942 /* Fetch the default size if not resolved. */
943 size
= must_parse_int (&(ieee
->h
));
944 /* Fetch the default value if available. */
945 if (! parse_int (&(ieee
->h
), &value
))
947 /* This turns into a common. */
948 symbol
->symbol
.section
= bfd_com_section_ptr
;
949 symbol
->symbol
.value
= size
;
953 case ieee_external_reference_enum
:
954 if (! next_byte (&(ieee
->h
)))
957 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
959 &ieee
->external_reference_max_index
, 'X');
963 symbol
->symbol
.the_bfd
= abfd
;
964 symbol
->symbol
.name
= read_id (&(ieee
->h
));
965 symbol
->symbol
.udata
.p
= NULL
;
966 symbol
->symbol
.section
= bfd_und_section_ptr
;
967 symbol
->symbol
.value
= (bfd_vma
) 0;
968 symbol
->symbol
.flags
= 0;
970 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
978 if (ieee
->external_symbol_max_index
!= 0)
980 ieee
->external_symbol_count
=
981 ieee
->external_symbol_max_index
-
982 ieee
->external_symbol_min_index
+ 1;
985 ieee
->external_symbol_count
= 0;
987 if (ieee
->external_reference_max_index
!= 0)
989 ieee
->external_reference_count
=
990 ieee
->external_reference_max_index
-
991 ieee
->external_reference_min_index
+ 1;
994 ieee
->external_reference_count
= 0;
997 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
999 if (symbol_count
!= abfd
->symcount
)
1000 /* There are gaps in the table -- */
1001 ieee
->symbol_table_full
= FALSE
;
1003 *prev_symbols_ptr
= NULL
;
1004 *prev_reference_ptr
= NULL
;
1010 ieee_slurp_symbol_table (bfd
*abfd
)
1012 if (! IEEE_DATA (abfd
)->read_symbols
)
1014 if (! ieee_slurp_external_symbols (abfd
))
1016 IEEE_DATA (abfd
)->read_symbols
= TRUE
;
1022 ieee_get_symtab_upper_bound (bfd
*abfd
)
1024 if (! ieee_slurp_symbol_table (abfd
))
1027 return (abfd
->symcount
!= 0) ?
1028 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
1031 /* Move from our internal lists to the canon table, and insert in
1032 symbol index order. */
1034 extern const bfd_target ieee_vec
;
1037 ieee_canonicalize_symtab (bfd
*abfd
, asymbol
**location
)
1039 ieee_symbol_type
*symp
;
1040 static bfd dummy_bfd
;
1041 static asymbol empty_symbol
=
1049 /* K&R compilers can't initialise unions. */
1056 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1058 dummy_bfd
.xvec
= &ieee_vec
;
1059 if (! ieee_slurp_symbol_table (abfd
))
1062 if (! ieee
->symbol_table_full
)
1064 /* Arrgh - there are gaps in the table, run through and fill them
1065 up with pointers to a null place. */
1068 for (i
= 0; i
< abfd
->symcount
; i
++)
1069 location
[i
] = &empty_symbol
;
1072 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1073 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1074 symp
!= (ieee_symbol_type
*) NULL
;
1076 /* Place into table at correct index locations. */
1077 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1079 /* The external refs are indexed in a bit. */
1080 ieee
->external_reference_base_offset
=
1081 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1083 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1084 symp
!= (ieee_symbol_type
*) NULL
;
1086 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1091 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1093 return abfd
->symcount
;
1097 get_section_entry (bfd
*abfd
, ieee_data_type
*ieee
, unsigned int sindex
)
1099 if (sindex
>= ieee
->section_table_size
)
1105 c
= ieee
->section_table_size
;
1112 amt
*= sizeof (asection
*);
1113 n
= bfd_realloc (ieee
->section_table
, amt
);
1117 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1120 ieee
->section_table
= n
;
1121 ieee
->section_table_size
= c
;
1124 if (ieee
->section_table
[sindex
] == (asection
*) NULL
)
1126 char *tmp
= bfd_alloc (abfd
, (bfd_size_type
) 11);
1131 sprintf (tmp
, " fsec%4d", sindex
);
1132 section
= bfd_make_section (abfd
, tmp
);
1133 ieee
->section_table
[sindex
] = section
;
1134 section
->target_index
= sindex
;
1135 ieee
->section_table
[sindex
] = section
;
1137 return ieee
->section_table
[sindex
];
1141 ieee_slurp_sections (bfd
*abfd
)
1143 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1144 file_ptr offset
= ieee
->w
.r
.section_part
;
1149 bfd_byte section_type
[3];
1151 if (! ieee_seek (ieee
, offset
))
1156 switch (this_byte (&(ieee
->h
)))
1158 case ieee_section_type_enum
:
1161 unsigned int section_index
;
1163 if (! next_byte (&(ieee
->h
)))
1165 section_index
= must_parse_int (&(ieee
->h
));
1167 section
= get_section_entry (abfd
, ieee
, section_index
);
1169 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1171 /* Set minimal section attributes. Attributes are
1172 extended later, based on section contents. */
1173 switch (section_type
[0])
1176 /* Normal attributes for absolute sections. */
1177 section_type
[1] = this_byte (&(ieee
->h
));
1178 section
->flags
= SEC_ALLOC
;
1179 switch (section_type
[1])
1181 /* AS Absolute section attributes. */
1183 if (! next_byte (&(ieee
->h
)))
1185 section_type
[2] = this_byte (&(ieee
->h
));
1186 switch (section_type
[2])
1190 if (! next_byte (&(ieee
->h
)))
1192 section
->flags
|= SEC_CODE
;
1196 if (! next_byte (&(ieee
->h
)))
1198 section
->flags
|= SEC_DATA
;
1201 if (! next_byte (&(ieee
->h
)))
1203 /* Normal rom data. */
1204 section
->flags
|= SEC_ROM
| SEC_DATA
;
1212 /* Named relocatable sections (type C). */
1214 section_type
[1] = this_byte (&(ieee
->h
));
1215 section
->flags
= SEC_ALLOC
;
1216 switch (section_type
[1])
1218 case 0xD0: /* Normal code (CP). */
1219 if (! next_byte (&(ieee
->h
)))
1221 section
->flags
|= SEC_CODE
;
1223 case 0xC4: /* Normal data (CD). */
1224 if (! next_byte (&(ieee
->h
)))
1226 section
->flags
|= SEC_DATA
;
1228 case 0xD2: /* Normal rom data (CR). */
1229 if (! next_byte (&(ieee
->h
)))
1231 section
->flags
|= SEC_ROM
| SEC_DATA
;
1238 /* Read section name, use it if non empty. */
1239 name
= read_id (&ieee
->h
);
1241 section
->name
= name
;
1243 /* Skip these fields, which we don't care about. */
1245 bfd_vma parent
, brother
, context
;
1247 parse_int (&(ieee
->h
), &parent
);
1248 parse_int (&(ieee
->h
), &brother
);
1249 parse_int (&(ieee
->h
), &context
);
1253 case ieee_section_alignment_enum
:
1255 unsigned int section_index
;
1259 if (! next_byte (&(ieee
->h
)))
1261 section_index
= must_parse_int (&ieee
->h
);
1262 section
= get_section_entry (abfd
, ieee
, section_index
);
1263 if (section_index
> ieee
->section_count
)
1264 ieee
->section_count
= section_index
;
1266 section
->alignment_power
=
1267 bfd_log2 (must_parse_int (&ieee
->h
));
1268 (void) parse_int (&(ieee
->h
), &value
);
1271 case ieee_e2_first_byte_enum
:
1274 ieee_record_enum_type t
;
1276 t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1279 case ieee_section_size_enum
:
1280 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1281 section
->size
= must_parse_int (&(ieee
->h
));
1283 case ieee_physical_region_size_enum
:
1284 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1285 section
->size
= must_parse_int (&(ieee
->h
));
1287 case ieee_region_base_address_enum
:
1288 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1289 section
->vma
= must_parse_int (&(ieee
->h
));
1290 section
->lma
= section
->vma
;
1292 case ieee_mau_size_enum
:
1293 must_parse_int (&(ieee
->h
));
1294 must_parse_int (&(ieee
->h
));
1296 case ieee_m_value_enum
:
1297 must_parse_int (&(ieee
->h
));
1298 must_parse_int (&(ieee
->h
));
1300 case ieee_section_base_address_enum
:
1301 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1302 section
->vma
= must_parse_int (&(ieee
->h
));
1303 section
->lma
= section
->vma
;
1305 case ieee_section_offset_enum
:
1306 (void) must_parse_int (&(ieee
->h
));
1307 (void) must_parse_int (&(ieee
->h
));
1323 /* Make a section for the debugging information, if any. We don't try
1324 to interpret the debugging information; we just point the section
1325 at the area in the file so that program which understand can dig it
1329 ieee_slurp_debug (bfd
*abfd
)
1331 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1336 if (ieee
->w
.r
.debug_information_part
== 0)
1339 flags
= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1340 sec
= bfd_make_section_with_flags (abfd
, ".debug", flags
);
1343 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1345 debug_end
= ieee_part_after (ieee
, ieee
->w
.r
.debug_information_part
);
1346 sec
->size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1351 /* Archive stuff. */
1353 static const bfd_target
*
1354 ieee_archive_p (bfd
*abfd
)
1358 static unsigned char buffer
[512];
1359 file_ptr buffer_offset
= 0;
1360 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1361 ieee_ar_data_type
*ieee
;
1362 bfd_size_type alc_elts
;
1363 ieee_ar_obstack_type
*elts
= NULL
;
1364 bfd_size_type amt
= sizeof (ieee_ar_data_type
);
1366 abfd
->tdata
.ieee_ar_data
= bfd_alloc (abfd
, amt
);
1367 if (!abfd
->tdata
.ieee_ar_data
)
1368 goto error_ret_restore
;
1369 ieee
= IEEE_AR_DATA (abfd
);
1371 /* Ignore the return value here. It doesn't matter if we don't read
1372 the entire buffer. We might have a very small ieee file. */
1373 if (bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
) <= 0)
1374 goto got_wrong_format_error
;
1376 ieee
->h
.first_byte
= buffer
;
1377 ieee
->h
.input_p
= buffer
;
1379 ieee
->h
.abfd
= abfd
;
1381 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1382 goto got_wrong_format_error
;
1384 (void) next_byte (&(ieee
->h
));
1386 library
= read_id (&(ieee
->h
));
1387 if (strcmp (library
, "LIBRARY") != 0)
1388 goto got_wrong_format_error
;
1390 /* Throw away the filename. */
1391 read_id (&(ieee
->h
));
1393 ieee
->element_count
= 0;
1394 ieee
->element_index
= 0;
1396 (void) next_byte (&(ieee
->h
)); /* Drop the ad part. */
1397 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers. */
1398 must_parse_int (&(ieee
->h
));
1401 elts
= bfd_malloc (alc_elts
* sizeof *elts
);
1405 /* Read the index of the BB table. */
1409 ieee_ar_obstack_type
*t
;
1411 rec
= read_2bytes (&(ieee
->h
));
1412 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1415 if (ieee
->element_count
>= alc_elts
)
1417 ieee_ar_obstack_type
*n
;
1420 n
= bfd_realloc (elts
, alc_elts
* sizeof (* elts
));
1426 t
= &elts
[ieee
->element_count
];
1427 ieee
->element_count
++;
1429 must_parse_int (&(ieee
->h
));
1430 t
->file_offset
= must_parse_int (&(ieee
->h
));
1431 t
->abfd
= (bfd
*) NULL
;
1433 /* Make sure that we don't go over the end of the buffer. */
1434 if ((size_t) ieee_pos (IEEE_DATA (abfd
)) > sizeof (buffer
) / 2)
1436 /* Past half way, reseek and reprime. */
1437 buffer_offset
+= ieee_pos (IEEE_DATA (abfd
));
1438 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1441 /* Again ignore return value of bfd_bread. */
1442 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1443 ieee
->h
.first_byte
= buffer
;
1444 ieee
->h
.input_p
= buffer
;
1448 amt
= ieee
->element_count
;
1449 amt
*= sizeof *ieee
->elements
;
1450 ieee
->elements
= bfd_alloc (abfd
, amt
);
1451 if (ieee
->elements
== NULL
)
1454 memcpy (ieee
->elements
, elts
, (size_t) amt
);
1458 /* Now scan the area again, and replace BB offsets with file offsets. */
1459 for (i
= 2; i
< ieee
->element_count
; i
++)
1461 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1464 /* Again ignore return value of bfd_bread. */
1465 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1466 ieee
->h
.first_byte
= buffer
;
1467 ieee
->h
.input_p
= buffer
;
1469 (void) next_byte (&(ieee
->h
)); /* Drop F8. */
1470 if (! next_byte (&(ieee
->h
))) /* Drop 14. */
1472 must_parse_int (&(ieee
->h
)); /* Drop size of block. */
1474 if (must_parse_int (&(ieee
->h
)) != 0)
1475 /* This object has been deleted. */
1476 ieee
->elements
[i
].file_offset
= 0;
1478 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1481 /* abfd->has_armap = ;*/
1485 got_wrong_format_error
:
1486 bfd_set_error (bfd_error_wrong_format
);
1490 bfd_release (abfd
, ieee
);
1492 abfd
->tdata
.ieee_ar_data
= save
;
1498 ieee_mkobject (bfd
*abfd
)
1502 output_ptr_start
= NULL
;
1504 output_ptr_end
= NULL
;
1505 input_ptr_start
= NULL
;
1507 input_ptr_end
= NULL
;
1511 amt
= sizeof (ieee_data_type
);
1512 abfd
->tdata
.ieee_data
= bfd_zalloc (abfd
, amt
);
1513 return abfd
->tdata
.ieee_data
!= NULL
;
1517 do_one (ieee_data_type
*ieee
,
1518 ieee_per_section_type
*current_map
,
1519 unsigned char *location_ptr
,
1523 switch (this_byte (&(ieee
->h
)))
1525 case ieee_load_constant_bytes_enum
:
1527 unsigned int number_of_maus
;
1530 if (! next_byte (&(ieee
->h
)))
1532 number_of_maus
= must_parse_int (&(ieee
->h
));
1534 for (i
= 0; i
< number_of_maus
; i
++)
1536 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1537 next_byte (&(ieee
->h
));
1542 case ieee_load_with_relocation_enum
:
1544 bfd_boolean loop
= TRUE
;
1546 if (! next_byte (&(ieee
->h
)))
1550 switch (this_byte (&(ieee
->h
)))
1552 case ieee_variable_R_enum
:
1554 case ieee_function_signed_open_b_enum
:
1555 case ieee_function_unsigned_open_b_enum
:
1556 case ieee_function_either_open_b_enum
:
1558 unsigned int extra
= 4;
1559 bfd_boolean pcrel
= FALSE
;
1563 r
= bfd_alloc (ieee
->h
.abfd
, sizeof (* r
));
1567 *(current_map
->reloc_tail_ptr
) = r
;
1568 current_map
->reloc_tail_ptr
= &r
->next
;
1569 r
->next
= (ieee_reloc_type
*) NULL
;
1570 if (! next_byte (&(ieee
->h
)))
1573 r
->relent
.sym_ptr_ptr
= 0;
1574 if (! parse_expression (ieee
,
1577 &pcrel
, &extra
, §ion
))
1580 r
->relent
.address
= current_map
->pc
;
1581 s
->flags
|= SEC_RELOC
;
1582 s
->owner
->flags
|= HAS_RELOC
;
1584 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1585 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1587 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1589 if (! next_byte (&(ieee
->h
)))
1591 /* Fetch number of bytes to pad. */
1592 extra
= must_parse_int (&(ieee
->h
));
1595 switch (this_byte (&(ieee
->h
)))
1597 case ieee_function_signed_close_b_enum
:
1598 if (! next_byte (&(ieee
->h
)))
1601 case ieee_function_unsigned_close_b_enum
:
1602 if (! next_byte (&(ieee
->h
)))
1605 case ieee_function_either_close_b_enum
:
1606 if (! next_byte (&(ieee
->h
)))
1612 /* Build a relocation entry for this type. */
1613 /* If pc rel then stick -ve pc into instruction
1614 and take out of reloc ..
1616 I've changed this. It's all too complicated. I
1617 keep 0 in the instruction now. */
1626 #if KEEPMINUSPCININST
1627 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
,
1628 location_ptr
+ current_map
->pc
);
1629 r
->relent
.howto
= &rel32_howto
;
1630 r
->relent
.addend
-= current_map
->pc
;
1632 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0, location_ptr
+
1634 r
->relent
.howto
= &rel32_howto
;
1639 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0,
1640 location_ptr
+ current_map
->pc
);
1641 r
->relent
.howto
= &abs32_howto
;
1643 current_map
->pc
+= 4;
1648 #if KEEPMINUSPCININST
1649 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) -current_map
->pc
,
1650 location_ptr
+ current_map
->pc
);
1651 r
->relent
.addend
-= current_map
->pc
;
1652 r
->relent
.howto
= &rel16_howto
;
1655 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1656 location_ptr
+ current_map
->pc
);
1657 r
->relent
.howto
= &rel16_howto
;
1663 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1664 location_ptr
+ current_map
->pc
);
1665 r
->relent
.howto
= &abs16_howto
;
1667 current_map
->pc
+= 2;
1672 #if KEEPMINUSPCININST
1673 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1674 r
->relent
.addend
-= current_map
->pc
;
1675 r
->relent
.howto
= &rel8_howto
;
1677 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1678 r
->relent
.howto
= &rel8_howto
;
1683 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1684 r
->relent
.howto
= &abs8_howto
;
1686 current_map
->pc
+= 1;
1699 if (parse_int (&(ieee
->h
), &this_size
))
1703 for (i
= 0; i
< this_size
; i
++)
1705 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1706 if (! next_byte (&(ieee
->h
)))
1715 /* Prevent more than the first load-item of an LR record
1716 from being repeated (MRI convention). */
1717 if (iterations
!= 1)
1725 /* Read in all the section data and relocation stuff too. */
1728 ieee_slurp_section_data (bfd
*abfd
)
1730 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1731 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1732 unsigned int section_number
;
1733 ieee_per_section_type
*current_map
= NULL
;
1736 /* Seek to the start of the data area. */
1737 if (ieee
->read_data
)
1739 ieee
->read_data
= TRUE
;
1741 if (! ieee_seek (ieee
, ieee
->w
.r
.data_part
))
1744 /* Allocate enough space for all the section contents. */
1745 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1747 ieee_per_section_type
*per
= ieee_per_section (s
);
1750 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1752 per
->data
= bfd_alloc (ieee
->h
.abfd
, s
->size
);
1755 relpp
= &s
->relocation
;
1756 per
->reloc_tail_ptr
= (ieee_reloc_type
**) relpp
;
1761 switch (this_byte (&(ieee
->h
)))
1763 /* IF we see anything strange then quit. */
1767 case ieee_set_current_section_enum
:
1768 if (! next_byte (&(ieee
->h
)))
1770 section_number
= must_parse_int (&(ieee
->h
));
1771 s
= ieee
->section_table
[section_number
];
1772 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1773 current_map
= ieee_per_section (s
);
1774 location_ptr
= current_map
->data
- s
->vma
;
1775 /* The document I have says that Microtec's compilers reset
1776 this after a sec section, even though the standard says not
1778 current_map
->pc
= s
->vma
;
1781 case ieee_e2_first_byte_enum
:
1782 if (! next_byte (&(ieee
->h
)))
1784 switch (this_byte (&(ieee
->h
)))
1786 case ieee_set_current_pc_enum
& 0xff:
1789 ieee_symbol_index_type symbol
;
1793 if (! next_byte (&(ieee
->h
)))
1795 must_parse_int (&(ieee
->h
)); /* Throw away section #. */
1796 if (! parse_expression (ieee
, &value
,
1802 current_map
->pc
= value
;
1803 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->size
);
1807 case ieee_value_starting_address_enum
& 0xff:
1808 if (! next_byte (&(ieee
->h
)))
1810 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1812 if (! next_byte (&(ieee
->h
)))
1815 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1816 /* We've got to the end of the data now - */
1823 case ieee_repeat_data_enum
:
1825 /* Repeat the following LD or LR n times - we do this by
1826 remembering the stream pointer before running it and
1827 resetting it and running it n times. We special case
1828 the repetition of a repeat_data/load_constant. */
1829 unsigned int iterations
;
1830 unsigned char *start
;
1832 if (! next_byte (&(ieee
->h
)))
1834 iterations
= must_parse_int (&(ieee
->h
));
1835 start
= ieee
->h
.input_p
;
1836 if (start
[0] == (int) ieee_load_constant_bytes_enum
1839 while (iterations
!= 0)
1841 location_ptr
[current_map
->pc
++] = start
[2];
1844 (void) next_byte (&(ieee
->h
));
1845 (void) next_byte (&(ieee
->h
));
1846 if (! next_byte (&(ieee
->h
)))
1851 while (iterations
!= 0)
1853 ieee
->h
.input_p
= start
;
1854 if (!do_one (ieee
, current_map
, location_ptr
, s
,
1862 case ieee_load_constant_bytes_enum
:
1863 case ieee_load_with_relocation_enum
:
1864 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
1870 static const bfd_target
*
1871 ieee_object_p (bfd
*abfd
)
1875 ieee_data_type
*ieee
;
1876 static unsigned char buffer
[300];
1877 ieee_data_type
*save
= IEEE_DATA (abfd
);
1880 abfd
->tdata
.ieee_data
= 0;
1881 ieee_mkobject (abfd
);
1883 ieee
= IEEE_DATA (abfd
);
1884 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1886 /* Read the first few bytes in to see if it makes sense. Ignore
1887 bfd_bread return value; The file might be very small. */
1888 if (bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
) <= 0)
1889 goto got_wrong_format
;
1891 ieee
->h
.input_p
= buffer
;
1892 ieee
->h
.total_amt
= sizeof (buffer
);
1893 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1894 goto got_wrong_format
;
1896 ieee
->read_symbols
= FALSE
;
1897 ieee
->read_data
= FALSE
;
1898 ieee
->section_count
= 0;
1899 ieee
->external_symbol_max_index
= 0;
1900 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1901 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1902 ieee
->external_reference_max_index
= 0;
1903 ieee
->h
.abfd
= abfd
;
1904 ieee
->section_table
= NULL
;
1905 ieee
->section_table_size
= 0;
1907 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1908 if (strcmp (processor
, "LIBRARY") == 0)
1909 goto got_wrong_format
;
1910 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1911 if (abfd
->filename
== (const char *) NULL
)
1912 abfd
->filename
= xstrdup (ieee
->mb
.module_name
);
1914 /* Determine the architecture and machine type of the object file. */
1916 const bfd_arch_info_type
*arch
;
1919 /* IEEE does not specify the format of the processor identification
1920 string, so the compiler is free to put in it whatever it wants.
1921 We try here to recognize different processors belonging to the
1922 m68k family. Code for other processors can be added here. */
1923 if ((processor
[0] == '6') && (processor
[1] == '8'))
1925 if (processor
[2] == '3') /* 683xx integrated processors. */
1927 switch (processor
[3])
1929 case '0': /* 68302, 68306, 68307 */
1930 case '2': /* 68322, 68328 */
1931 case '5': /* 68356 */
1932 strcpy (family
, "68000"); /* MC68000-based controllers. */
1935 case '3': /* 68330, 68331, 68332, 68333,
1936 68334, 68335, 68336, 68338 */
1937 case '6': /* 68360 */
1938 case '7': /* 68376 */
1939 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1943 if (processor
[4] == '9') /* 68349 */
1944 strcpy (family
, "68030"); /* CPU030 */
1945 else /* 68340, 68341 */
1946 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1949 default: /* Does not exist yet. */
1950 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1953 else if (TOUPPER (processor
[3]) == 'F') /* 68F333 */
1954 strcpy (family
, "68332"); /* CPU32 */
1955 else if ((TOUPPER (processor
[3]) == 'C') /* Embedded controllers. */
1956 && ((TOUPPER (processor
[2]) == 'E')
1957 || (TOUPPER (processor
[2]) == 'H')
1958 || (TOUPPER (processor
[2]) == 'L')))
1960 strcpy (family
, "68");
1961 strncat (family
, processor
+ 4, 7);
1964 else /* "Regular" processors. */
1966 strncpy (family
, processor
, 9);
1970 else if ((CONST_STRNEQ (processor
, "cpu32")) /* CPU32 and CPU32+ */
1971 || (CONST_STRNEQ (processor
, "CPU32")))
1972 strcpy (family
, "68332");
1975 strncpy (family
, processor
, 9);
1979 arch
= bfd_scan_arch (family
);
1981 goto got_wrong_format
;
1982 abfd
->arch_info
= arch
;
1985 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1988 if (! next_byte (&(ieee
->h
)))
1991 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
))
1994 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
))
1997 /* If there is a byte order info, take it. */
1998 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
1999 || this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
2001 if (! next_byte (&(ieee
->h
)))
2005 for (part
= 0; part
< N_W_VARIABLES
; part
++)
2009 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
2012 if (this_byte_and_next (&(ieee
->h
)) != part
)
2015 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
2020 if (ieee
->w
.r
.external_part
!= 0)
2021 abfd
->flags
= HAS_SYMS
;
2023 /* By now we know that this is a real IEEE file, we're going to read
2024 the whole thing into memory so that we can run up and down it
2025 quickly. We can work out how big the file is from the trailer
2028 amt
= ieee
->w
.r
.me_record
+ 1;
2029 IEEE_DATA (abfd
)->h
.first_byte
= bfd_alloc (ieee
->h
.abfd
, amt
);
2030 if (!IEEE_DATA (abfd
)->h
.first_byte
)
2032 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2035 /* FIXME: Check return value. I'm not sure whether it needs to read
2036 the entire buffer or not. */
2037 amt
= bfd_bread ((void *) (IEEE_DATA (abfd
)->h
.first_byte
),
2038 (bfd_size_type
) ieee
->w
.r
.me_record
+ 1, abfd
);
2042 IEEE_DATA (abfd
)->h
.total_amt
= amt
;
2043 if (ieee_slurp_sections (abfd
))
2046 if (! ieee_slurp_debug (abfd
))
2049 /* Parse section data to activate file and section flags implied by
2050 section contents. */
2051 if (! ieee_slurp_section_data (abfd
))
2056 bfd_set_error (bfd_error_wrong_format
);
2058 bfd_release (abfd
, ieee
);
2059 abfd
->tdata
.ieee_data
= save
;
2060 return (const bfd_target
*) NULL
;
2064 ieee_get_symbol_info (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
2068 bfd_symbol_info (symbol
, ret
);
2069 if (symbol
->name
[0] == ' ')
2070 ret
->name
= "* empty table entry ";
2071 if (!symbol
->section
)
2072 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
2076 ieee_print_symbol (bfd
*abfd
,
2079 bfd_print_symbol_type how
)
2081 FILE *file
= (FILE *) afile
;
2085 case bfd_print_symbol_name
:
2086 fprintf (file
, "%s", symbol
->name
);
2088 case bfd_print_symbol_more
:
2091 case bfd_print_symbol_all
:
2093 const char *section_name
=
2094 (symbol
->section
== (asection
*) NULL
2096 : symbol
->section
->name
);
2098 if (symbol
->name
[0] == ' ')
2099 fprintf (file
, "* empty table entry ");
2102 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2104 fprintf (file
, " %-5s %04x %02x %s",
2106 (unsigned) ieee_symbol (symbol
)->index
,
2116 ieee_new_section_hook (bfd
*abfd
, asection
*newsect
)
2118 if (!newsect
->used_by_bfd
)
2120 newsect
->used_by_bfd
= bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2121 if (!newsect
->used_by_bfd
)
2124 ieee_per_section (newsect
)->data
= NULL
;
2125 ieee_per_section (newsect
)->section
= newsect
;
2126 return _bfd_generic_new_section_hook (abfd
, newsect
);
2130 ieee_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
2132 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2134 if (! ieee_slurp_section_data (abfd
))
2136 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2140 ieee_get_section_contents (bfd
*abfd
,
2144 bfd_size_type count
)
2146 ieee_per_section_type
*p
= ieee_per_section (section
);
2147 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2148 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2150 ieee_slurp_section_data (abfd
);
2151 (void) memcpy ((void *) location
, (void *) (p
->data
+ offset
), (unsigned) count
);
2156 ieee_canonicalize_reloc (bfd
*abfd
,
2161 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2162 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2164 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2167 while (src
!= (ieee_reloc_type
*) NULL
)
2169 /* Work out which symbol to attach it this reloc to. */
2170 switch (src
->symbol
.letter
)
2173 src
->relent
.sym_ptr_ptr
=
2174 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2177 src
->relent
.sym_ptr_ptr
=
2178 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2181 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2182 src
->relent
.sym_ptr_ptr
=
2183 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2189 *relptr
++ = &src
->relent
;
2193 return section
->reloc_count
;
2197 comp (const void * ap
, const void * bp
)
2199 arelent
*a
= *((arelent
**) ap
);
2200 arelent
*b
= *((arelent
**) bp
);
2201 return a
->address
- b
->address
;
2204 /* Write the section headers. */
2207 ieee_write_section_part (bfd
*abfd
)
2209 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2212 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2213 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2215 if (! bfd_is_abs_section (s
)
2216 && (s
->flags
& SEC_DEBUGGING
) == 0)
2218 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2219 || ! ieee_write_byte (abfd
,
2220 (bfd_byte
) (s
->index
2221 + IEEE_SECTION_NUMBER_BASE
)))
2224 if (abfd
->flags
& EXEC_P
)
2226 /* This image is executable, so output absolute sections. */
2227 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2228 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2233 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2237 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2239 case SEC_CODE
| SEC_LOAD
:
2241 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2246 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2250 case SEC_ROM
| SEC_DATA
:
2251 case SEC_ROM
| SEC_LOAD
:
2252 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2253 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2258 if (! ieee_write_id (abfd
, s
->name
))
2261 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2262 || ! ieee_write_byte (abfd
,
2263 (bfd_byte
) (s
->index
2264 + IEEE_SECTION_NUMBER_BASE
))
2265 || ! ieee_write_int (abfd
, (bfd_vma
) 1 << s
->alignment_power
))
2269 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2270 || ! ieee_write_byte (abfd
,
2271 (bfd_byte
) (s
->index
2272 + IEEE_SECTION_NUMBER_BASE
))
2273 || ! ieee_write_int (abfd
, s
->size
))
2275 if (abfd
->flags
& EXEC_P
)
2277 /* Relocateable sections don't have asl records. */
2279 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2280 || ! ieee_write_byte (abfd
,
2283 + IEEE_SECTION_NUMBER_BASE
)))
2284 || ! ieee_write_int (abfd
, s
->lma
))
2294 do_with_relocs (bfd
*abfd
, asection
*s
)
2296 unsigned int number_of_maus_in_address
=
2297 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2298 unsigned int relocs_to_go
= s
->reloc_count
;
2299 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2300 arelent
**p
= s
->orelocation
;
2301 bfd_size_type current_byte_index
= 0;
2303 qsort (s
->orelocation
,
2305 sizeof (arelent
**),
2308 /* Output the section preheader. */
2309 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2310 || ! ieee_write_byte (abfd
,
2311 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2312 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2313 || ! ieee_write_byte (abfd
,
2314 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2317 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2319 if (! ieee_write_int (abfd
, s
->lma
))
2324 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2328 if (relocs_to_go
== 0)
2330 /* If there aren't any relocations then output the load constant
2331 byte opcode rather than the load with relocation opcode. */
2332 while (current_byte_index
< s
->size
)
2335 unsigned int MAXRUN
= 127;
2338 if (run
> s
->size
- current_byte_index
)
2339 run
= s
->size
- current_byte_index
;
2343 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2345 /* Output a stream of bytes. */
2346 if (! ieee_write_int (abfd
, run
))
2348 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2351 current_byte_index
+= run
;
2357 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2360 /* Output the data stream as the longest sequence of bytes
2361 possible, allowing for the a reasonable packet size and
2362 relocation stuffs. */
2365 /* Outputting a section without data, fill it up. */
2366 stream
= bfd_zalloc (abfd
, s
->size
);
2370 while (current_byte_index
< s
->size
)
2373 unsigned int MAXRUN
= 127;
2377 run
= (*p
)->address
- current_byte_index
;
2384 if (run
> s
->size
- current_byte_index
)
2385 run
= s
->size
- current_byte_index
;
2389 /* Output a stream of bytes. */
2390 if (! ieee_write_int (abfd
, run
))
2392 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2395 current_byte_index
+= run
;
2398 /* Output any relocations here. */
2399 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2402 && (*p
) && (*p
)->address
== current_byte_index
)
2406 switch (r
->howto
->size
)
2409 ov
= bfd_get_signed_32 (abfd
,
2410 stream
+ current_byte_index
);
2411 current_byte_index
+= 4;
2414 ov
= bfd_get_signed_16 (abfd
,
2415 stream
+ current_byte_index
);
2416 current_byte_index
+= 2;
2419 ov
= bfd_get_signed_8 (abfd
,
2420 stream
+ current_byte_index
);
2421 current_byte_index
++;
2429 ov
&= r
->howto
->src_mask
;
2431 if (r
->howto
->pc_relative
2432 && ! r
->howto
->pcrel_offset
)
2435 if (! ieee_write_byte (abfd
,
2436 ieee_function_either_open_b_enum
))
2439 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2441 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2443 r
->howto
->pc_relative
,
2444 (unsigned) s
->index
))
2449 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2451 r
->howto
->pc_relative
,
2452 (unsigned) s
->index
))
2456 if (number_of_maus_in_address
2457 != bfd_get_reloc_size (r
->howto
))
2459 bfd_vma rsize
= bfd_get_reloc_size (r
->howto
);
2460 if (! ieee_write_int (abfd
, rsize
))
2463 if (! ieee_write_byte (abfd
,
2464 ieee_function_either_close_b_enum
))
2478 /* If there are no relocations in the output section then we can be
2479 clever about how we write. We block items up into a max of 127
2483 do_as_repeat (bfd
*abfd
, asection
*s
)
2487 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2488 || ! ieee_write_byte (abfd
,
2489 (bfd_byte
) (s
->index
2490 + IEEE_SECTION_NUMBER_BASE
))
2491 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2492 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2493 || ! ieee_write_byte (abfd
,
2494 (bfd_byte
) (s
->index
2495 + IEEE_SECTION_NUMBER_BASE
)))
2498 if ((abfd
->flags
& EXEC_P
) != 0)
2500 if (! ieee_write_int (abfd
, s
->lma
))
2505 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2509 if (! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2510 || ! ieee_write_int (abfd
, s
->size
)
2511 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2512 || ! ieee_write_byte (abfd
, 1)
2513 || ! ieee_write_byte (abfd
, 0))
2521 do_without_relocs (bfd
*abfd
, asection
*s
)
2523 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2525 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2527 if (! do_as_repeat (abfd
, s
))
2534 for (i
= 0; i
< s
->size
; i
++)
2538 if (! do_with_relocs (abfd
, s
))
2543 if (! do_as_repeat (abfd
, s
))
2553 bfd_size_type amt
= input_ptr_end
- input_ptr_start
;
2554 /* FIXME: Check return value. I'm not sure whether it needs to read
2555 the entire buffer or not. */
2556 bfd_bread ((void *) input_ptr_start
, amt
, input_bfd
);
2557 input_ptr
= input_ptr_start
;
2563 bfd_size_type amt
= output_ptr
- output_ptr_start
;
2565 if (bfd_bwrite ((void *) (output_ptr_start
), amt
, output_bfd
) != amt
)
2567 output_ptr
= output_ptr_start
;
2571 #define THIS() ( *input_ptr )
2572 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2573 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2576 write_int (int value
)
2578 if (value
>= 0 && value
<= 127)
2584 unsigned int length
;
2586 /* How many significant bytes ? */
2587 /* FIXME FOR LONGER INTS. */
2588 if (value
& 0xff000000)
2590 else if (value
& 0x00ff0000)
2592 else if (value
& 0x0000ff00)
2597 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2618 int length
= THIS ();
2631 #define VAR(x) ((x | 0x80))
2633 copy_expression (void)
2647 value
= (value
<< 8) | THIS ();
2649 value
= (value
<< 8) | THIS ();
2651 value
= (value
<< 8) | THIS ();
2659 value
= (value
<< 8) | THIS ();
2661 value
= (value
<< 8) | THIS ();
2669 value
= (value
<< 8) | THIS ();
2686 /* Not a number, just bug out with the answer. */
2687 write_int (*(--tos
));
2694 /* PLUS anything. */
2703 ieee_data_type
*ieee
;
2707 section_number
= THIS ();
2710 ieee
= IEEE_DATA (input_bfd
);
2711 s
= ieee
->section_table
[section_number
];
2713 if (s
->output_section
)
2714 value
= s
->output_section
->lma
;
2715 value
+= s
->output_offset
;
2722 write_int (*(--tos
));
2730 /* Drop the int in the buffer, and copy a null into the gap, which we
2731 will overwrite later. */
2734 fill_int (struct output_buffer_struct
*buf
)
2736 if (buf
->buffer
== output_buffer
)
2738 /* Still a chance to output the size. */
2739 int value
= output_ptr
- buf
->ptrp
+ 3;
2740 buf
->ptrp
[0] = value
>> 24;
2741 buf
->ptrp
[1] = value
>> 16;
2742 buf
->ptrp
[2] = value
>> 8;
2743 buf
->ptrp
[3] = value
>> 0;
2748 drop_int (struct output_buffer_struct
*buf
)
2780 buf
->ptrp
= output_ptr
;
2781 buf
->buffer
= output_buffer
;
2825 #define ID copy_id ()
2826 #define INT copy_int ()
2827 #define EXP copy_expression ()
2828 #define INTn(q) copy_int ()
2829 #define EXPn(q) copy_expression ()
2832 copy_till_end (void)
2911 EXPn (instruction address
);
2945 EXPn (external function
);
2955 INTn (locked
register);
2977 /* Attribute record. */
3007 /* Unique typedefs for module. */
3008 /* GLobal typedefs. */
3009 /* High level module scope beginning. */
3011 struct output_buffer_struct ob
;
3027 /* Global function. */
3029 struct output_buffer_struct ob
;
3044 EXPn (size of block
);
3050 /* File name for source line numbers. */
3052 struct output_buffer_struct ob
;
3073 /* Local function. */
3075 struct output_buffer_struct ob
;
3094 /* Assembler module scope beginning - */
3096 struct output_buffer_struct ob
;
3122 struct output_buffer_struct ob
;
3130 INTn (section index
);
3138 EXPn (Size in Maus
);
3191 /* Moves all the debug information from the source bfd to the output
3192 bfd, and relocates any expressions it finds. */
3195 relocate_debug (bfd
*output ATTRIBUTE_UNUSED
,
3200 unsigned char input_buffer
[IBS
];
3202 input_ptr_start
= input_ptr
= input_buffer
;
3203 input_ptr_end
= input_buffer
+ IBS
;
3205 /* FIXME: Check return value. I'm not sure whether it needs to read
3206 the entire buffer or not. */
3207 bfd_bread ((void *) input_ptr_start
, (bfd_size_type
) IBS
, input
);
3211 /* Gather together all the debug information from each input BFD into
3212 one place, relocating it and emitting it as we go. */
3215 ieee_write_debug_part (bfd
*abfd
)
3217 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3218 bfd_chain_type
*chain
= ieee
->chain_root
;
3219 unsigned char obuff
[OBS
];
3220 bfd_boolean some_debug
= FALSE
;
3221 file_ptr here
= bfd_tell (abfd
);
3223 output_ptr_start
= output_ptr
= obuff
;
3224 output_ptr_end
= obuff
+ OBS
;
3228 if (chain
== (bfd_chain_type
*) NULL
)
3232 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3233 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3237 ieee
->w
.r
.debug_information_part
= 0;
3241 ieee
->w
.r
.debug_information_part
= here
;
3242 if (bfd_bwrite (s
->contents
, s
->size
, abfd
) != s
->size
)
3247 while (chain
!= (bfd_chain_type
*) NULL
)
3249 bfd
*entry
= chain
->this;
3250 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3252 if (entry_ieee
->w
.r
.debug_information_part
)
3254 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3257 relocate_debug (abfd
, entry
);
3260 chain
= chain
->next
;
3264 ieee
->w
.r
.debug_information_part
= here
;
3266 ieee
->w
.r
.debug_information_part
= 0;
3274 /* Write the data in an ieee way. */
3277 ieee_write_data_part (bfd
*abfd
)
3281 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3282 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3284 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3286 /* Skip sections that have no loadable contents (.bss,
3288 if ((s
->flags
& SEC_LOAD
) == 0)
3291 /* Sort the reloc records so we can insert them in the correct
3293 if (s
->reloc_count
!= 0)
3295 if (! do_with_relocs (abfd
, s
))
3300 if (! do_without_relocs (abfd
, s
))
3309 init_for_output (bfd
*abfd
)
3313 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3315 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3319 bfd_size_type size
= s
->size
;
3320 ieee_per_section (s
)->data
= bfd_alloc (abfd
, size
);
3321 if (!ieee_per_section (s
)->data
)
3328 /* Exec and core file sections. */
3330 /* Set section contents is complicated with IEEE since the format is
3331 not a byte image, but a record stream. */
3334 ieee_set_section_contents (bfd
*abfd
,
3336 const void * location
,
3338 bfd_size_type count
)
3340 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3342 if (section
->contents
== NULL
)
3344 bfd_size_type size
= section
->size
;
3345 section
->contents
= bfd_alloc (abfd
, size
);
3346 if (section
->contents
== NULL
)
3349 /* bfd_set_section_contents has already checked that everything
3351 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
3355 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3357 if (!init_for_output (abfd
))
3360 memcpy ((void *) (ieee_per_section (section
)->data
+ offset
),
3362 (unsigned int) count
);
3366 /* Write the external symbols of a file. IEEE considers two sorts of
3367 external symbols, public, and referenced. It uses to internal
3368 forms to index them as well. When we write them out we turn their
3369 symbol values into indexes from the right base. */
3372 ieee_write_external_part (bfd
*abfd
)
3375 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3376 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3377 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3378 file_ptr here
= bfd_tell (abfd
);
3379 bfd_boolean hadone
= FALSE
;
3381 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3384 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3388 if (bfd_is_und_section (p
->section
))
3390 /* This must be a symbol reference. */
3391 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3392 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3393 || ! ieee_write_id (abfd
, p
->name
))
3395 p
->value
= reference_index
;
3399 else if (bfd_is_com_section (p
->section
))
3401 /* This is a weak reference. */
3402 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3403 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3404 || ! ieee_write_id (abfd
, p
->name
)
3405 || ! ieee_write_byte (abfd
,
3406 ieee_weak_external_reference_enum
)
3407 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3408 || ! ieee_write_int (abfd
, p
->value
))
3410 p
->value
= reference_index
;
3414 else if (p
->flags
& BSF_GLOBAL
)
3416 /* This must be a symbol definition. */
3417 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3418 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3419 || ! ieee_write_id (abfd
, p
->name
)
3420 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3421 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3422 || ! ieee_write_byte (abfd
, 15) /* Instruction address. */
3423 || ! ieee_write_byte (abfd
, 19) /* Static symbol. */
3424 || ! ieee_write_byte (abfd
, 1)) /* One of them. */
3427 /* Write out the value. */
3428 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3429 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
))
3431 if (! bfd_is_abs_section (p
->section
))
3433 if (abfd
->flags
& EXEC_P
)
3435 /* If fully linked, then output all symbols
3437 if (! (ieee_write_int
3440 + p
->section
->output_offset
3441 + p
->section
->output_section
->vma
))))
3446 if (! (ieee_write_expression
3448 p
->value
+ p
->section
->output_offset
,
3449 p
->section
->output_section
->symbol
,
3456 if (! ieee_write_expression (abfd
,
3458 bfd_abs_section_ptr
->symbol
,
3462 p
->value
= public_index
;
3468 /* This can happen - when there are gaps in the symbols read
3469 from an input ieee file. */
3474 ieee
->w
.r
.external_part
= here
;
3480 static const unsigned char exten
[] =
3483 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3484 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3485 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3488 static const unsigned char envi
[] =
3492 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3495 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3497 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3498 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3502 ieee_write_me_part (bfd
*abfd
)
3504 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3505 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3506 if (abfd
->start_address
)
3508 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3509 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3510 || ! ieee_write_int (abfd
, abfd
->start_address
)
3511 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3514 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3515 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3520 /* Write out the IEEE processor ID. */
3523 ieee_write_processor (bfd
*abfd
)
3525 const bfd_arch_info_type
*arch
;
3527 arch
= bfd_get_arch_info (abfd
);
3531 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3535 case bfd_arch_h8300
:
3536 if (! ieee_write_id (abfd
, "H8/300"))
3540 case bfd_arch_h8500
:
3541 if (! ieee_write_id (abfd
, "H8/500"))
3549 case bfd_mach_i960_core
:
3550 case bfd_mach_i960_ka_sa
:
3551 if (! ieee_write_id (abfd
, "80960KA"))
3555 case bfd_mach_i960_kb_sb
:
3556 if (! ieee_write_id (abfd
, "80960KB"))
3560 case bfd_mach_i960_ca
:
3561 if (! ieee_write_id (abfd
, "80960CA"))
3565 case bfd_mach_i960_mc
:
3566 case bfd_mach_i960_xa
:
3567 if (! ieee_write_id (abfd
, "80960MC"))
3579 default: id
= "68020"; break;
3580 case bfd_mach_m68000
: id
= "68000"; break;
3581 case bfd_mach_m68008
: id
= "68008"; break;
3582 case bfd_mach_m68010
: id
= "68010"; break;
3583 case bfd_mach_m68020
: id
= "68020"; break;
3584 case bfd_mach_m68030
: id
= "68030"; break;
3585 case bfd_mach_m68040
: id
= "68040"; break;
3586 case bfd_mach_m68060
: id
= "68060"; break;
3587 case bfd_mach_cpu32
: id
= "cpu32"; break;
3588 case bfd_mach_mcf_isa_a_nodiv
: id
= "isa-a:nodiv"; break;
3589 case bfd_mach_mcf_isa_a
: id
= "isa-a"; break;
3590 case bfd_mach_mcf_isa_a_mac
: id
= "isa-a:mac"; break;
3591 case bfd_mach_mcf_isa_a_emac
: id
= "isa-a:emac"; break;
3592 case bfd_mach_mcf_isa_aplus
: id
= "isa-aplus"; break;
3593 case bfd_mach_mcf_isa_aplus_mac
: id
= "isa-aplus:mac"; break;
3594 case bfd_mach_mcf_isa_aplus_emac
: id
= "isa-aplus:mac"; break;
3595 case bfd_mach_mcf_isa_b_nousp
: id
= "isa-b:nousp"; break;
3596 case bfd_mach_mcf_isa_b_nousp_mac
: id
= "isa-b:nousp:mac"; break;
3597 case bfd_mach_mcf_isa_b_nousp_emac
: id
= "isa-b:nousp:emac"; break;
3598 case bfd_mach_mcf_isa_b
: id
= "isa-b"; break;
3599 case bfd_mach_mcf_isa_b_mac
: id
= "isa-b:mac"; break;
3600 case bfd_mach_mcf_isa_b_emac
: id
= "isa-b:emac"; break;
3601 case bfd_mach_mcf_isa_b_float
: id
= "isa-b:float"; break;
3602 case bfd_mach_mcf_isa_b_float_mac
: id
= "isa-b:float:mac"; break;
3603 case bfd_mach_mcf_isa_b_float_emac
: id
= "isa-b:float:emac"; break;
3604 case bfd_mach_mcf_isa_c
: id
= "isa-c"; break;
3605 case bfd_mach_mcf_isa_c_mac
: id
= "isa-c:mac"; break;
3606 case bfd_mach_mcf_isa_c_emac
: id
= "isa-c:emac"; break;
3607 case bfd_mach_mcf_isa_c_nodiv
: id
= "isa-c:nodiv"; break;
3608 case bfd_mach_mcf_isa_c_nodiv_mac
: id
= "isa-c:nodiv:mac"; break;
3609 case bfd_mach_mcf_isa_c_nodiv_emac
: id
= "isa-c:nodiv:emac"; break;
3612 if (! ieee_write_id (abfd
, id
))
3622 ieee_write_object_contents (bfd
*abfd
)
3624 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3628 /* Fast forward over the header area. */
3629 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3632 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3633 || ! ieee_write_processor (abfd
)
3634 || ! ieee_write_id (abfd
, abfd
->filename
))
3637 /* Fast forward over the variable bits. */
3638 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3642 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3644 /* MAU's per address. */
3645 if (! ieee_write_byte (abfd
,
3646 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3647 / bfd_arch_bits_per_byte (abfd
))))
3650 old
= bfd_tell (abfd
);
3651 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3654 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3655 if (bfd_bwrite ((char *) exten
, (bfd_size_type
) sizeof (exten
), abfd
)
3658 if (abfd
->flags
& EXEC_P
)
3660 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute. */
3665 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable. */
3669 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3670 if (bfd_bwrite ((char *) envi
, (bfd_size_type
) sizeof (envi
), abfd
)
3674 /* The HP emulator database requires a timestamp in the file. */
3680 t
= (struct tm
*) localtime (&now
);
3681 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3682 || ! ieee_write_byte (abfd
, 0x21)
3683 || ! ieee_write_byte (abfd
, 0)
3684 || ! ieee_write_byte (abfd
, 50)
3685 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_year
+ 1900))
3686 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_mon
+ 1))
3687 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_mday
)
3688 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_hour
)
3689 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_min
)
3690 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_sec
))
3698 if (! ieee_write_section_part (abfd
))
3700 /* First write the symbols. This changes their values into table
3701 indeces so we cant use it after this point. */
3702 if (! ieee_write_external_part (abfd
))
3705 /* Write any debugs we have been told about. */
3706 if (! ieee_write_debug_part (abfd
))
3709 /* Can only write the data once the symbols have been written, since
3710 the data contains relocation information which points to the
3712 if (! ieee_write_data_part (abfd
))
3715 /* At the end we put the end! */
3716 if (! ieee_write_me_part (abfd
))
3719 /* Generate the header. */
3720 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3723 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3725 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3726 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3727 || ! ieee_write_int5_out (abfd
, (bfd_vma
) ieee
->w
.offset
[i
]))
3734 /* Native-level interface to symbols. */
3736 /* We read the symbols into a buffer, which is discarded when this
3737 function exits. We read the strings into a buffer large enough to
3738 hold them all plus all the cached symbol entries. */
3741 ieee_make_empty_symbol (bfd
*abfd
)
3743 bfd_size_type amt
= sizeof (ieee_symbol_type
);
3744 ieee_symbol_type
*new_symbol
= (ieee_symbol_type
*) bfd_zalloc (abfd
, amt
);
3748 new_symbol
->symbol
.the_bfd
= abfd
;
3749 return &new_symbol
->symbol
;
3753 ieee_openr_next_archived_file (bfd
*arch
, bfd
*prev
)
3755 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3757 /* Take the next one from the arch state, or reset. */
3758 if (prev
== (bfd
*) NULL
)
3759 /* Reset the index - the first two entries are bogus. */
3760 ar
->element_index
= 2;
3764 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3766 ar
->element_index
++;
3767 if (ar
->element_index
<= ar
->element_count
)
3769 if (p
->file_offset
!= (file_ptr
) 0)
3771 if (p
->abfd
== (bfd
*) NULL
)
3773 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3774 p
->abfd
->origin
= p
->file_offset
;
3781 bfd_set_error (bfd_error_no_more_archived_files
);
3787 #define ieee_find_nearest_line _bfd_nosymbols_find_nearest_line
3788 #define ieee_find_line _bfd_nosymbols_find_line
3789 #define ieee_find_inliner_info _bfd_nosymbols_find_inliner_info
3792 ieee_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
3794 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3795 ieee_data_type
*ieee
;
3797 if (abfd
->my_archive
!= NULL
)
3798 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3799 if (ar
== (ieee_ar_data_type
*) NULL
)
3801 bfd_set_error (bfd_error_invalid_operation
);
3805 if (IEEE_DATA (abfd
) == NULL
)
3807 if (ieee_object_p (abfd
) == NULL
)
3809 bfd_set_error (bfd_error_wrong_format
);
3814 ieee
= IEEE_DATA (abfd
);
3816 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3817 buf
->st_mode
= 0644;
3822 ieee_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
3823 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3828 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3829 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3831 #define ieee_slurp_armap bfd_true
3832 #define ieee_slurp_extended_name_table bfd_true
3833 #define ieee_construct_extended_name_table \
3835 (bfd *, char **, bfd_size_type *, const char **)) \
3837 #define ieee_truncate_arname bfd_dont_truncate_arname
3838 #define ieee_write_armap \
3840 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3842 #define ieee_read_ar_hdr bfd_nullvoidptr
3843 #define ieee_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
3844 #define ieee_update_armap_timestamp bfd_true
3845 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3847 #define ieee_get_symbol_version_string \
3848 _bfd_nosymbols_get_symbol_version_string
3849 #define ieee_bfd_is_target_special_symbol \
3850 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3851 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3852 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3853 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3854 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3855 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3857 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3858 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3860 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3862 #define ieee_get_section_contents_in_window \
3863 _bfd_generic_get_section_contents_in_window
3864 #define ieee_bfd_get_relocated_section_contents \
3865 bfd_generic_get_relocated_section_contents
3866 #define ieee_bfd_relax_section bfd_generic_relax_section
3867 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3868 #define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
3869 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3870 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3871 #define ieee_bfd_discard_group bfd_generic_discard_group
3872 #define ieee_section_already_linked \
3873 _bfd_generic_section_already_linked
3874 #define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol
3875 #define ieee_bfd_define_start_stop bfd_generic_define_start_stop
3876 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3877 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3878 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3879 #define ieee_bfd_copy_link_hash_symbol_type \
3880 _bfd_generic_copy_link_hash_symbol_type
3881 #define ieee_bfd_final_link _bfd_generic_final_link
3882 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3883 #define ieee_bfd_link_check_relocs _bfd_generic_link_check_relocs
3884 #define ieee_set_reloc _bfd_generic_set_reloc
3886 const bfd_target ieee_vec
=
3889 bfd_target_ieee_flavour
,
3890 BFD_ENDIAN_UNKNOWN
, /* Target byte order. */
3891 BFD_ENDIAN_UNKNOWN
, /* Target headers byte order. */
3892 (HAS_RELOC
| EXEC_P
| /* Object flags. */
3893 HAS_LINENO
| HAS_DEBUG
|
3894 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3895 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3896 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* Section flags. */
3897 '_', /* Leading underscore. */
3898 ' ', /* AR_pad_char. */
3899 16, /* AR_max_namelen. */
3900 0, /* match priority. */
3901 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3902 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3903 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Data. */
3904 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3905 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3906 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Headers. */
3909 ieee_object_p
, /* bfd_check_format. */
3916 _bfd_generic_mkarchive
,
3921 ieee_write_object_contents
,
3922 _bfd_write_archive_contents
,
3926 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3927 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3928 BFD_JUMP_TABLE_GENERIC (ieee
),
3930 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3931 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3933 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3934 ieee_construct_extended_name_table, ieee_truncate_arname,
3935 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3936 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3937 ieee_update_armap_timestamp. */
3938 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3940 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3941 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3942 ieee_bfd_is_local_label_name, ieee_get_lineno,
3943 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3944 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3945 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3947 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3948 ieee_bfd_reloc_type_lookup. */
3949 BFD_JUMP_TABLE_RELOCS (ieee
),
3951 /* ieee_set_arch_mach, ieee_set_section_contents. */
3952 BFD_JUMP_TABLE_WRITE (ieee
),
3954 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3955 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3956 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3957 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3958 ieee_bfd_merge_sections. */
3959 BFD_JUMP_TABLE_LINK (ieee
),
3961 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),