diff options
Diffstat (limited to 'bfd/aout-adobe.c')
-rw-r--r-- | bfd/aout-adobe.c | 450 |
1 files changed, 244 insertions, 206 deletions
diff --git a/bfd/aout-adobe.c b/bfd/aout-adobe.c index c79794f..a23b57d 100644 --- a/bfd/aout-adobe.c +++ b/bfd/aout-adobe.c @@ -1,5 +1,5 @@ /* BFD back-end for a.out.adobe binaries. - Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999 + Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 99, 2000 Free Software Foundation, Inc. Written by Cygnus Support. Based on bout.c. @@ -28,7 +28,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "aout/stab_gnu.h" #include "libaout.h" /* BFD a.out internal data structures */ -extern const bfd_target a_out_adobe_vec; /* Forward decl */ +/* Forward decl. */ +extern const bfd_target a_out_adobe_vec; static const bfd_target *aout_adobe_callback PARAMS ((bfd *)); @@ -49,7 +50,7 @@ aout_adobe_swap_exec_header_in (abfd, raw_bytes, execp) struct external_exec *raw_bytes; struct internal_exec *execp; { - struct external_exec *bytes = (struct external_exec *)raw_bytes; + struct external_exec *bytes = (struct external_exec *) raw_bytes; /* Now fill in fields in the execp, from the bytes in the raw data. */ execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); @@ -75,9 +76,10 @@ aout_adobe_swap_exec_header_out (abfd, execp, raw_bytes) struct internal_exec *execp; struct external_exec *raw_bytes; { - struct external_exec *bytes = (struct external_exec *)raw_bytes; + struct external_exec *bytes = (struct external_exec *) raw_bytes; - /* Now fill in fields in the raw data, from the fields in the exec struct. */ + /* Now fill in fields in the raw data, from the fields in the exec + struct. */ bfd_h_put_32 (abfd, execp->a_info , bytes->e_info); PUT_WORD (abfd, execp->a_text , bytes->e_text); PUT_WORD (abfd, execp->a_data , bytes->e_data); @@ -97,11 +99,12 @@ aout_adobe_object_p (abfd) char *targ; if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } + != EXEC_BYTES_SIZE) + { + if (bfd_get_error () != bfd_error_system_call) + bfd_set_error (bfd_error_wrong_format); + return 0; + } anexec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info); @@ -111,16 +114,18 @@ aout_adobe_object_p (abfd) If the environment variable GNUTARGET is set to "a.out.adobe", we will take just about any a.out file as an Adobe a.out file. FIXME! */ - if (N_BADMAG (anexec)) { - targ = getenv ("GNUTARGET"); - if (targ && !strcmp (targ, a_out_adobe_vec.name)) - ; /* Just continue anyway, if specifically set to this format */ - else - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - } + if (N_BADMAG (anexec)) + { + targ = getenv ("GNUTARGET"); + if (targ && !strcmp (targ, a_out_adobe_vec.name)) + /* Just continue anyway, if specifically set to this format. */ + ; + else + { + bfd_set_error (bfd_error_wrong_format); + return 0; + } + } aout_adobe_swap_exec_header_in (abfd, &exec_bytes, &anexec); return aout_32_some_aout_object_p (abfd, &anexec, aout_adobe_callback); @@ -143,7 +148,7 @@ aout_adobe_callback (abfd) flagword flags; /* Architecture and machine type -- unknown in this format. */ - bfd_set_arch_mach(abfd, bfd_arch_unknown, 0); + bfd_set_arch_mach (abfd, bfd_arch_unknown, 0); /* The positions of the string table and symbol table. */ obj_str_filepos (abfd) = N_STROFF (*execp); @@ -151,97 +156,106 @@ aout_adobe_callback (abfd) /* Suck up the section information from the file, one section at a time. */ - for (;;) { - if (bfd_read ((PTR) ext, 1, sizeof (*ext), abfd) != sizeof (*ext)) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - switch (ext->e_type[0]) { - case N_TEXT: - section_name = ".text"; - flags = SEC_CODE | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_DATA: - section_name = ".data"; - flags = SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_BSS: - section_name = ".bss"; - flags = SEC_DATA | SEC_HAS_CONTENTS; - break; - - case 0: - goto no_more_sections; - - default: - (*_bfd_error_handler) - (_("%s: Unknown section type in a.out.adobe file: %x\n"), - bfd_get_filename (abfd), ext->e_type[0]); - goto no_more_sections; - } - - /* First one is called ".text" or whatever; subsequent ones are - ".text1", ".text2", ... */ - - bfd_set_error (bfd_error_no_error); - sect = bfd_make_section (abfd, section_name); - trynum = 0; - while (!sect) { - if (bfd_get_error () != bfd_error_no_error) - return 0; /* Some other error -- slide into the sunset */ - sprintf (try_again, "%s%d", section_name, ++trynum); - sect = bfd_make_section (abfd, try_again); - } - - /* Fix the name, if it is a sprintf'd name. */ - if (sect->name == try_again) { - newname = (char *) bfd_zalloc(abfd, strlen (sect->name)); - if (newname == NULL) - return 0; - strcpy (newname, sect->name); - sect->name = newname; - } - - /* Now set the section's attributes. */ - bfd_set_section_flags (abfd, sect, flags); - sect->_raw_size = ((ext->e_size[0] << 8) /* Assumed big-endian */ - | ext->e_size[1] << 8) - | ext->e_size[2]; - sect->_cooked_size = sect->_raw_size; - sect->vma = bfd_h_get_32 (abfd, ext->e_virtbase); - sect->filepos = bfd_h_get_32 (abfd, ext->e_filebase); - /* FIXME XXX alignment? */ - - /* Set relocation information for first section of each type. */ - if (trynum == 0) switch (ext->e_type[0]) { - case N_TEXT: - sect->rel_filepos = N_TRELOFF (*execp); - sect->reloc_count = execp->a_trsize; - break; - - case N_DATA: - sect->rel_filepos = N_DRELOFF (*execp); - sect->reloc_count = execp->a_drsize; - break; + for (;;) + { + if (bfd_read ((PTR) ext, 1, sizeof (*ext), abfd) != sizeof (*ext)) + { + if (bfd_get_error () != bfd_error_system_call) + bfd_set_error (bfd_error_wrong_format); + return 0; + } + switch (ext->e_type[0]) + { + case N_TEXT: + section_name = ".text"; + flags = SEC_CODE | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; + break; + + case N_DATA: + section_name = ".data"; + flags = SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; + break; + + case N_BSS: + section_name = ".bss"; + flags = SEC_DATA | SEC_HAS_CONTENTS; + break; + + case 0: + goto no_more_sections; + + default: + (*_bfd_error_handler) + (_("%s: Unknown section type in a.out.adobe file: %x\n"), + bfd_get_filename (abfd), ext->e_type[0]); + goto no_more_sections; + } + + /* First one is called ".text" or whatever; subsequent ones are + ".text1", ".text2", ... */ + + bfd_set_error (bfd_error_no_error); + sect = bfd_make_section (abfd, section_name); + trynum = 0; + while (!sect) + { + if (bfd_get_error () != bfd_error_no_error) + /* Some other error -- slide into the sunset. */ + return 0; + sprintf (try_again, "%s%d", section_name, ++trynum); + sect = bfd_make_section (abfd, try_again); + } + + /* Fix the name, if it is a sprintf'd name. */ + if (sect->name == try_again) + { + newname = (char *) bfd_zalloc (abfd, strlen (sect->name)); + if (newname == NULL) + return 0; + strcpy (newname, sect->name); + sect->name = newname; + } + + /* Now set the section's attributes. */ + bfd_set_section_flags (abfd, sect, flags); + /* Assumed big-endian. */ + sect->_raw_size = ((ext->e_size[0] << 8) + | ext->e_size[1] << 8) + | ext->e_size[2]; + sect->_cooked_size = sect->_raw_size; + sect->vma = bfd_h_get_32 (abfd, ext->e_virtbase); + sect->filepos = bfd_h_get_32 (abfd, ext->e_filebase); + /* FIXME XXX alignment? */ + + /* Set relocation information for first section of each type. */ + if (trynum == 0) + switch (ext->e_type[0]) + { + case N_TEXT: + sect->rel_filepos = N_TRELOFF (*execp); + sect->reloc_count = execp->a_trsize; + break; + + case N_DATA: + sect->rel_filepos = N_DRELOFF (*execp); + sect->reloc_count = execp->a_drsize; + break; + } } - } -no_more_sections: + no_more_sections: - adata(abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata(abfd).symbol_entry_size = sizeof (struct external_nlist); - adata(abfd).page_size = 1; /* Not applicable. */ - adata(abfd).segment_size = 1; /* Not applicable. */ - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; + adata (abfd).reloc_entry_size = sizeof (struct reloc_std_external); + adata (abfd).symbol_entry_size = sizeof (struct external_nlist); + adata (abfd).page_size = 1; /* Not applicable. */ + adata (abfd).segment_size = 1; /* Not applicable. */ + adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; return abfd->xvec; } struct bout_data_struct { - struct aoutdata a; - struct internal_exec e; + struct aoutdata a; + struct internal_exec e; }; static boolean @@ -252,16 +266,16 @@ aout_adobe_mkobject (abfd) rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct)); if (rawptr == NULL) - return false; + return false; abfd->tdata.bout_data = rawptr; exec_hdr (abfd) = &rawptr->e; - adata(abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata(abfd).symbol_entry_size = sizeof (struct external_nlist); - adata(abfd).page_size = 1; /* Not applicable. */ - adata(abfd).segment_size = 1; /* Not applicable. */ - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; + adata (abfd).reloc_entry_size = sizeof (struct reloc_std_external); + adata (abfd).symbol_entry_size = sizeof (struct external_nlist); + adata (abfd).page_size = 1; /* Not applicable. */ + adata (abfd).segment_size = 1; /* Not applicable. */ + adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; return true; } @@ -271,7 +285,7 @@ aout_adobe_write_object_contents (abfd) bfd *abfd; { struct external_exec swapped_hdr; - static struct external_segdesc sentinel[1]; /* Initialized to zero */ + static struct external_segdesc sentinel[1]; /* Initialized to zero. */ asection *sect; exec_hdr (abfd)->a_info = ZMAGIC; @@ -284,22 +298,28 @@ aout_adobe_write_object_contents (abfd) exec_hdr (abfd)->a_trsize = 0; exec_hdr (abfd)->a_drsize = 0; - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - exec_hdr (abfd)->a_text += sect->_raw_size; - exec_hdr (abfd)->a_trsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } else if (sect->flags & SEC_DATA) { - exec_hdr (abfd)->a_data += sect->_raw_size; - exec_hdr (abfd)->a_drsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } else if (sect->flags & SEC_ALLOC && !(sect->flags & SEC_LOAD)) { - exec_hdr (abfd)->a_bss += sect->_raw_size; + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_CODE) + { + exec_hdr (abfd)->a_text += sect->_raw_size; + exec_hdr (abfd)->a_trsize += sect->reloc_count * + sizeof (struct reloc_std_external); + } + else if (sect->flags & SEC_DATA) + { + exec_hdr (abfd)->a_data += sect->_raw_size; + exec_hdr (abfd)->a_drsize += sect->reloc_count * + sizeof (struct reloc_std_external); + } + else if (sect->flags & SEC_ALLOC && !(sect->flags & SEC_LOAD)) + { + exec_hdr (abfd)->a_bss += sect->_raw_size; + } } - } exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) - * sizeof (struct external_nlist); + * sizeof (struct external_nlist); exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); aout_adobe_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); @@ -312,58 +332,68 @@ aout_adobe_write_object_contents (abfd) /* Now write out the section information. Text first, data next, rest afterward. */ - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - aout_adobe_write_section (abfd, sect); + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_CODE) + { + aout_adobe_write_section (abfd, sect); + } } - } - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - aout_adobe_write_section (abfd, sect); + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_DATA) + { + aout_adobe_write_section (abfd, sect); + } } - } - for (sect = abfd->sections; sect; sect = sect->next) { - if (!(sect->flags & (SEC_CODE|SEC_DATA))) { - aout_adobe_write_section (abfd, sect); + for (sect = abfd->sections; sect; sect = sect->next) + { + if (!(sect->flags & (SEC_CODE | SEC_DATA))) + { + aout_adobe_write_section (abfd, sect); + } } - } /* Write final `sentinel` section header (with type of 0). */ if (bfd_write ((PTR) sentinel, 1, sizeof (*sentinel), abfd) != sizeof (*sentinel)) return false; - /* Now write out reloc info, followed by syms and strings */ + /* Now write out reloc info, followed by syms and strings. */ if (bfd_get_symcount (abfd) != 0) { - if (bfd_seek (abfd, (file_ptr) (N_SYMOFF(*exec_hdr(abfd))), SEEK_SET) + if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (*exec_hdr (abfd))), SEEK_SET) != 0) return false; if (! aout_32_write_syms (abfd)) return false; - if (bfd_seek (abfd, (file_ptr) (N_TRELOFF(*exec_hdr(abfd))), SEEK_SET) + if (bfd_seek (abfd, (file_ptr) (N_TRELOFF (*exec_hdr (abfd))), SEEK_SET) != 0) return false; - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - if (!aout_32_squirt_out_relocs (abfd, sect)) - return false; - } - } + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_CODE) + { + if (!aout_32_squirt_out_relocs (abfd, sect)) + return false; + } + } - if (bfd_seek (abfd, (file_ptr) (N_DRELOFF(*exec_hdr(abfd))), SEEK_SET) + if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (*exec_hdr (abfd))), SEEK_SET) != 0) return false; - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - if (!aout_32_squirt_out_relocs (abfd, sect)) - return false; - } - } + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_DATA) + { + if (!aout_32_squirt_out_relocs (abfd, sect)) + return false; + } + } } return true; } @@ -387,46 +417,55 @@ aout_adobe_set_section_contents (abfd, section, location, offset, count) file_ptr section_start; sec_ptr sect; - if (abfd->output_has_begun == false) { /* set by bfd.c handler */ - - /* Assign file offsets to sections. Text sections are first, and - are contiguous. Then data sections. Everything else at the end. */ - - section_start = N_TXTOFF (ignore<-->me); - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_HAS_CONTENTS && - !(sect->flags & (SEC_CODE|SEC_DATA))) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } + /* Set by bfd.c handler. */ + if (abfd->output_has_begun == false) + { + /* Assign file offsets to sections. Text sections are first, and + are contiguous. Then data sections. Everything else at the end. */ + + section_start = N_TXTOFF (ignore<-->me); + + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_CODE) + { + sect->filepos = section_start; + /* FIXME: Round to alignment. */ + section_start += sect->_raw_size; + } + } + + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_DATA) + { + sect->filepos = section_start; + /* FIXME: Round to alignment. */ + section_start += sect->_raw_size; + } + } + + for (sect = abfd->sections; sect; sect = sect->next) + { + if (sect->flags & SEC_HAS_CONTENTS && + !(sect->flags & (SEC_CODE | SEC_DATA))) + { + sect->filepos = section_start; + /* FIXME: Round to alignment. */ + section_start += sect->_raw_size; + } + } } - } - /* regardless, once we know what we're doing, we might as well get going */ + /* Regardless, once we know what we're doing, we might as well get + going. */ if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) return false; - if (count != 0) { - return (bfd_write ((PTR)location, 1, count, abfd) == count) ?true:false; - } + if (count != 0) + { + return (bfd_write ((PTR) location, 1, count, abfd) == count) ? true : false; + } return true; } @@ -480,8 +519,7 @@ aout_adobe_sizeof_headers (ignore_abfd, ignore) #define aout_32_bfd_final_link _bfd_generic_final_link #define aout_32_bfd_link_split_section _bfd_generic_link_split_section -const bfd_target a_out_adobe_vec = -{ +const bfd_target a_out_adobe_vec = { "a.out.adobe", /* name */ bfd_target_aout_flavour, BFD_ENDIAN_BIG, /* data byte order is unknown (big assumed) */ @@ -496,27 +534,27 @@ const bfd_target a_out_adobe_vec = 16, /* ar_max_namelen */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ + bfd_getb32, bfd_getb_signed_32, bfd_putb32, + bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, aout_adobe_object_p, /* bfd_check_format */ + bfd_getb32, bfd_getb_signed_32, bfd_putb32, + bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ + {_bfd_dummy_target, aout_adobe_object_p, /* bfd_check_format */ bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, aout_adobe_mkobject, /* bfd_set_format */ + {bfd_false, aout_adobe_mkobject, /* bfd_set_format */ _bfd_generic_mkarchive, bfd_false}, - {bfd_false, aout_adobe_write_object_contents, /* bfd_write_contents */ + {bfd_false, aout_adobe_write_object_contents, /* bfd_write_contents */ _bfd_write_archive_contents, bfd_false}, - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (aout_32), - BFD_JUMP_TABLE_WRITE (aout_32), - BFD_JUMP_TABLE_LINK (aout_32), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), + BFD_JUMP_TABLE_GENERIC (aout_32), + BFD_JUMP_TABLE_COPY (_bfd_generic), + BFD_JUMP_TABLE_CORE (_bfd_nocore), + BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), + BFD_JUMP_TABLE_SYMBOLS (aout_32), + BFD_JUMP_TABLE_RELOCS (aout_32), + BFD_JUMP_TABLE_WRITE (aout_32), + BFD_JUMP_TABLE_LINK (aout_32), + BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, |