1 /* BFD back-end for oasys objects.
2 Copyright 1990, 1991, 1992, 1993 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 #define UNDERSCORE_HACK 1
28 /* XXX - FIXME. offsetof belongs in the system-specific files in
30 /* Define offsetof for those systems which lack it */
33 #define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier)
36 /* Read in all the section data and relocation stuff too */
37 PROTO(static boolean,oasys_slurp_section_data,(bfd *CONST abfd));
40 DEFUN(oasys_read_record,(abfd, record),
42 oasys_record_union_type *record)
45 bfd_read((PTR)record, 1, sizeof(record->header), abfd);
47 if ((size_t) record->header.length <= (size_t) sizeof (record->header))
49 bfd_read((PTR)(((char *)record )+ sizeof(record->header)),
50 1, record->header.length - sizeof(record->header),
54 DEFUN(oasys_string_length,(record),
55 oasys_record_union_type *record)
57 return record->header.length
58 - ((char *)record->symbol.name - (char *)record);
61 /*****************************************************************************/
65 Slurp the symbol table by reading in all the records at the start file
66 till we get to the first section record.
68 We'll sort the symbolss into two lists, defined and undefined. The
69 undefined symbols will be placed into the table according to their
72 We do this by placing all undefined symbols at the front of the table
73 moving in, and the defined symbols at the end of the table moving back.
78 DEFUN(oasys_slurp_symbol_table,(abfd),
81 oasys_record_union_type record;
82 oasys_data_type *data = OASYS_DATA(abfd);
84 asymbol *dest_defined;
89 if (data->symbols != (asymbol *)NULL) {
92 /* Buy enough memory for all the symbols and all the names */
94 (asymbol *)bfd_alloc(abfd, sizeof(asymbol) * abfd->symcount);
95 #ifdef UNDERSCORE_HACK
96 /* buy 1 more char for each symbol to keep the underscore in*/
97 data->strings = bfd_alloc(abfd, data->symbol_string_length +
100 data->strings = bfd_alloc(abfd, data->symbol_string_length);
104 dest_defined = data->symbols + abfd->symcount -1;
106 string_ptr = data->strings;
107 bfd_seek(abfd, (file_ptr)0, SEEK_SET);
110 oasys_read_record(abfd, &record);
111 switch (record.header.type) {
112 case oasys_record_is_header_enum:
114 case oasys_record_is_local_enum:
115 case oasys_record_is_symbol_enum:
117 int flag = record.header.type == (int)oasys_record_is_local_enum ?
118 (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT);
121 size_t length = oasys_string_length(&record);
122 switch (record.symbol.relb & RELOCATION_TYPE_BITS) {
123 case RELOCATION_TYPE_ABS:
124 dest = dest_defined--;
125 dest->section = &bfd_abs_section;
129 case RELOCATION_TYPE_REL:
130 dest = dest_defined--;
132 OASYS_DATA(abfd)->sections[record.symbol.relb &
133 RELOCATION_SECT_BITS];
134 if (record.header.type == (int)oasys_record_is_local_enum)
136 dest->flags = BSF_LOCAL;
137 if (dest->section ==(asection *)(~0)) {
138 /* It seems that sometimes internal symbols are tied up, but
139 still get output, even though there is no
149 case RELOCATION_TYPE_UND:
150 dest = data->symbols + bfd_h_get_16(abfd, (bfd_byte *)&record.symbol.refno[0]);
151 dest->section = &bfd_und_section;
153 case RELOCATION_TYPE_COM:
154 dest = dest_defined--;
155 dest->name = string_ptr;
156 dest->the_bfd = abfd;
158 dest->section = &bfd_com_section;
162 dest = dest_defined--;
166 dest->name = string_ptr;
167 dest->the_bfd = abfd;
168 dest->udata = (PTR)NULL;
169 dest->value = bfd_h_get_32(abfd, (bfd_byte *)&record.symbol.value[0]);
171 #ifdef UNDERSCORE_HACK
172 if (record.symbol.name[0] != '_') {
177 memcpy(string_ptr, record.symbol.name, length);
180 string_ptr[length] =0;
181 string_ptr += length +1;
192 DEFUN(oasys_get_symtab_upper_bound,(abfd),
195 oasys_slurp_symbol_table (abfd);
197 return (abfd->symcount+1) * (sizeof (oasys_symbol_type *));
203 extern bfd_target oasys_vec;
206 DEFUN(oasys_get_symtab,(abfd, location),
211 unsigned int counter ;
212 if (oasys_slurp_symbol_table(abfd) == false) {
215 symbase = OASYS_DATA(abfd)->symbols;
216 for (counter = 0; counter < abfd->symcount; counter++) {
217 *(location++) = symbase++;
220 return abfd->symcount;
223 /***********************************************************************
228 DEFUN(oasys_archive_p,(abfd),
231 oasys_archive_header_type header;
232 oasys_extarchive_header_type header_ext;
235 bfd_seek(abfd, (file_ptr) 0, false);
238 bfd_read((PTR)&header_ext, 1, sizeof(header_ext), abfd);
241 header.version = bfd_h_get_32(abfd, (bfd_byte *)header_ext.version);
242 header.mod_count = bfd_h_get_32(abfd, (bfd_byte *)header_ext.mod_count);
243 header.mod_tbl_offset = bfd_h_get_32(abfd, (bfd_byte *)header_ext.mod_tbl_offset);
244 header.sym_tbl_size = bfd_h_get_32(abfd, (bfd_byte *)header_ext.sym_tbl_size);
245 header.sym_count = bfd_h_get_32(abfd, (bfd_byte *)header_ext.sym_count);
246 header.sym_tbl_offset = bfd_h_get_32(abfd, (bfd_byte *)header_ext.sym_tbl_offset);
247 header.xref_count = bfd_h_get_32(abfd, (bfd_byte *)header_ext.xref_count);
248 header.xref_lst_offset = bfd_h_get_32(abfd, (bfd_byte *)header_ext.xref_lst_offset);
251 There isn't a magic number in an Oasys archive, so the best we
252 can do to verify reasnableness is to make sure that the values in
253 the header are too weird
256 if (header.version>10000 ||
257 header.mod_count>10000 ||
258 header.sym_count>100000 ||
259 header.xref_count > 100000) return (bfd_target *)NULL;
262 That all worked, lets buy the space for the header and read in
266 oasys_ar_data_type *ar =
267 (oasys_ar_data_type*) bfd_alloc(abfd, sizeof(oasys_ar_data_type));
270 oasys_module_info_type *module =
271 (oasys_module_info_type*)
272 bfd_alloc(abfd, sizeof(oasys_module_info_type) * header.mod_count);
275 oasys_module_table_type record;
278 abfd->tdata.oasys_ar_data = ar;
280 ar->module_count = header.mod_count;
283 filepos = header.mod_tbl_offset;
284 for (i = 0; i < header.mod_count; i++) {
285 bfd_seek(abfd, filepos, SEEK_SET);
287 /* There are two ways of specifying the archive header */
290 oasys_extmodule_table_type_a_type record_ext;
291 bfd_read((PTR)&record_ext, 1, sizeof(record_ext), abfd);
293 record.mod_size = bfd_h_get_32(abfd, (bfd_byte *)record_ext.mod_size);
294 record.file_offset = bfd_h_get_32(abfd,
295 (bfd_byte *) record_ext.file_offset);
297 record.dep_count = bfd_h_get_32(abfd, (bfd_byte *)record_ext.dep_count);
298 record.depee_count = bfd_h_get_32(abfd,(bfd_byte *) record_ext.depee_count);
299 record.sect_count = bfd_h_get_32(abfd, (bfd_byte *) record_ext.sect_count);
302 module[i].name = bfd_alloc(abfd,33);
304 memcpy(module[i].name, record_ext.mod_name, 33);
307 record.dep_count * 4 +
308 record.depee_count * 4 +
309 record.sect_count * 8 + 187;
312 oasys_extmodule_table_type_b_type record_ext;
313 bfd_read((PTR)&record_ext, 1, sizeof(record_ext), abfd);
315 record.mod_size = bfd_h_get_32(abfd, (bfd_byte *) record_ext.mod_size);
316 record.file_offset = bfd_h_get_32(abfd,
317 (bfd_byte *)record_ext.file_offset);
319 record.dep_count = bfd_h_get_32(abfd, (bfd_byte *) record_ext.dep_count);
320 record.depee_count = bfd_h_get_32(abfd, (bfd_byte *) record_ext.depee_count);
321 record.sect_count = bfd_h_get_32(abfd, (bfd_byte *) record_ext.sect_count);
322 record.module_name_size = bfd_h_get_32(abfd, (bfd_byte *) record_ext.mod_name_length);
324 module[i].name = bfd_alloc(abfd,record.module_name_size + 1);
325 bfd_read((PTR)module[i].name, 1, record.module_name_size, abfd);
326 module[i].name[record.module_name_size] = 0;
329 record.dep_count * 4 +
330 record.module_name_size + 1;
335 module[i].size = record.mod_size;
336 module[i].pos = record.file_offset;
345 DEFUN(oasys_mkobject,(abfd),
349 abfd->tdata.oasys_obj_data = (oasys_data_type*)bfd_alloc(abfd, sizeof(oasys_data_type));
355 DEFUN(oasys_object_p,(abfd),
358 oasys_data_type *oasys;
359 oasys_data_type *save = OASYS_DATA(abfd);
361 boolean had_usefull = false;
363 abfd->tdata.oasys_obj_data = 0;
364 oasys_mkobject(abfd);
365 oasys = OASYS_DATA(abfd);
366 memset((PTR)oasys->sections, 0xff, sizeof(oasys->sections));
368 /* Point to the start of the file */
369 bfd_seek(abfd, (file_ptr)0, SEEK_SET);
370 oasys->symbol_string_length = 0;
371 /* Inspect the records, but only keep the section info -
372 remember the size of the symbols
374 oasys->first_data_record = 0;
376 oasys_record_union_type record;
377 oasys_read_record(abfd, &record);
378 if ((size_t)record.header.length < (size_t)sizeof(record.header))
382 switch ((oasys_record_enum_type)(record.header.type)) {
383 case oasys_record_is_header_enum:
386 case oasys_record_is_symbol_enum:
387 case oasys_record_is_local_enum:
388 /* Count symbols and remember their size for a future malloc */
390 oasys->symbol_string_length += 1 + oasys_string_length(&record);
393 case oasys_record_is_section_enum:
397 unsigned int section_number;
398 if (record.section.header.length != sizeof(record.section))
402 buffer = bfd_alloc(abfd, 3);
403 section_number= record.section.relb & RELOCATION_SECT_BITS;
404 sprintf(buffer,"%u", section_number);
405 s = bfd_make_section(abfd,buffer);
406 oasys->sections[section_number] = s;
407 switch (record.section.relb & RELOCATION_TYPE_BITS) {
408 case RELOCATION_TYPE_ABS:
409 case RELOCATION_TYPE_REL:
411 case RELOCATION_TYPE_UND:
412 case RELOCATION_TYPE_COM:
416 s->_raw_size = bfd_h_get_32(abfd, (bfd_byte *) & record.section.value[0]) ;
417 s->vma = bfd_h_get_32(abfd, (bfd_byte *)&record.section.vma[0]);
422 case oasys_record_is_data_enum:
423 oasys->first_data_record = bfd_tell(abfd) - record.header.length;
424 case oasys_record_is_debug_enum:
425 case oasys_record_is_module_enum:
426 case oasys_record_is_named_section_enum:
427 case oasys_record_is_end_enum:
428 if (had_usefull == false) goto fail;
435 oasys->symbols = (asymbol *)NULL;
437 Oasys support several architectures, but I can't see a simple way
438 to discover which one is in a particular file - we'll guess
440 bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0);
441 if (abfd->symcount != 0) {
442 abfd->flags |= HAS_SYMS;
446 We don't know if a section has data until we've read it..
449 oasys_slurp_section_data(abfd);
455 (void) bfd_release(abfd, oasys);
456 abfd->tdata.oasys_obj_data = save;
457 return (bfd_target *)NULL;
462 DEFUN(oasys_print_symbol,(ignore_abfd, afile, symbol, how),
466 bfd_print_symbol_type how)
468 FILE *file = (FILE *)afile;
471 case bfd_print_symbol_name:
472 case bfd_print_symbol_more:
473 fprintf(file,"%s", symbol->name);
475 case bfd_print_symbol_all:
476 case bfd_print_symbol_nm:
478 CONST char *section_name = symbol->section == (asection *)NULL ?
479 (CONST char *) "*abs" : symbol->section->name;
481 bfd_print_symbol_vandf((PTR)file,symbol);
483 fprintf(file," %-5s %s",
491 The howto table is build using the top two bits of a reloc byte to
492 index into it. The bits are PCREL,WORD/LONG
494 static reloc_howto_type howto_table[]=
497 HOWTO( 0, 0, 1, 16, false,0, true,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false),
498 HOWTO( 0, 0, 2, 32, false,0, true,true,0,"abs32",true,0xffffffff, 0xffffffff,false),
499 HOWTO( 0, 0, 1, 16, true,0, true,true,0,"pcrel16",true,0x0000ffff, 0x0000ffff,false),
500 HOWTO( 0, 0, 2, 32, true,0, true,true,0,"pcrel32",true,0xffffffff, 0xffffffff,false)
503 /* Read in all the section data and relocation stuff too */
505 DEFUN(oasys_slurp_section_data,(abfd),
508 oasys_record_union_type record;
509 oasys_data_type *data = OASYS_DATA(abfd);
512 oasys_per_section_type *per ;
516 /* See if the data has been slurped already .. */
517 for (s = abfd->sections; s != (asection *)NULL; s= s->next) {
518 per = oasys_per_section(s);
519 if (per->initialized == true)
523 if (data->first_data_record == 0) return true;
525 bfd_seek(abfd, data->first_data_record, SEEK_SET);
527 oasys_read_record(abfd, &record);
528 switch (record.header.type)
530 case oasys_record_is_header_enum:
532 case oasys_record_is_data_enum:
535 uint8e_type *src = record.data.data;
536 uint8e_type *end_src = ((uint8e_type *)&record) +
537 record.header.length;
540 bfd_byte *dst_base_ptr ;
543 data->sections[record.data.relb & RELOCATION_SECT_BITS];
545 per = oasys_per_section(section);
548 if (per->initialized == false)
550 per->data = (bfd_byte *) bfd_zalloc(abfd, section->_raw_size);
551 per->reloc_tail_ptr = (oasys_reloc_type **)&(section->relocation);
552 per->had_vma = false;
553 per->initialized = true;
554 section->reloc_count = 0;
555 section->flags = SEC_ALLOC;
558 dst_offset = bfd_h_get_32(abfd, record.data.addr) ;
559 if (per->had_vma == false) {
560 /* Take the first vma we see as the base */
562 section->vma = dst_offset;
567 dst_offset -= section->vma;
570 dst_base_ptr = oasys_per_section(section)->data;
571 dst_ptr = oasys_per_section(section)->data +
575 section->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
577 while (src < end_src) {
578 uint8e_type mod_byte = *src++;
579 uint32_type gap = end_src - src;
582 if (mod_byte == 0 && gap >= 8) {
595 for (relbit = 1; count-- != 0 && src < end_src; relbit <<=1)
597 if (relbit & mod_byte)
599 uint8e_type reloc = *src;
600 /* This item needs to be relocated */
601 switch (reloc & RELOCATION_TYPE_BITS) {
602 case RELOCATION_TYPE_ABS:
606 case RELOCATION_TYPE_REL:
608 /* Relocate the item relative to the section */
609 oasys_reloc_type *r =
612 sizeof(oasys_reloc_type));
613 *(per->reloc_tail_ptr) = r;
614 per->reloc_tail_ptr = &r->next;
615 r->next= (oasys_reloc_type *)NULL;
616 /* Reference to undefined symbol */
618 /* There is no symbol */
620 /* Work out the howto */
624 data->sections[reloc &
625 RELOCATION_SECT_BITS];
628 r->relent.section->vma;
630 r->relent.address = dst_ptr - dst_base_ptr;
631 r->relent.howto = &howto_table[reloc>>6];
632 r->relent.sym_ptr_ptr = (asymbol **)NULL;
633 section->reloc_count++;
635 /* Fake up the data to look like it's got the -ve pc in it, this makes
636 it much easier to convert into other formats. This is done by
639 if (r->relent.howto->pc_relative == true) {
640 r->relent.addend -= dst_ptr - dst_base_ptr;
648 case RELOCATION_TYPE_UND:
650 oasys_reloc_type *r =
653 sizeof(oasys_reloc_type));
654 *(per->reloc_tail_ptr) = r;
655 per->reloc_tail_ptr = &r->next;
656 r->next= (oasys_reloc_type *)NULL;
657 /* Reference to undefined symbol */
659 /* Get symbol number */
660 r->symbol = (src[0]<<8) | src[1];
661 /* Work out the howto */
665 r->relent.section = (asection
668 r->relent.addend = 0;
669 r->relent.address = dst_ptr - dst_base_ptr;
670 r->relent.howto = &howto_table[reloc>>6];
671 r->relent.sym_ptr_ptr = (asymbol **)NULL;
672 section->reloc_count++;
675 /* Fake up the data to look like it's got the -ve pc in it, this makes
676 it much easier to convert into other formats. This is done by
679 if (r->relent.howto->pc_relative == true) {
680 r->relent.addend -= dst_ptr - dst_base_ptr;
687 case RELOCATION_TYPE_COM:
697 case oasys_record_is_local_enum:
698 case oasys_record_is_symbol_enum:
699 case oasys_record_is_section_enum:
712 bfd_error_vector_type bfd_error_vector;
715 DEFUN(oasys_new_section_hook,(abfd, newsect),
719 newsect->used_by_bfd = (PTR)
720 bfd_alloc(abfd, sizeof(oasys_per_section_type));
721 oasys_per_section( newsect)->data = (bfd_byte *)NULL;
722 oasys_per_section(newsect)->section = newsect;
723 oasys_per_section(newsect)->offset = 0;
724 oasys_per_section(newsect)->initialized = false;
725 newsect->alignment_power = 1;
726 /* Turn the section string into an index */
728 sscanf(newsect->name,"%u", &newsect->target_index);
735 DEFUN(oasys_get_reloc_upper_bound, (abfd, asect),
739 oasys_slurp_section_data(abfd);
740 return (asect->reloc_count+1) * sizeof(arelent *);
744 DEFUN(oasys_get_section_contents,(abfd, section, location, offset, count),
751 oasys_per_section_type *p = (oasys_per_section_type *) section->used_by_bfd;
752 oasys_slurp_section_data(abfd);
753 if (p->initialized == false)
755 (void) memset(location, 0, (int)count);
759 (void) memcpy(location,(PTR)( p->data + offset), (int)count);
766 DEFUN(oasys_canonicalize_reloc,(ignore_abfd, section, relptr, symbols),
772 unsigned int reloc_count = 0;
773 oasys_reloc_type *src = (oasys_reloc_type *)(section->relocation);
774 while (src != (oasys_reloc_type *)NULL) {
778 if (src->relent.section == (asection *)NULL)
780 src->relent.sym_ptr_ptr = symbols + src->symbol;
784 *relptr ++ = &src->relent;
788 *relptr = (arelent *)NULL;
789 return section->reloc_count = reloc_count;
798 /* Calculate the checksum and write one record */
800 DEFUN(oasys_write_record,(abfd, type, record, size),
802 CONST oasys_record_enum_type type AND
803 oasys_record_union_type *record AND
809 record->header.length = size;
810 record->header.type = (int)type;
811 record->header.check_sum = 0;
812 record->header.fill = 0;
813 ptr = &record->pad[0];
815 for (i = 0; i < size; i++) {
818 record->header.check_sum = 0xff & (- checksum);
819 bfd_write((PTR)record, 1, size, abfd);
823 /* Write out all the symbols */
825 DEFUN(oasys_write_syms, (abfd),
829 asymbol **generic = bfd_get_outsymbols(abfd);
830 unsigned int index = 0;
831 for (count = 0; count < bfd_get_symcount(abfd); count++) {
833 oasys_symbol_record_type symbol;
834 asymbol * CONST g = generic[count];
836 CONST char *src = g->name;
837 char *dst = symbol.name;
840 if (bfd_is_com_section (g->section)) {
841 symbol.relb = RELOCATION_TYPE_COM;
842 bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0]));
845 else if (g->section == & bfd_abs_section) {
846 symbol.relb = RELOCATION_TYPE_ABS;
847 bfd_h_put_16(abfd, 0, (uint8e_type *)(&symbol.refno[0]));
850 else if (g->section == &bfd_und_section) {
851 symbol.relb = RELOCATION_TYPE_UND ;
852 bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0]));
853 /* Overload the value field with the output index number */
856 else if (g->flags & BSF_DEBUGGING) {
861 if (g->section == (asection *)NULL) {
862 /* Sometime, the oasys tools give out a symbol with illegal
863 bits in it, we'll output it in the same broken way */
865 symbol.relb = RELOCATION_TYPE_REL | 0;
868 symbol.relb = RELOCATION_TYPE_REL |g->section->output_section->target_index;
870 bfd_h_put_16(abfd, 0, (uint8e_type *)(&symbol.refno[0]));
872 #ifdef UNDERSCORE_HACK
881 bfd_h_put_32(abfd, g->value, (bfd_byte*) symbol.value);
884 if (g->flags & BSF_LOCAL) {
885 oasys_write_record(abfd,
886 oasys_record_is_local_enum,
887 (oasys_record_union_type *) &symbol,
888 offsetof(oasys_symbol_record_type, name[0]) + l);
891 oasys_write_record(abfd,
892 oasys_record_is_symbol_enum,
893 (oasys_record_union_type *) &symbol,
894 offsetof(oasys_symbol_record_type, name[0]) + l);
901 /* Write a section header for each section */
903 DEFUN(oasys_write_sections, (abfd),
907 static oasys_section_record_type out = {0};
909 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
910 if (!isdigit(s->name[0]))
912 bfd_error_vector.nonrepresentable_section(abfd,
915 out.relb = RELOCATION_TYPE_REL | s->target_index;
916 bfd_h_put_32(abfd, s->_cooked_size, (bfd_byte *) out.value);
917 bfd_h_put_32(abfd, s->vma, (bfd_byte *) out.vma);
919 oasys_write_record(abfd,
920 oasys_record_is_section_enum,
921 (oasys_record_union_type *) &out,
927 DEFUN(oasys_write_header, (abfd),
930 /* Create and write the header */
931 oasys_header_record_type r;
932 size_t length = strlen(abfd->filename);
933 if (length > (size_t)sizeof(r.module_name)) {
934 length = sizeof(r.module_name);
937 (void)memcpy(r.module_name,
940 (void)memset(r.module_name + length,
942 sizeof(r.module_name) - length);
944 r.version_number = OASYS_VERSION_NUMBER;
945 r.rev_number = OASYS_REV_NUMBER;
946 oasys_write_record(abfd,
947 oasys_record_is_header_enum,
948 (oasys_record_union_type *)&r,
949 offsetof(oasys_header_record_type, description[0]));
956 DEFUN(oasys_write_end,(abfd),
959 oasys_end_record_type end;
960 uint8e_type null = 0;
961 end.relb = RELOCATION_TYPE_ABS;
962 bfd_h_put_32(abfd, abfd->start_address, (bfd_byte *)end.entry);
963 bfd_h_put_16(abfd, 0, (bfd_byte *)end.fill);
965 oasys_write_record(abfd,
966 oasys_record_is_end_enum,
967 (oasys_record_union_type *)&end,
969 bfd_write((PTR)&null, 1, 1, abfd);
977 arelent *a = *((arelent **)ap);
978 arelent *b = *((arelent **)bp);
979 return a->address - b->address;
987 DEFUN(oasys_write_data, (abfd),
991 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
992 if (s->flags & SEC_LOAD) {
993 uint8e_type *raw_data = oasys_per_section(s)->data;
994 oasys_data_record_type processed_data;
995 bfd_size_type current_byte_index = 0;
996 unsigned int relocs_to_go = s->reloc_count;
997 arelent **p = s->orelocation;
998 if (s->reloc_count != 0) {
999 /* Sort the reloc records so it's easy to insert the relocs into the
1002 qsort(s->orelocation,
1007 current_byte_index = 0;
1008 processed_data.relb = s->target_index | RELOCATION_TYPE_REL;
1010 while (current_byte_index < s->_cooked_size)
1012 /* Scan forwards by eight bytes or however much is left and see if
1013 there are any relocations going on */
1014 uint8e_type *mod = &processed_data.data[0];
1015 uint8e_type *dst = &processed_data.data[1];
1021 bfd_h_put_32(abfd, s->vma + current_byte_index,
1022 processed_data.addr);
1024 /* Don't start a relocation unless you're sure you can finish it
1025 within the same data record. The worst case relocation is a
1026 4-byte relocatable value which is split across two modification
1027 bytes (1 relocation byte + 2 symbol reference bytes + 2 data +
1028 1 modification byte + 2 data = 8 bytes total). That's where
1029 the magic number 8 comes from.
1031 while (current_byte_index < s->_raw_size && dst <=
1032 (uint8e_type*)&processed_data.data[sizeof(processed_data.data)-8]) {
1035 if (relocs_to_go != 0) {
1037 reloc_howto_type *CONST how=r->howto;
1038 /* There is a relocation, is it for this byte ? */
1039 if (r->address == current_byte_index) {
1040 uint8e_type rel_byte;
1045 if(how->pc_relative) {
1048 /* Also patch the raw data so that it doesn't have
1049 the -ve stuff any more */
1050 if (how->size != 2) {
1052 bfd_get_16(abfd,raw_data) +
1053 current_byte_index, raw_data);
1058 bfd_get_32(abfd,raw_data) +
1059 current_byte_index, raw_data);
1065 if (how->size ==2) {
1069 /* Is this a section relative relocation, or a symbol
1070 relative relocation ? */
1074 if (r->section != (asection*)NULL)
1076 /* The relent has a section attached, so it must be section
1078 rel_byte |= RELOCATION_TYPE_REL;
1079 rel_byte |= r->section->output_section->target_index;
1085 asymbol *p = *(r->sym_ptr_ptr);
1087 /* If this symbol has a section attached, then it
1088 has already been resolved. Change from a symbol
1089 ref to a section ref */
1090 if(p->section != (asection *)NULL) {
1091 rel_byte |= RELOCATION_TYPE_REL;
1093 p->section->output_section->target_index;
1097 rel_byte |= RELOCATION_TYPE_UND;
1101 /* Next two bytes are a symbol index - we can get
1102 this from the symbol value which has been zapped
1103 into the symbol index in the table when the
1104 symbol table was written
1106 *dst++ = p->value >> 8;
1111 #define ADVANCE { if (++i >= 8) { i = 0; mod = dst++; *mod = 0; } current_byte_index++; }
1112 /* relocations never occur from an unloadable section,
1113 so we can assume that raw_data is not NULL
1115 *dst++ = *raw_data++;
1117 *dst++ = *raw_data++;
1119 if (how->size == 2) {
1120 *dst++ = *raw_data++;
1122 *dst++ = *raw_data++;
1128 /* If this is coming from an unloadable section then copy
1130 if (raw_data == (uint8e_type *)NULL) {
1134 *dst++ = *raw_data++;
1139 /* Don't write a useless null modification byte */
1144 oasys_write_record(abfd,
1145 oasys_record_is_data_enum,
1146 (oasys_record_union_type *)&processed_data,
1147 dst - (uint8e_type*)&processed_data);
1154 DEFUN(oasys_write_object_contents, (abfd),
1157 oasys_write_header(abfd);
1158 oasys_write_syms(abfd);
1159 oasys_write_sections(abfd);
1160 oasys_write_data(abfd);
1161 oasys_write_end(abfd);
1168 /** exec and core file sections */
1170 /* set section contents is complicated with OASYS since the format is
1171 * not a byte image, but a record stream.
1174 DEFUN(oasys_set_section_contents,(abfd, section, location, offset, count),
1179 bfd_size_type count)
1182 if (oasys_per_section(section)->data == (bfd_byte *)NULL )
1184 oasys_per_section(section)->data =
1185 (bfd_byte *)(bfd_alloc(abfd,section->_cooked_size));
1187 (void) memcpy((PTR)(oasys_per_section(section)->data + offset),
1196 /* Native-level interface to symbols. */
1198 /* We read the symbols into a buffer, which is discarded when this
1199 function exits. We read the strings into a buffer large enough to
1200 hold them all plus all the cached symbol entries. */
1203 DEFUN(oasys_make_empty_symbol,(abfd),
1207 oasys_symbol_type *new =
1208 (oasys_symbol_type *)bfd_zalloc (abfd, sizeof (oasys_symbol_type));
1209 new->symbol.the_bfd = abfd;
1210 return &new->symbol;
1217 /* User should have checked the file flags; perhaps we should return
1218 BFD_NO_MORE_SYMBOLS if there are none? */
1221 oasys_openr_next_archived_file(arch, prev)
1225 oasys_ar_data_type *ar = OASYS_AR_DATA(arch);
1226 oasys_module_info_type *p;
1227 /* take the next one from the arch state, or reset */
1228 if (prev == (bfd *)NULL) {
1229 /* Reset the index - the first two entries are bogus*/
1230 ar->module_index = 0;
1233 p = ar->module + ar->module_index;
1236 if (ar->module_index <= ar->module_count) {
1237 if (p->abfd == (bfd *)NULL) {
1238 p->abfd = _bfd_create_empty_archive_element_shell(arch);
1239 p->abfd->origin = p->pos;
1240 p->abfd->filename = p->name;
1242 /* Fixup a pointer to this element for the member */
1243 p->abfd->arelt_data = (PTR)p;
1248 bfd_error = no_more_archived_files;
1254 oasys_find_nearest_line(abfd,
1265 char **filename_ptr;
1266 char **functionname_ptr;
1267 unsigned int *line_ptr;
1274 DEFUN(oasys_generic_stat_arch_elt,(abfd, buf),
1278 oasys_module_info_type *mod = (oasys_module_info_type *) abfd->arelt_data;
1279 if (mod == (oasys_module_info_type *)NULL) {
1280 bfd_error = invalid_operation;
1284 buf->st_size = mod->size;
1285 buf->st_mode = 0666;
1291 DEFUN(oasys_sizeof_headers,(abfd, exec),
1298 #define oasys_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
1299 #define oasys_core_file_failing_signal (int (*)())bfd_0
1300 #define oasys_core_file_matches_executable_p 0
1301 #define oasys_slurp_armap bfd_true
1302 #define oasys_slurp_extended_name_table bfd_true
1303 #define oasys_truncate_arname (void (*)())bfd_nullvoidptr
1304 #define oasys_write_armap 0
1305 #define oasys_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
1306 #define oasys_close_and_cleanup bfd_generic_close_and_cleanup
1307 #define oasys_set_arch_mach bfd_default_set_arch_mach
1308 #define oasys_bfd_debug_info_start bfd_void
1309 #define oasys_bfd_debug_info_end bfd_void
1310 #define oasys_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *)))bfd_void
1311 #define oasys_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
1312 #define oasys_bfd_relax_section bfd_generic_relax_section
1313 #define oasys_bfd_seclet_link bfd_generic_seclet_link
1314 #define oasys_bfd_reloc_type_lookup \
1315 ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
1316 #define oasys_bfd_make_debug_symbol \
1317 ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
1320 bfd_target oasys_vec =
1323 bfd_target_oasys_flavour,
1324 true, /* target byte order */
1325 true, /* target headers byte order */
1326 (HAS_RELOC | EXEC_P | /* object flags */
1327 HAS_LINENO | HAS_DEBUG |
1328 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
1329 (SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
1330 |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
1331 0, /* leading underscore */
1332 ' ', /* ar_pad_char */
1333 16, /* ar_max_namelen */
1334 1, /* minimum alignment */
1335 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
1336 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
1339 oasys_object_p, /* bfd_check_format */
1343 { /* bfd_set_format */
1346 _bfd_generic_mkarchive,
1349 { /* bfd_write_contents */
1351 oasys_write_object_contents,
1352 _bfd_write_archive_contents,