diff options
-rwxr-xr-x | bfd/aout.c | 4 | ||||
-rw-r--r-- | bfd/archive.c | 10 | ||||
-rw-r--r-- | bfd/coff-mips.c | 6 | ||||
-rw-r--r-- | bfd/ieee.c | 903 | ||||
-rw-r--r-- | bfd/libbfd.c | 4 | ||||
-rw-r--r-- | bfd/oasys.c | 51 | ||||
-rw-r--r-- | bfd/srec.c | 31 | ||||
-rw-r--r-- | bfd/sunos.c | 4 |
8 files changed, 474 insertions, 539 deletions
@@ -1273,7 +1273,9 @@ swap_std_reloc_out (abfd, g, natptr) else { r_extern = 0; if (g->section == NULL) { - BFD_ASSERT(0); + /* It is possible to have a reloc with nothing, we generate an + abs + 0 */ + r_addend = 0; r_index = N_ABS | N_EXT; } else if(g->section->output_section == obj_textsec(abfd)) { diff --git a/bfd/archive.c b/bfd/archive.c index 4df6318..f1d8a6a 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -1144,7 +1144,7 @@ bsd_write_armap (arch, elength, map, orl_count, stridx) /* now write the strings themselves */ /* FIXME, this needs to be byte-swapped! */ temp = stridx + 4; - bfd_write (&temp, 1, sizeof (temp), arch); + bfd_write ((PTR)&temp, 1, sizeof (temp), arch); for (count = 0; count < orl_count; count++) bfd_write (*((map[count]).name), 1, strlen (*((map[count]).name))+1, arch); @@ -1211,9 +1211,9 @@ coff_write_armap (arch, elength, map, orl_count, stridx) /* Write the ar header for this item and the number of symbols */ - bfd_write ((char *)&hdr, 1, sizeof (struct ar_hdr), arch); + bfd_write ((PTR)&hdr, 1, sizeof (struct ar_hdr), arch); /* FIXME, this needs to be byte-swapped */ - bfd_write (&orl_count, 1, sizeof (orl_count), arch); + bfd_write ((PTR)&orl_count, 1, sizeof (orl_count), arch); /* Two passes, first write the file offsets for each symbol - remembering that each offset is on a two byte boundary @@ -1230,7 +1230,7 @@ coff_write_armap (arch, elength, map, orl_count, stridx) last_eltno++; } /* FIXME, this needs to be byte-swapped */ - bfd_write (&archive_member_file_ptr, + bfd_write ((PTR)&archive_member_file_ptr, 1, sizeof (archive_member_file_ptr), arch); @@ -1238,7 +1238,7 @@ coff_write_armap (arch, elength, map, orl_count, stridx) /* now write the strings themselves */ for (count = 0; count < orl_count; count++) { - bfd_write (*((map[count]).name), + bfd_write ((PTR)*((map[count]).name), 1, strlen (*((map[count]).name))+1, arch); diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index ebdf221..d424932 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -168,7 +168,7 @@ ecoff_object_p (abfd) bfd_error = no_error; /* figure out how much to read */ - if (bfd_read (short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) + if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) return 0; magic = bfd_h_getshort (abfd, short_bytes); @@ -176,13 +176,13 @@ ecoff_object_p (abfd) bfd_error = wrong_format; return 0; } - if (bfd_read (short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) + if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) return 0; nscns = bfd_h_getshort (abfd, short_bytes); if (bfd_seek (abfd,(file_ptr) ((sizeof (long)) * 3), true) < 0) return 0; - if (bfd_read (short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) + if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) return 0; opthdr = bfd_h_getshort (abfd, short_bytes); @@ -1,4 +1,5 @@ -/* bfd backend for ieee-695 objects. + + /* bfd backend for ieee-695 objects. IEEE 695 format is a stream of records, which we parse using a simple one token (which is one byte in this lexicon) lookahead recursive decent @@ -23,17 +24,13 @@ along with BFD; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sysdep.h" + #include "bfd.h" #include "libbfd.h" -#include "obstack.h" #include "ieee.h" #include "libieee.h" -#define obstack_chunk_alloc malloc -#define obstack_chunk_free free -#define ieee_malloc(abfd,size) \ - obstack_alloc(&( ieee_data(abfd)->ieee_obstack), (size)) typedef void generic_symbol_type; @@ -49,7 +46,7 @@ DEFUN(ieee_write_byte,(abfd, byte), bfd *abfd AND bfd_byte byte) { - bfd_write(&byte, 1, 1, abfd); + bfd_write((PTR)&byte, 1, 1, abfd); } @@ -62,7 +59,7 @@ DEFUN(ieee_write_2bytes,(abfd, bytes), buffer[0] = bytes >> 8; buffer[1] = bytes & 0xff; - bfd_write(buffer, 1, 2, abfd); + bfd_write((PTR)buffer, 1, 2, abfd); } static void @@ -123,72 +120,75 @@ DEFUN(ieee_write_id,(abfd, id), else { BFD_FAIL(); } - bfd_write((bfd_byte *)id, 1, length, abfd); + bfd_write((PTR)id, 1, length, abfd); } /*************************************************************************** Functions for reading from ieee files in the strange way that the standard requires: */ -#define this_byte(abfd) *(ptr(abfd)) -#define next_byte(abfd) (ptr(abfd)++) -#define this_byte_and_next(abfd) *(ptr(abfd)++) + +#define this_byte(ieee) *(ieee->input_p) +#define next_byte(ieee) (ieee->input_p++) +#define this_byte_and_next(ieee) (*(ieee->input_p++)) static unsigned short -DEFUN(read_2bytes,(abfd), - bfd *abfd) +DEFUN(read_2bytes,(ieee), + ieee_data_type *ieee) { - unsigned char c1 = this_byte_and_next(abfd); - unsigned char c2 = this_byte_and_next(abfd); + unsigned char c1 = this_byte_and_next(ieee); + unsigned char c2 = this_byte_and_next(ieee); return (c1<<8 ) | c2; } static void -DEFUN(bfd_get_string,(abfd, string, length), - bfd *abfd AND +DEFUN(bfd_get_string,(ieee, string, length), + ieee_data_type *ieee AND char *string AND size_t length) { size_t i; for (i= 0; i < length; i++) { - string[i] = this_byte_and_next(abfd); + string[i] = this_byte_and_next(ieee); } } static char * -DEFUN(read_id,(abfd), - bfd *abfd) +DEFUN(read_id,(ieee), + ieee_data_type *ieee) { size_t length; char *string; - length = this_byte_and_next(abfd); + length = this_byte_and_next(ieee); if (length >= 0x00 && length <= 0x7f) { /* Simple string of length 0 to 127 */ } else if (length == 0xde) { /* Length is next byte, allowing 0..255 */ - length = this_byte_and_next(abfd); + length = this_byte_and_next(ieee); } else if (length == 0xdf) { /* Length is next two bytes, allowing 0..65535 */ - length = this_byte_and_next(abfd) ; - length = (length * 256) + this_byte_and_next(abfd); + length = this_byte_and_next(ieee) ; + length = (length * 256) + this_byte_and_next(ieee); } /* Buy memory and read string */ - string = ieee_malloc(abfd, length+1); - bfd_get_string(abfd, string, length); + string = bfd_alloc(ieee->abfd, length+1); + bfd_get_string(ieee, string, length); string[length] = 0; return string; } static void -DEFUN(ieee_write_expression,(abfd, value, section, symbol), +DEFUN(ieee_write_expression,(abfd, value, section, symbol, pcrel, index), bfd*abfd AND bfd_vma value AND asection *section AND - asymbol *symbol) + asymbol *symbol AND + boolean pcrel AND + unsigned int index) { unsigned int plus_count = 0; ieee_write_int(abfd, value); @@ -198,6 +198,8 @@ DEFUN(ieee_write_expression,(abfd, value, section, symbol), ieee_write_byte(abfd, section->index +IEEE_SECTION_NUMBER_BASE); } + + if (symbol != (asymbol *)NULL) { plus_count++; if ((symbol->flags & BSF_UNDEFINED ) || @@ -228,7 +230,14 @@ DEFUN(ieee_write_expression,(abfd, value, section, symbol), } } - while (plus_count != 0) { + if(pcrel) { + /* subtract the pc from here by asking for PC of this section*/ + ieee_write_byte(abfd, ieee_variable_P_enum); + ieee_write_byte(abfd, index +IEEE_SECTION_NUMBER_BASE); + ieee_write_byte(abfd, ieee_function_minus_enum); + } + + while (plus_count > 0) { ieee_write_byte(abfd, ieee_function_plus_enum); plus_count--; } @@ -264,30 +273,30 @@ DEFUN(ieee_write_int5_out, (abfd, value), bfd *abfd AND bfd_vma value) { - char b[5]; + bfd_byte b[5]; ieee_write_int5(b, value); - bfd_write(b,1,5,abfd); + bfd_write((PTR)b,1,5,abfd); } static boolean -DEFUN(parse_int,(abfd, value_ptr), - bfd *abfd AND +DEFUN(parse_int,(ieee, value_ptr), + ieee_data_type *ieee AND bfd_vma *value_ptr) { - int value = this_byte(abfd); + int value = this_byte(ieee); int result; if (value >= 0 && value <= 127) { *value_ptr = value; - next_byte(abfd); + next_byte(ieee); return true; } else if (value >= 0x80 && value <= 0x88) { unsigned int count = value & 0xf; result = 0; - next_byte(abfd); + next_byte(ieee); while (count) { - result =(result << 8) | this_byte_and_next(abfd); + result =(result << 8) | this_byte_and_next(ieee); count--; } *value_ptr = result; @@ -296,21 +305,21 @@ DEFUN(parse_int,(abfd, value_ptr), return false; } static int -DEFUN(parse_i,(abfd, ok), - bfd *abfd AND +DEFUN(parse_i,(ieee, ok), + ieee_data_type *ieee AND boolean *ok) { bfd_vma x; - *ok = parse_int(abfd, &x); + *ok = parse_int(ieee, &x); return x; } static bfd_vma -DEFUN(must_parse_int,(abfd), - bfd *abfd) +DEFUN(must_parse_int,(ieee), + ieee_data_type *ieee) { bfd_vma result; - BFD_ASSERT(parse_int(abfd, &result) == true); + BFD_ASSERT(parse_int(ieee, &result) == true); return result; } @@ -324,22 +333,30 @@ typedef struct static reloc_howto_type abs32_howto - = HOWTO(1,0,2,32,0,0,0,true,0,"abs32",false,0xffffffff, 0xffffffff,false); + = HOWTO(1,0,2,32,0,0,0,true,0,"abs32",true,0xffffffff, 0xffffffff,false); static reloc_howto_type abs16_howto - = HOWTO(1,0,1,16,0,0,0,true,0,"abs16",false,0x0000ffff, 0x0000ffff,false); + = HOWTO(1,0,1,16,0,0,0,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false); + +static +reloc_howto_type rel32_howto + = HOWTO(1,0,2,32,1,0,0,true,0,"rel32",true,0xffffffff, 0xffffffff,false); +static +reloc_howto_type rel16_howto + = HOWTO(1,0,1,16,1,0,0,true,0,"rel16",true,0x0000ffff, 0x0000ffff,false); static ieee_symbol_index_type NOSYMBOL = { 0, 0}; static void -DEFUN(parse_expression,(abfd, value, section, symbol, pcrel, extra), - bfd *abfd AND +DEFUN(parse_expression,(ieee, value, section, symbol, pcrel, extra), + ieee_data_type *ieee AND bfd_vma *value AND asection **section AND ieee_symbol_index_type *symbol AND boolean *pcrel AND unsigned int *extra) + { #define POS sp[1] #define TOS sp[0] @@ -356,110 +373,108 @@ DEFUN(parse_expression,(abfd, value, section, symbol, pcrel, extra), ieee_value_type *sp = stack; while (loop) { - switch (this_byte(abfd)) - { - case ieee_variable_P_enum: - /* P variable, current program counter for section n */ + switch (this_byte(ieee)) { - int section_n ; - next_byte(abfd); - section_n = must_parse_int(abfd); - PUSH(NOSYMBOL, 0, - TOS.value = ieee_data(abfd)->section_table[section_n]->vma + - ieee_per_section(ieee_data(abfd)->section_table[section_n])->pc); + case ieee_variable_P_enum: + /* P variable, current program counter for section n */ + { + int section_n ; + next_byte(ieee); + *pcrel = true; + section_n = must_parse_int(ieee); + PUSH(NOSYMBOL, 0, + TOS.value = ieee->section_table[section_n]->vma + + ieee_per_section(ieee->section_table[section_n])->pc); + break; + } + case ieee_variable_L_enum: + /* L variable address of section N */ + next_byte(ieee); + PUSH(NOSYMBOL,ieee->section_table[must_parse_int(ieee)],0); + break; + case ieee_variable_R_enum: + /* R variable, logical address of section module */ + /* FIXME, this should be different to L */ + next_byte(ieee); + PUSH(NOSYMBOL,ieee->section_table[must_parse_int(ieee)],0); + break; + case ieee_variable_S_enum: + /* S variable, size in MAUS of section module */ + next_byte(ieee); + PUSH(NOSYMBOL, + 0, + ieee->section_table[must_parse_int(ieee)]->size); break; - } - case ieee_variable_L_enum: - /* L variable address of section N */ - next_byte(abfd); - PUSH(NOSYMBOL,ieee_data(abfd)->section_table[must_parse_int(abfd)],0); - break; - case ieee_variable_R_enum: - /* R variable, logical address of section module */ - /* FIXME, this should be different to L */ - next_byte(abfd); - PUSH(NOSYMBOL,ieee_data(abfd)->section_table[must_parse_int(abfd)],0); - break; - case ieee_variable_S_enum: - /* S variable, size in MAUS of section module */ - next_byte(abfd); - PUSH(NOSYMBOL, - 0, - ieee_data(abfd)->section_table[must_parse_int(abfd)]->size); - break; - case ieee_variable_X_enum: - /* Push the address of external variable n */ - { - ieee_symbol_index_type sy; - next_byte(abfd); - sy.index = (int)(must_parse_int(abfd)) ; - sy.letter = 'X'; + case ieee_variable_X_enum: + /* Push the address of external variable n */ + { + ieee_symbol_index_type sy; + next_byte(ieee); + sy.index = (int)(must_parse_int(ieee)) ; + sy.letter = 'X'; - PUSH(sy, 0, 0); - } - break; - case ieee_function_minus_enum: - { - bfd_vma value1, value2; - asection *section; - ieee_symbol_index_type sy; - next_byte(abfd); - - POP(sy, section, value1); - POP(sy, section, value2); - PUSH(NOSYMBOL, 0, value1-value2); - } - break; - case ieee_function_plus_enum: - { - bfd_vma value1, value2; - asection *section1; - asection *section2; - ieee_symbol_index_type sy1; - ieee_symbol_index_type sy2; - next_byte(abfd); - - POP(sy1, section1, value1); - POP(sy2, section2, value2); - PUSH(sy1.letter ? sy1 : sy2, section1 ? section1: section2, value1+value2); - } - break; - default: - { - bfd_vma va; - BFD_ASSERT(this_byte(abfd) < ieee_variable_A_enum - || this_byte(abfd) > ieee_variable_Z_enum); - if (parse_int(abfd, &va)) + PUSH(sy, 0, 0); + } + break; + case ieee_function_minus_enum: { - PUSH(NOSYMBOL,0, va); + bfd_vma value1, value2; + asection *section1, *section_dummy; + ieee_symbol_index_type sy; + next_byte(ieee); + + POP(sy, section1, value1); + POP(sy, section_dummy, value2); + PUSH(sy, section1, value1-value2); } - else { - /* - Thats all that we can understand. As far as I can see - there is a bug in the Microtec IEEE output which I'm - using to scan, whereby the comma operator is ommited - sometimes in an expression, giving expressions with too - many terms. We can tell if that's the case by ensuring - that sp == stack here. If not, then we've pushed - something too far. - - */ - - POP(*symbol, *section, *value); - if (sp != stack) { - BFD_ASSERT(*section == 0); - *extra = *value; - /* Get what should be returned */ - POP(*symbol, *section, *value); + break; + case ieee_function_plus_enum: + { + bfd_vma value1, value2; + asection *section1; + asection *section2; + ieee_symbol_index_type sy1; + ieee_symbol_index_type sy2; + next_byte(ieee); + + POP(sy1, section1, value1); + POP(sy2, section2, value2); + PUSH(sy1.letter ? sy1 : sy2, section1 ? section1: section2, value1+value2); } - else { - *extra = 0; + break; + default: + { + bfd_vma va; + BFD_ASSERT(this_byte(ieee) < ieee_variable_A_enum + || this_byte(ieee) > ieee_variable_Z_enum); + if (parse_int(ieee, &va)) + { + PUSH(NOSYMBOL,0, va); + } + else { + /* + Thats all that we can understand. As far as I can see + there is a bug in the Microtec IEEE output which I'm + using to scan, whereby the comma operator is ommited + sometimes in an expression, giving expressions with too + many terms. We can tell if that's the case by ensuring + that sp == stack here. If not, then we've pushed + something too far, so we keep adding + */ + + while (sp != stack+1) { + asection *section1; + ieee_symbol_index_type sy1; + POP(sy1, section1, *extra); + } + + POP(*symbol, *section, *value); + loop = false; + } } - loop = false; - } - } - } + } } } @@ -486,22 +501,22 @@ DEFUN(ieee_slurp_external_symbols,(abfd), ieee_seek(abfd, offset ); while (loop) { - switch (this_byte(abfd)) { + switch (this_byte(ieee)) { case ieee_external_symbol_enum: - next_byte(abfd); - symbol = (ieee_symbol_type *)ieee_malloc(abfd, sizeof(ieee_symbol_type)); + next_byte(ieee); + symbol = (ieee_symbol_type *)bfd_alloc(ieee->abfd, sizeof(ieee_symbol_type)); *prev_symbols_ptr = symbol; prev_symbols_ptr= &symbol->next; - symbol->index = must_parse_int(abfd); + symbol->index = must_parse_int(ieee); if (symbol->index > ieee->external_symbol_max_index) { ieee->external_symbol_max_index = symbol->index; } BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index); symbol_count++; symbol->symbol.the_bfd = abfd; - symbol->symbol.name = read_id(abfd); - symbol->symbol.udata = (void *)NULL; + symbol->symbol.name = read_id(ieee); + symbol->symbol.udata = (PTR)NULL; symbol->symbol.flags = BSF_NO_FLAGS; break; case ieee_attribute_record_enum >> 8: @@ -510,13 +525,13 @@ DEFUN(ieee_slurp_external_symbols,(abfd), unsigned int symbol_type_index; unsigned int symbol_attribute_def; bfd_vma value; - next_byte(abfd); /* Skip prefix */ - next_byte(abfd); - symbol_name_index = must_parse_int(abfd); - symbol_type_index = must_parse_int(abfd); - symbol_attribute_def = must_parse_int(abfd); + next_byte(ieee); /* Skip prefix */ + next_byte(ieee); + symbol_name_index = must_parse_int(ieee); + symbol_type_index = must_parse_int(ieee); + symbol_attribute_def = must_parse_int(ieee); - parse_int(abfd,&value); + parse_int(ieee,&value); } break; @@ -525,17 +540,17 @@ DEFUN(ieee_slurp_external_symbols,(abfd), unsigned int symbol_name_index; ieee_symbol_index_type symbol_ignore; boolean pcrel_ignore; - unsigned int extra_ignore; - next_byte(abfd); - next_byte(abfd); + unsigned int extra; + next_byte(ieee); + next_byte(ieee); - symbol_name_index = must_parse_int(abfd); - parse_expression(abfd, + symbol_name_index = must_parse_int(ieee); + parse_expression(ieee, &symbol->symbol.value, &symbol->symbol.section, &symbol_ignore, - &pcrel_ignore, - &extra_ignore); + &pcrel_ignore, + &extra); if (symbol->symbol.section != (asection *)NULL) { symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT; } @@ -547,13 +562,13 @@ DEFUN(ieee_slurp_external_symbols,(abfd), case ieee_weak_external_reference_enum: { bfd_vma size; bfd_vma value ; - next_byte(abfd); + next_byte(ieee); /* Throw away the external reference index */ - (void)must_parse_int(abfd); + (void)must_parse_int(ieee); /* Fetch the default size if not resolved */ - size = must_parse_int(abfd); + size = must_parse_int(ieee); /* Fetch the defautlt value if available */ - if ( parse_int(abfd, &value) == false) { + if ( parse_int(ieee, &value) == false) { value = 0; } /* This turns into a common */ @@ -563,15 +578,15 @@ DEFUN(ieee_slurp_external_symbols,(abfd), break; case ieee_external_reference_enum: - next_byte(abfd); - symbol = (ieee_symbol_type *)ieee_malloc(abfd, sizeof(ieee_symbol_type)); + next_byte(ieee); + symbol = (ieee_symbol_type *)bfd_alloc(ieee->abfd, sizeof(ieee_symbol_type)); symbol_count++; *prev_reference_ptr = symbol; prev_reference_ptr = &symbol->next; - symbol->index = must_parse_int(abfd); + symbol->index = must_parse_int(ieee); symbol->symbol.the_bfd = abfd; - symbol->symbol.name = read_id(abfd); - symbol->symbol.udata = (void *)NULL; + symbol->symbol.name = read_id(ieee); + symbol->symbol.udata = (PTR)NULL; symbol->symbol.section = (asection *)NULL; symbol->symbol.value = (bfd_vma)0; symbol->symbol.flags = BSF_UNDEFINED; @@ -626,7 +641,7 @@ DEFUN(ieee_slurp_symbol_table,(abfd), } } -size_t +unsigned int DEFUN(ieee_get_symtab_upper_bound,(abfd), bfd *abfd) { @@ -642,7 +657,6 @@ symbol index order */ extern bfd_target ieee_vec; - unsigned int DEFUN(ieee_get_symtab,(abfd, location), bfd *abfd AND @@ -651,7 +665,8 @@ DEFUN(ieee_get_symtab,(abfd, location), ieee_symbol_type *symp; static bfd dummy_bfd; static asymbol empty_symbol = - { &dummy_bfd," ieee empty",(symvalue)0,BSF_DEBUGGING | BSF_FAKE}; + { &dummy_bfd," ieee empty",(symvalue)0,BSF_DEBUGGING | BSF_ABSOLUTE}; + ieee_data_type *ieee = ieee_data(abfd); dummy_bfd.xvec= &ieee_vec; @@ -709,12 +724,12 @@ DEFUN(ieee_slurp_sections,(abfd), bfd_byte section_type[3]; ieee_seek(abfd, offset); while (true) { - switch (this_byte(abfd)) { + switch (this_byte(ieee)) { case ieee_section_type_enum: { unsigned int section_index ; - next_byte(abfd); - section_index = must_parse_int(abfd); + next_byte(ieee); + section_index = must_parse_int(ieee); /* Fixme to be nice about a silly number of sections */ BFD_ASSERT(section_index < NSECTIONS); @@ -722,24 +737,24 @@ DEFUN(ieee_slurp_sections,(abfd), ieee->section_table[section_index] = section; section->flags = SEC_NO_FLAGS; section->target_index = section_index; - section_type[0] = this_byte_and_next(abfd); + section_type[0] = this_byte_and_next(ieee); switch (section_type[0]) { case 0xC3: - section_type[1] = this_byte(abfd); + section_type[1] = this_byte(ieee); section->flags = SEC_LOAD; switch (section_type[1]) { case 0xD0: /* Normal code */ - next_byte(abfd); + next_byte(ieee); section->flags |= SEC_LOAD | SEC_CODE; break; case 0xC4: - next_byte(abfd); + next_byte(ieee); section->flags |= SEC_LOAD | SEC_DATA; /* Normal data */ break; case 0xD2: - next_byte(abfd); + next_byte(ieee); /* Normal rom data */ section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA; break; @@ -747,11 +762,11 @@ DEFUN(ieee_slurp_sections,(abfd), break; } } - section->name = read_id(abfd); + section->name = read_id(ieee); { bfd_vma parent, brother, context; - parse_int(abfd, &parent); - parse_int(abfd, &brother); - parse_int(abfd, &context); + parse_int(ieee, &parent); + parse_int(ieee, &brother); + parse_int(ieee, &context); } @@ -761,47 +776,47 @@ DEFUN(ieee_slurp_sections,(abfd), { unsigned int section_index; bfd_vma value; - next_byte(abfd); - section_index = must_parse_int(abfd); + next_byte(ieee); + section_index = must_parse_int(ieee); if (section_index > ieee->section_count) { ieee->section_count = section_index; } ieee->section_table[section_index]->alignment_power = - bfd_log2(must_parse_int(abfd)); - (void)parse_int(abfd, & value); + bfd_log2(must_parse_int(ieee)); + (void)parse_int(ieee, & value); } break; case ieee_e2_first_byte_enum: { - ieee_record_enum_type t = read_2bytes(abfd); + ieee_record_enum_type t = read_2bytes(ieee); switch (t) { case ieee_section_size_enum: - section = ieee->section_table[must_parse_int(abfd)]; - section->size = must_parse_int(abfd); + section = ieee->section_table[must_parse_int(ieee)]; + section->size = must_parse_int(ieee); break; case ieee_physical_region_size_enum: - section = ieee->section_table[must_parse_int(abfd)]; - section->size = must_parse_int(abfd); + section = ieee->section_table[must_parse_int(ieee)]; + section->size = must_parse_int(ieee); break; case ieee_region_base_address_enum: - section = ieee->section_table[must_parse_int(abfd)]; - section->vma = must_parse_int(abfd); + section = ieee->section_table[must_parse_int(ieee)]; + section->vma = must_parse_int(ieee); break; case ieee_mau_size_enum: - must_parse_int(abfd); - must_parse_int(abfd); + must_parse_int(ieee); + must_parse_int(ieee); break; case ieee_m_value_enum: - must_parse_int(abfd); - must_parse_int(abfd); + must_parse_int(ieee); + must_parse_int(ieee); break; case ieee_section_base_address_enum: - section = ieee->section_table[must_parse_int(abfd)]; - section->vma = must_parse_int(abfd); + section = ieee->section_table[must_parse_int(ieee)]; + section->vma = must_parse_int(ieee); break; case ieee_section_offset_enum: - (void) must_parse_int(abfd); - (void) must_parse_int(abfd); + (void) must_parse_int(ieee); + (void) must_parse_int(ieee); break; default: return; @@ -822,21 +837,25 @@ bfd_target * DEFUN(ieee_archive_p,(abfd), bfd *abfd) { + return 0; +#if 0 char *library; boolean loop; ieee_ar_data_type *ar; unsigned int i; - return 0; /* FIXME */ + + +/* FIXME */ ieee_seek(abfd, (file_ptr) 0); if (this_byte(abfd) != Module_Beginning) return (bfd_target*)NULL; - next_byte(abfd); - library= read_id(abfd); + next_byte(ieee); + library= read_id(ieee); if (strcmp(library , "LIBRARY") != 0) { free(library); return (bfd_target *)NULL; } /* Throw away the filename */ - free( read_id(abfd)); + free( read_id(ieee)); /* This must be an IEEE archive, so we'll buy some space to do things */ ar = (ieee_ar_data_type *) malloc(sizeof(ieee_ar_data_type)); @@ -845,9 +864,9 @@ DEFUN(ieee_archive_p,(abfd), ar->element_index = 0; obstack_init(&ar->element_obstack); - next_byte(abfd); /* Drop the ad part */ - must_parse_int(abfd); /* And the two dummy numbers */ - must_parse_int(abfd); + next_byte(ieee); /* Drop the ad part */ + must_parse_int(ieee); /* And the two dummy numbers */ + must_parse_int(ieee); loop = true; /* Read the index of the BB table */ @@ -855,8 +874,8 @@ DEFUN(ieee_archive_p,(abfd), ieee_ar_obstack_type t; int rec =read_2bytes(abfd); if (rec ==ieee_assign_value_to_variable_enum) { - int record_number = must_parse_int(abfd); - t.file_offset = must_parse_int(abfd); + int record_number = must_parse_int(ieee); + t.file_offset = must_parse_int(ieee); t.abfd = (bfd *)NULL; ar->element_count++; obstack_grow(&ar->element_obstack, (PTR)&t, sizeof(t)); @@ -871,34 +890,28 @@ DEFUN(ieee_archive_p,(abfd), for (i = 2; i < ar->element_count; i++) { ieee_seek(abfd, ar->elements[i].file_offset); - next_byte(abfd); /* Drop F8 */ - next_byte(abfd); /* Drop 14 */ - must_parse_int(abfd); /* Drop size of block */ - if (must_parse_int(abfd) != 0) { + next_byte(ieee); /* Drop F8 */ + next_byte(ieee); /* Drop 14 */ + must_parse_int(ieee); /* Drop size of block */ + if (must_parse_int(ieee) != 0) { /* This object has been deleted */ ar->elements[i].file_offset = 0; } else { - ar->elements[i].file_offset = must_parse_int(abfd); + ar->elements[i].file_offset = must_parse_int(ieee); } } obstack_finish(&ar->element_obstack); return abfd->xvec; +#endif } static boolean DEFUN(ieee_mkobject,(abfd), bfd *abfd) { - struct obstack tmp_obstack; - ieee_data_type *ieee; - - obstack_init(&tmp_obstack); - BFD_ASSERT(ieee_data(abfd) == 0); - set_tdata (abfd, obstack_alloc(&tmp_obstack,sizeof(ieee_data_type))); - ieee = ieee_data(abfd); - ieee->ieee_obstack = tmp_obstack; + ieee_data(abfd) = (ieee_data_type *)bfd_alloc(abfd,sizeof(ieee_data_type)); return true; } @@ -909,17 +922,17 @@ DEFUN(ieee_object_p,(abfd), char *processor; unsigned int part; ieee_data_type *ieee; - char buffer[300]; - + uint8e_type buffer[300]; + ieee_data_type *save = ieee_data(abfd); set_tdata (abfd, 0); ieee_mkobject(abfd); ieee = ieee_data(abfd); /* Read the first few bytes in to see if it makes sense */ - bfd_read(buffer, 1, sizeof(buffer), abfd); + bfd_read((PTR)buffer, 1, sizeof(buffer), abfd); - ptr(abfd)= buffer; - if (*(ptr(abfd)++) != Module_Beginning) goto fail; + ieee->input_p = buffer; + if (this_byte_and_next(ieee) != Module_Beginning) goto fail; ieee->read_symbols= false; ieee->read_data= false; @@ -928,45 +941,46 @@ DEFUN(ieee_object_p,(abfd), ieee->external_symbol_min_index = IEEE_PUBLIC_BASE; ieee->external_reference_min_index =IEEE_REFERENCE_BASE; ieee->external_reference_max_index = 0; + ieee->abfd = abfd; memset((PTR)ieee->section_table, 0, sizeof(ieee->section_table)); - processor = ieee->mb.processor = read_id(abfd); + processor = ieee->mb.processor = read_id(ieee); if (strcmp(processor,"LIBRARY") == 0) goto fail; - ieee->mb.module_name = read_id(abfd); + ieee->mb.module_name = read_id(ieee); if (abfd->filename == (char *)NULL) { abfd->filename = ieee->mb.module_name; } /* Determine the architecture and machine type of the object file. */ bfd_scan_arch_mach(processor, &abfd->obj_arch, &abfd->obj_machine); - if (this_byte(abfd) != ieee_address_descriptor_enum) { + if (this_byte(ieee) != ieee_address_descriptor_enum) { goto fail; } - next_byte(abfd); + next_byte(ieee); - if (parse_int(abfd, &ieee->ad.number_of_bits_mau) == false) { + if (parse_int(ieee, &ieee->ad.number_of_bits_mau) == false) { goto fail; } - if(parse_int(abfd, &ieee->ad.number_of_maus_in_address) == false) { + if(parse_int(ieee, &ieee->ad.number_of_maus_in_address) == false) { goto fail; } /* If there is a byte order info, take it */ - if (this_byte(abfd) == ieee_variable_L_enum || - this_byte(abfd) == ieee_variable_M_enum) - next_byte(abfd); + if (this_byte(ieee) == ieee_variable_L_enum || + this_byte(ieee) == ieee_variable_M_enum) + next_byte(ieee); for (part = 0; part < N_W_VARIABLES; part++) { boolean ok; - if (read_2bytes(abfd) != ieee_assign_value_to_variable_enum) { + if (read_2bytes(ieee) != ieee_assign_value_to_variable_enum) { goto fail; } - if (this_byte_and_next(abfd) != part) { + if (this_byte_and_next(ieee) != part) { goto fail; } - ieee->w.offset[part] = parse_i(abfd, &ok); + ieee->w.offset[part] = parse_i(ieee, &ok); if (ok==false) { goto fail; } @@ -979,15 +993,16 @@ DEFUN(ieee_object_p,(abfd), quickly. We can work out how big the file is from the trailer record */ - ieee_data(abfd)->first_byte = ieee_malloc(abfd, ieee->w.r.me_record + ieee_data(abfd)->first_byte = (uint8e_type *) bfd_alloc(ieee->abfd, ieee->w.r.me_record + 50); bfd_seek(abfd, 0, 0); - bfd_read(ieee_data(abfd)->first_byte, 1, ieee->w.r.me_record+50, abfd); + bfd_read((PTR)(ieee_data(abfd)->first_byte), 1, ieee->w.r.me_record+50, abfd); ieee_slurp_sections(abfd); return abfd->xvec; fail: - obstack_finish(&ieee->ieee_obstack); + (void) bfd_release(abfd, ieee); + ieee_data(abfd) = save; return (bfd_target *)NULL; } @@ -1014,16 +1029,20 @@ DEFUN(ieee_print_symbol,(ignore_abfd, file, symbol, how), { CONST char *section_name = symbol->section == (asection *)NULL ? "*abs" : symbol->section->name; + if (symbol->name[0] == ' ') { + fprintf(file,"* empty table entry "); + } + else { + bfd_print_symbol_vandf((PTR)file,symbol); - bfd_print_symbol_vandf((void *)file,symbol); - - fprintf(file," %-5s %04x %02x %s", - section_name, - (unsigned) ieee_symbol(symbol)->index, - (unsigned) 0, /* + fprintf(file," %-5s %04x %02x %s", + section_name, + (unsigned) ieee_symbol(symbol)->index, + (unsigned) 0, /* aout_symbol(symbol)->desc & 0xffff, aout_symbol(symbol)->other & 0xff,*/ - symbol->name); + symbol->name); + } } break; } @@ -1052,7 +1071,7 @@ DEFUN(ieee_slurp_section_data,(abfd), for (s = abfd->sections; s != (asection *)NULL; s = s->next) { ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd; - per->data = (bfd_byte *) ieee_malloc(abfd, s->size); + per->data = (bfd_byte *) bfd_alloc(ieee->abfd, s->size); /*SUPPRESS 68*/ per->reloc_tail_ptr = (ieee_reloc_type **)&(s->relocation); @@ -1061,15 +1080,15 @@ DEFUN(ieee_slurp_section_data,(abfd), while (true) { - switch (this_byte(abfd)) + switch (this_byte(ieee)) { /* IF we see anything strange then quit */ default: return true; case ieee_set_current_section_enum: - next_byte(abfd); - section_number = must_parse_int(abfd); + next_byte(ieee); + section_number = must_parse_int(ieee); s = ieee->section_table[section_number]; current_map = (ieee_per_section_type *) s->used_by_bfd; location_ptr = current_map->data - s->vma; @@ -1083,19 +1102,19 @@ DEFUN(ieee_slurp_section_data,(abfd), { unsigned int number_of_maus; unsigned int i; - next_byte(abfd); - number_of_maus = must_parse_int(abfd); + next_byte(ieee); + number_of_maus = must_parse_int(ieee); for (i = 0; i < number_of_maus; i++) { - location_ptr[current_map->pc++]= this_byte(abfd); - next_byte(abfd); + location_ptr[current_map->pc++]= this_byte(ieee); + next_byte(ieee); } } break; case ieee_e2_first_byte_enum: - next_byte(abfd); - switch (this_byte(abfd)) + next_byte(ieee); + switch (this_byte(ieee)) { case ieee_set_current_pc_enum & 0xff: { @@ -1104,9 +1123,10 @@ DEFUN(ieee_slurp_section_data,(abfd), ieee_symbol_index_type symbol; unsigned int extra; boolean pcrel; - next_byte(abfd); - must_parse_int(abfd); /* Thow away section #*/ - parse_expression(abfd, &value, &dsection, &symbol, &pcrel, &extra); + next_byte(ieee); + must_parse_int(ieee); /* Thow away section #*/ + parse_expression(ieee, &value, &dsection, &symbol, + &pcrel, &extra); current_map->pc = value; BFD_ASSERT((unsigned)(value - s->vma) <= s->size); } @@ -1115,7 +1135,6 @@ DEFUN(ieee_slurp_section_data,(abfd), case ieee_value_starting_address_enum & 0xff: /* We've got to the end of the data now - */ return true; - break; default: BFD_FAIL(); return true; @@ -1124,10 +1143,10 @@ DEFUN(ieee_slurp_section_data,(abfd), case ieee_load_with_relocation_enum: { boolean loop = true; - next_byte(abfd); + next_byte(ieee); while (loop) { - switch (this_byte(abfd)) + switch (this_byte(ieee)) { case ieee_variable_R_enum: @@ -1135,75 +1154,93 @@ DEFUN(ieee_slurp_section_data,(abfd), case ieee_function_unsigned_open_b_enum: case ieee_function_either_open_b_enum: { - unsigned int extra; - boolean pcrel; + unsigned int extra = 4; + boolean pcrel = false; - ieee_reloc_type *r = - (ieee_reloc_type *) ieee_malloc(abfd, - sizeof(ieee_reloc_type)); + ieee_reloc_type *r = + (ieee_reloc_type *) bfd_alloc(ieee->abfd, + sizeof(ieee_reloc_type)); *(current_map->reloc_tail_ptr) = r; current_map->reloc_tail_ptr= &r->next; r->next = (ieee_reloc_type *)NULL; - next_byte(abfd); - parse_expression(abfd, - &r->relent.addend, - &r->relent.section, - &r->symbol, - &pcrel, - &extra); + next_byte(ieee); + parse_expression(ieee, + &r->relent.addend, + &r->relent.section, + &r->symbol, + &pcrel, &extra); r->relent.address = current_map->pc; s->reloc_count++; - switch (this_byte(abfd)) { + switch (this_byte(ieee)) { case ieee_function_signed_close_b_enum: - next_byte(abfd); + next_byte(ieee); break; case ieee_function_unsigned_close_b_enum: - next_byte(abfd); + next_byte(ieee); break; case ieee_function_either_close_b_enum: - next_byte(abfd); + next_byte(ieee); break; default: break; } /* Build a relocation entry for this type */ - if (this_byte(abfd) == ieee_comma) { - - next_byte(abfd); + if (this_byte(ieee) == ieee_comma) { + next_byte(ieee); /* Fetch number of bytes to pad */ - extra = must_parse_int(abfd); - BFD_FAIL(); - } - switch (extra) { - case 0: - case 4: - location_ptr[current_map->pc++] = 0; - location_ptr[current_map->pc++] = 0; - location_ptr[current_map->pc++] = 0; - location_ptr[current_map->pc++] = 0; - r->relent.howto = &abs32_howto; - break; - case 2: - location_ptr[current_map->pc++] = 0; - location_ptr[current_map->pc++] = 0; - r->relent.howto = &abs16_howto; - break; - - default: - BFD_FAIL(); - break; - } + extra = must_parse_int(ieee); + }; + + /* If pc rel then stick -ve pc into instruction + and take out of reloc*/ + + switch (extra) + { + case 0: + case 4: + if (pcrel == true) + { + bfd_putlong(abfd, -current_map->pc, location_ptr + + current_map->pc); + r->relent.howto = &rel32_howto; + r->relent.addend -= current_map->pc; + } + else + { + bfd_putlong(abfd, 0, location_ptr + + current_map->pc); + r->relent.howto = &abs32_howto; + } + current_map->pc +=4; + break; + case 2: + if (pcrel == true) { + bfd_putshort(abfd, (int)(-current_map->pc), location_ptr +current_map->pc); + r->relent.addend -= current_map->pc; + r->relent.howto = &rel16_howto; + } + else { + bfd_putshort(abfd, 0, location_ptr +current_map->pc); + r->relent.howto = &abs16_howto; + } + current_map->pc +=2; + break; + + default: + BFD_FAIL(); + break; + } } break; default: { bfd_vma this_size ; - if (parse_int(abfd, &this_size) == true) { + if (parse_int(ieee, &this_size) == true) { unsigned int i; for (i = 0; i < this_size; i++) { - location_ptr[current_map->pc ++] = this_byte(abfd); - next_byte(abfd); + location_ptr[current_map->pc ++] = this_byte(ieee); + next_byte(ieee); } } else { @@ -1225,7 +1262,7 @@ DEFUN(ieee_new_section_hook,(abfd, newsect), asection *newsect) { newsect->used_by_bfd = (PTR) - ieee_malloc(abfd, sizeof(ieee_per_section_type)); + bfd_alloc(abfd, sizeof(ieee_per_section_type)); ieee_per_section( newsect)->data = (bfd_byte *)NULL; ieee_per_section(newsect)->section = newsect; return true; @@ -1245,9 +1282,9 @@ static boolean DEFUN(ieee_get_section_contents,(abfd, section, location, offset, count), bfd *abfd AND sec_ptr section AND - void *location AND + PTR location AND file_ptr offset AND - unsigned int count) + int count) { ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd; ieee_slurp_section_data(abfd); @@ -1263,7 +1300,7 @@ DEFUN(ieee_canonicalize_reloc,(abfd, section, relptr, symbols), arelent **relptr AND asymbol **symbols) { - ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd; +/* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/ ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation); ieee_data_type *ieee = ieee_data(abfd); @@ -1387,12 +1424,11 @@ DEFUN(ieee_write_data_part,(abfd), unsigned int relocs_to_go = s->reloc_count; size_t current_byte_index = 0; - /* Sort the reloc records so we can insert them in the correct places */ if (s->reloc_count != 0) { qsort(s->orelocation, - s->reloc_count, + relocs_to_go, sizeof(arelent **), comp); } @@ -1407,21 +1443,21 @@ DEFUN(ieee_write_data_part,(abfd), header[4] = s->index + IEEE_SECTION_NUMBER_BASE; ieee_write_int5(header+5, s->vma ); header[10] = ieee_load_with_relocation_enum; - bfd_write(header, 1, sizeof(header), abfd); + bfd_write((PTR)header, 1, sizeof(header), abfd); /* Output the data stream as the longest sequence of bytes possible, allowing for the a reasonable packet size and relocation stuffs */ - if (stream == (void *)NULL) { + if ((PTR)stream == (PTR)NULL) { /* Outputting a section without data, fill it up */ - stream = ieee_malloc(abfd, s->size); - memset(stream, 0, s->size); + stream = (uint8e_type *)(bfd_alloc(abfd, s->size)); + memset((PTR)stream, 0, s->size); } while (current_byte_index < s->size) { size_t run; unsigned int MAXRUN = 32; - if (p && *p) { + if (relocs_to_go) { run = (*p)->address - current_byte_index; } else { @@ -1434,7 +1470,7 @@ DEFUN(ieee_write_data_part,(abfd), if (run != 0) { /* Output a stream of bytes */ ieee_write_int(abfd, run); - bfd_write(stream + current_byte_index, + bfd_write((PTR)(stream + current_byte_index), 1, run, abfd); @@ -1445,24 +1481,51 @@ DEFUN(ieee_write_data_part,(abfd), while (relocs_to_go && (*p) && (*p)->address == current_byte_index) { arelent *r = *p; + bfd_vma ov; + if (r->howto->pc_relative) { + r->addend += current_byte_index; + } + + switch (r->howto->size) { + case 2: + + ov = bfd_getlong(abfd, + stream+current_byte_index); + current_byte_index +=4; + break; + case 1: + ov = bfd_getshort(abfd, + stream+current_byte_index); + current_byte_index +=2; + break; + default: + BFD_FAIL(); + } ieee_write_byte(abfd, ieee_function_either_open_b_enum); + if (r->sym_ptr_ptr != (asymbol **)NULL) { - ieee_write_expression(abfd, r->addend, + ieee_write_expression(abfd, r->addend + ov, r->section, - *(r->sym_ptr_ptr)); + *(r->sym_ptr_ptr), + r->howto->pc_relative, s->target_index); } else { - ieee_write_expression(abfd, r->addend, + ieee_write_expression(abfd, r->addend + ov, r->section, - (asymbol *)NULL); + (asymbol *)NULL, + r->howto->pc_relative, s->target_index); } ieee_write_byte(abfd, ieee_function_either_close_b_enum); + if (r->howto->size != 2) { + ieee_write_byte(abfd, ieee_comma); + ieee_write_int(abfd, 1<< r->howto->size); + } + relocs_to_go --; p++; } - /* FIXME !! Are all relocations 4 bytes ? */ - current_byte_index += 4; + } } } @@ -1478,7 +1541,7 @@ DEFUN(init_for_output,(abfd), asection *s; for (s = abfd->sections; s != (asection *)NULL; s = s->next) { if (s->size != 0) { - ieee_per_section(s)->data = (bfd_byte *)(ieee_malloc(abfd, s->size)); + ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->size)); } } } @@ -1492,7 +1555,7 @@ boolean DEFUN(ieee_set_section_contents,(abfd, section, location, offset, count), bfd *abfd AND sec_ptr section AND - unsigned char *location AND + PTR location AND file_ptr offset AND int count) { @@ -1557,14 +1620,14 @@ DEFUN(ieee_write_external_part,(abfd), ieee_write_expression(abfd, p->value + p->section->output_offset, p->section->output_section, - (asymbol *)NULL); + (asymbol *)NULL, false, 0); } else { ieee_write_expression(abfd, p->value, (asection *)NULL, - (asymbol *)NULL); + (asymbol *)NULL, false, 0); } p->value = public_index; public_index++; @@ -1668,144 +1731,7 @@ DEFUN(ieee_make_empty_symbol,(abfd), } -void -DEFUN(ieee_reclaim_symbol_table, (abfd), - bfd *abfd) -{ -#if 0 - asection *section; - - if (!bfd_get_symcount (abfd)) return; - - for (section = abfd->sections; section != NULL; section = section->next) - if (section->relocation) { - free ((void *)section->relocation); - section->relocation = NULL; - section->reloc_count = 0; - } - bfd_get_symcount (abfd) = 0; - free ((void *)obj_aout_symbols (abfd)); - obj_aout_symbols (abfd) = (aout_symbol_type *)NULL; -#endif -} - - - - -/* Obsolete procedural interface; better to look at the cache directly */ - -/* User should have checked the file flags; perhaps we should return -BFD_NO_MORE_SYMBOLS if there are none? */ - -int -DEFUN(ieee_get_symcount_upper_bound,(abfd), - bfd *abfd) -{ -#if 0 - /* In case we're doing an output file or something...? */ - if (bfd_get_symcount (abfd)) return bfd_get_symcount (abfd); - - return (exec_hdr (abfd)->a_syms) / (sizeof (struct nlist)); -#endif -return 0; -} - -symindex -DEFUN(ieee_get_first_symbol,(ignore_abfd), - bfd * ignore_abfd) -{ - return 0; -} - -symindex -DEFUN(ieee_get_next_symbol,(abfd, oidx), - bfd *abfd AND - symindex oidx) -{ -#if 0 - if (oidx == BFD_NO_MORE_SYMBOLS) return BFD_NO_MORE_SYMBOLS; - return ++oidx >= bfd_get_symcount (abfd) ? BFD_NO_MORE_SYMBOLS : - oidx; -#endif -return 0; -} - -char * -ieee_symbol_name (abfd, idx) -bfd *abfd; -symindex idx; -{ -#if 0 - return (obj_aout_symbols (abfd) + idx)->symbol.name; -#endif -return 0; -} - -long -ieee_symbol_value (abfd, idx) -bfd *abfd; -symindex idx; -{ -#if 0 - return (obj_aout_symbols (abfd) + idx)->symbol.value; -#endif -return 0; -} - -symclass -ieee_classify_symbol (abfd, idx) -bfd *abfd; -symindex idx; -{ -#if 0 - aout_symbol_type *sym = obj_aout_symbols (abfd) + idx; - - if ((sym->symbol.flags & BSF_FORT_COMM) != 0) return bfd_symclass_fcommon; - if ((sym->symbol.flags & BSF_GLOBAL) != 0) return bfd_symclass_global; - if ((sym->symbol.flags & BSF_DEBUGGING) != 0) return bfd_symclass_debugger; - if ((sym->symbol.flags & BSF_UNDEFINED) != 0) return bfd_symclass_undefined; -#endif - return bfd_symclass_unknown; -} - -boolean -ieee_symbol_hasclass (abfd, idx, class) -bfd *abfd; -symindex idx; -symclass class; -{ -#if 0 - aout_symbol_type *sym = obj_aout_symbols (abfd) + idx; - switch (class) { - case bfd_symclass_fcommon: - return (sym->symbol.flags & BSF_FORT_COMM) ? true :false; - case bfd_symclass_global: - return (sym->symbol.flags & BSF_GLOBAL) ? true:false; - case bfd_symclass_debugger: - return (sym->symbol.flags & BSF_DEBUGGING) ? true:false;; - case bfd_symclass_undefined: - return (sym->symbol.flags & BSF_UNDEFINED) ? true:false;; - default: return false; - } -#endif -return 0; -} - - -void -ieee_reclaim_reloc (ignore_abfd, section) -bfd *ignore_abfd; -sec_ptr section; -{ -#if 0 - if (section->relocation) { - free (section->relocation); - section->relocation = NULL; - section->reloc_count = 0; - } -#endif -} boolean ieee_close_and_cleanup (abfd) @@ -1829,11 +1755,6 @@ bfd *abfd; } - if (ieee_data(abfd) != (ieee_data_type *)NULL) { - /* FIXME MORE LEAKS */ - - } - return true; } @@ -1881,10 +1802,9 @@ asymbol **symbols; bfd_vma offset; char **filename_ptr; char **functionname_ptr; -unsigned int *line_ptr; +int *line_ptr; { return false; - } @@ -1905,20 +1825,21 @@ struct stat *buf; } } static int -DEFUN(ieee_sizeof_headers,(abfd), - bfd *abfd) +DEFUN(ieee_sizeof_headers,(abfd, x), + bfd *abfd AND + boolean x) { -return 0; + return 0; } -#define ieee_core_file_failing_command bfd_false -#define ieee_core_file_failing_signal bfd_false -#define ieee_core_file_matches_executable_p bfd_false +#define ieee_core_file_failing_command (char *(*)())(bfd_nullvoidptr) +#define ieee_core_file_failing_signal (int (*)())bfd_0 +#define ieee_core_file_matches_executable_p ( PROTO(boolean, (*),(bfd *, bfd *)))bfd_false #define ieee_slurp_armap bfd_true #define ieee_slurp_extended_name_table bfd_true -#define ieee_truncate_arname bfd_false -#define ieee_write_armap bfd_false -#define ieee_get_lineno bfd_false +#define ieee_truncate_arname (void (*)())bfd_nullvoidptr +#define ieee_write_armap (PROTO( boolean, (*),(bfd *, unsigned int, struct orl *, int, int))) bfd_nullvoidptr +#define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr /*SUPPRESS 460 */ @@ -1939,10 +1860,10 @@ bfd_target ieee_vec = _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* data */ _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* hdrs */ - {_bfd_dummy_target, + { _bfd_dummy_target, ieee_object_p, /* bfd_check_format */ ieee_archive_p, - bfd_false + _bfd_dummy_target, }, { bfd_false, diff --git a/bfd/libbfd.c b/bfd/libbfd.c index f339092..f278a9c 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -50,11 +50,11 @@ bfd_true (ignore) return true; } -void * +PTR bfd_nullvoidptr(ignore) bfd *ignore; { - return (void *)NULL; + return (PTR)NULL; } int diff --git a/bfd/oasys.c b/bfd/oasys.c index 757a7b2..431f510 100644 --- a/bfd/oasys.c +++ b/bfd/oasys.c @@ -23,26 +23,24 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define UNDERSCORE_HACK 1 #define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier) - #include <ansidecl.h> + #include "sysdep.h" #include "bfd.h" #include "libbfd.h" -#include "obstack.h" #include "oasys.h" #include "liboasys.h" - static void DEFUN(oasys_read_record,(abfd, record), bfd *CONST abfd AND oasys_record_union_type *record) { - bfd_read(record, 1, sizeof(record->header), abfd); + bfd_read((PTR)record, 1, sizeof(record->header), abfd); if ((size_t) record->header.length <= (size_t) sizeof (record->header)) return; - bfd_read(((char *)record )+ sizeof(record->header), + bfd_read((PTR)(((char *)record )+ sizeof(record->header)), 1, record->header.length - sizeof(record->header), abfd); } @@ -77,7 +75,6 @@ DEFUN(oasys_slurp_symbol_table,(abfd), oasys_record_union_type record; oasys_data_type *data = oasys_data(abfd); boolean loop = true; - asymbol *dest_undefined; asymbol *dest_defined; asymbol *dest; char *string_ptr; @@ -92,12 +89,12 @@ DEFUN(oasys_slurp_symbol_table,(abfd), #ifdef UNDERSCORE_HACK /* buy 1 more char for each symbol to keep the underscore in*/ data->strings = bfd_alloc(abfd, data->symbol_string_length + - abfd->symcount); + abfd->symcount); #else data->strings = bfd_alloc(abfd, data->symbol_string_length); #endif - dest_undefined = data->symbols; + dest_defined = data->symbols + abfd->symcount -1; string_ptr = data->strings; @@ -137,7 +134,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd), } break; case RELOCATION_TYPE_UND: - dest = data->symbols + bfd_h_getshort(abfd, &record.symbol.refno[0]); + dest = data->symbols + bfd_h_getshort(abfd, (bfd_byte *)&record.symbol.refno[0]); dest->section = (asection *)NULL; dest->flags = BSF_UNDEFINED; break; @@ -176,7 +173,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd), } -static size_t +static unsigned int DEFUN(oasys_get_symtab_upper_bound,(abfd), bfd *CONST abfd) { @@ -222,7 +219,7 @@ DEFUN(oasys_archive_p,(abfd), bfd_seek(abfd, (file_ptr) 0, false); - bfd_read(&header, 1, sizeof(header), abfd); + bfd_read((PTR)&header, 1, sizeof(header), abfd); swap(header.version); @@ -266,8 +263,7 @@ DEFUN(oasys_archive_p,(abfd), bfd_seek(abfd , header.mod_tbl_offset, SEEK_SET); for (i = 0; i < header.mod_count; i++) { - - bfd_read(&record, 1, sizeof(record), abfd); + bfd_read((PTR)&record, 1, sizeof(record), abfd); swap(record.mod_size); swap(record.file_offset); swap(record.mod_name_length); @@ -304,6 +300,7 @@ DEFUN(oasys_object_p,(abfd), bfd *abfd) { oasys_data_type *oasys; + oasys_data_type *save = oasys_data(abfd); boolean loop = true; boolean had_usefull = false; @@ -393,6 +390,7 @@ DEFUN(oasys_object_p,(abfd), fail: (void) bfd_release(abfd, oasys); + oasys_data(abfd) = save; return (bfd_target *)NULL; } @@ -852,6 +850,7 @@ DEFUN(oasys_write_end,(abfd), bfd *CONST abfd) { oasys_end_record_type end; + uint8e_type null = 0; end.relb = RELOCATION_TYPE_ABS; bfd_h_putlong(abfd, abfd->start_address, end.entry); bfd_h_putshort(abfd, 0, end.fill); @@ -860,6 +859,7 @@ DEFUN(oasys_write_end,(abfd), oasys_record_is_end_enum, (oasys_record_union_type *)&end, sizeof(end)); + bfd_write((PTR)&null, 1, 1, abfd); } static int @@ -1081,7 +1081,6 @@ DEFUN(oasys_make_empty_symbol,(abfd), -/* Obsbolete procedural interface; better to look at the cache directly */ /* User should have checked the file flags; perhaps we should return BFD_NO_MORE_SYMBOLS if there are none? */ @@ -1185,20 +1184,22 @@ DEFUN(oasys_generic_stat_arch_elt,(abfd, buf), } static int -DEFUN(oasys_sizeof_headers,(abfd), - bfd *abfd) +DEFUN(oasys_sizeof_headers,(abfd, exec), + bfd *abfd AND + boolean exec) { return 0; } -#define oasys_core_file_failing_command bfd_false -#define oasys_core_file_failing_signal bfd_false -#define oasys_core_file_matches_executable_p bfd_false -#define oasys_slurp_armap bfd_false -#define oasys_slurp_extended_name_table bfd_false -#define oasys_truncate_arname bfd_false -#define oasys_write_armap bfd_false -#define oasys_get_lineno bfd_false +#define oasys_core_file_failing_command (char *(*)())(bfd_nullvoidptr) +#define oasys_core_file_failing_signal (int (*)())bfd_0 +#define oasys_core_file_matches_executable_p 0 /*(PROTO(boolean, (*),(bfd*, bfd*)))bfd_false*/ +#define oasys_slurp_armap bfd_true +#define oasys_slurp_extended_name_table bfd_true +#define oasys_truncate_arname (void (*)())bfd_nullvoidptr +#define oasys_write_armap 0 /* (PROTO( boolean, (*),(bfd *, unsigned int, struct orl *, int, int))) bfd_nullvoidptr*/ +#define oasys_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr + @@ -1223,7 +1224,7 @@ bfd_target oasys_vec = {_bfd_dummy_target, oasys_object_p, /* bfd_check_format */ oasys_archive_p, - bfd_false + _bfd_dummy_target, }, { bfd_false, @@ -42,7 +42,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* $Id$ * $Log$ - * Revision 1.6 1991/04/25 04:06:21 gnu + * Revision 1.7 1991/05/08 19:21:47 steve + * Various portability lints. + * Fixed reloc bug in ieee and oasys. + * + * Revision 1.6 1991/04/25 04:06:21 gnu * Fix minor pointer type problems that "cc" complains about. * * Revision 1.5 1991/04/23 22:44:14 steve @@ -213,7 +217,7 @@ asection *section; bytes_on_line = HEX(&buffer.size); - bfd_read(buffer.u.data, 1 , bytes_on_line * 2, abfd); + bfd_read((PTR)buffer.u.data, 1 , bytes_on_line * 2, abfd); switch (buffer.type) { case '6': @@ -380,7 +384,7 @@ int bytes_to_do; data++; * ( (char *)(data)) = '\n'; - bfd_write(&buffer, 1, (char *)data - (char *)&buffer + 1 , abfd); + bfd_write((PTR)&buffer, 1, (char *)data - (char *)&buffer + 1 , abfd); bytes_written += bytes_this_chunk; location += bytes_this_chunk; @@ -427,13 +431,7 @@ return 0; } /*SUPPRESS 460 */ -#define srec_core_file_failing_command bfd_false -#define srec_core_file_failing_signal bfd_false -#define srec_core_file_matches_executable_p bfd_false -#define srec_slurp_armap bfd_false -#define srec_slurp_extended_name_table bfd_false -#define srec_truncate_arname bfd_false -#define srec_write_armap bfd_false + #define srec_new_section_hook bfd_false #define srec_get_symtab_upper_bound bfd_false #define srec_get_symtab bfd_false @@ -441,11 +439,22 @@ return 0; #define srec_canonicalize_reloc bfd_false #define srec_make_empty_symbol bfd_false #define srec_print_symbol bfd_false -#define srec_get_lineno bfd_false + #define srec_openr_next_archived_file bfd_false #define srec_find_nearest_line bfd_false #define srec_generic_stat_arch_elt bfd_false + +#define srec_core_file_failing_command (char *(*)())(bfd_nullvoidptr) +#define srec_core_file_failing_signal (int (*)())bfd_0 +#define srec_core_file_matches_executable_p (PROTO(boolean, (*),(bfd*, bfd*)))bfd_false +#define srec_slurp_armap bfd_true +#define srec_slurp_extended_name_table bfd_true +#define srec_truncate_arname (void (*)())bfd_nullvoidptr +#define srec_write_armap (PROTO( boolean, (*),(bfd *, unsigned int, struct orl *, int, int))) bfd_nullvoidptr +#define srec_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr + + bfd_target srec_vec = { "srec", /* name */ diff --git a/bfd/sunos.c b/bfd/sunos.c index b714bf9..35f2d4f 100644 --- a/bfd/sunos.c +++ b/bfd/sunos.c @@ -1273,7 +1273,9 @@ swap_std_reloc_out (abfd, g, natptr) else { r_extern = 0; if (g->section == NULL) { - BFD_ASSERT(0); + /* It is possible to have a reloc with nothing, we generate an + abs + 0 */ + r_addend = 0; r_index = N_ABS | N_EXT; } else if(g->section->output_section == obj_textsec(abfd)) { |