static bfd_boolean MY(write_object_contents) (bfd *abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr (abfd); obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_ns32k); switch (bfd_get_mach (abfd)) { case 32032: N_SET_MACHTYPE (execp, M_NS32032); break; case 32532: default: N_SET_MACHTYPE (execp, M_NS32532); break; } N_SET_FLAGS (execp, aout_backend_info (abfd)->exec_hdr_flags); WRITE_HEADERS (abfd, execp); return TRUE; }
/* Set parameters about this a.out file that are machine-dependent. This routine is called from some_aout_object_p just before it returns. */ static const bfd_target * MY (callback) (bfd *abfd) { struct internal_exec *execp = exec_hdr (abfd); /* Calculate the file positions of the parts of a newly read aout header */ obj_textsec (abfd)->size = N_TXTSIZE (*execp); /* The virtual memory addresses of the sections */ obj_textsec (abfd)->vma = N_TXTADDR (*execp); obj_datasec (abfd)->vma = N_DATADDR (*execp); obj_bsssec (abfd)->vma = N_BSSADDR (*execp); obj_textsec (abfd)->lma = obj_textsec (abfd)->vma; obj_datasec (abfd)->lma = obj_datasec (abfd)->vma; obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma; /* The file offsets of the sections */ obj_textsec (abfd)->filepos = N_TXTOFF (*execp); obj_datasec (abfd)->filepos = N_DATOFF (*execp); /* The file offsets of the relocation info */ obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp); obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp); /* The file offsets of the string table and symbol table. */ obj_sym_filepos (abfd) = N_SYMOFF (*execp); obj_str_filepos (abfd) = N_STROFF (*execp); /* Determine the architecture and machine type of the object file. */ #ifdef SET_ARCH_MACH SET_ARCH_MACH (abfd, *execp); #else bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0); #endif if (obj_aout_subformat (abfd) == gnu_encap_format) { /* The file offsets of the relocation info */ obj_textsec (abfd)->rel_filepos = N_GNU_TRELOFF (*execp); obj_datasec (abfd)->rel_filepos = N_GNU_DRELOFF (*execp); /* The file offsets of the string table and symbol table. */ obj_sym_filepos (abfd) = N_GNU_SYMOFF (*execp); obj_str_filepos (abfd) = (obj_sym_filepos (abfd) + execp->a_syms); abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; bfd_get_symcount (abfd) = execp->a_syms / 12; obj_symbol_entry_size (abfd) = 12; obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; } return abfd->xvec; }
static bfd_boolean MY(write_object_contents)(bfd *abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr(abfd); /* Magic number, maestro, please! */ switch (bfd_get_arch(abfd)) { case bfd_arch_m68k: switch (bfd_get_mach (abfd)) { case bfd_mach_m68010: N_SET_MACHTYPE (*execp, M_68010); break; default: case bfd_mach_m68020: N_SET_MACHTYPE (*execp, M_68020); break; } break; case bfd_arch_sparc: N_SET_MACHTYPE (*execp, M_SPARC); break; case bfd_arch_i386: N_SET_MACHTYPE (*execp, M_386); break; case bfd_arch_a29k: N_SET_MACHTYPE (*execp, M_29K); break; case bfd_arch_mips: switch (bfd_get_mach (abfd)) { case bfd_mach_mips4000: case bfd_mach_mips6000: N_SET_MACHTYPE (*execp, M_MIPS2); break; default: N_SET_MACHTYPE (*execp, M_MIPS1); break; } break; default: N_SET_MACHTYPE (*execp, M_UNKNOWN); } MY (choose_reloc_size) (abfd); WRITE_HEADERS (abfd, execp); return TRUE; }
/* Set the machine type correctly: */ static bfd_boolean i386linux_write_object_contents(bfd *abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr(abfd); N_SET_MACHTYPE (*execp, M_386); obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; WRITE_HEADERS(abfd, execp); return TRUE; }
static const bfd_target * os9k_callback (bfd *abfd) { struct internal_exec *execp = exec_hdr (abfd); unsigned long bss_start; /* Architecture and machine type. */ bfd_set_arch_mach (abfd, bfd_arch_i386, 0); /* The positions of the string table and symbol table. */ obj_str_filepos (abfd) = 0; obj_sym_filepos (abfd) = 0; /* The alignments of the sections. */ obj_textsec (abfd)->alignment_power = execp->a_talign; obj_datasec (abfd)->alignment_power = execp->a_dalign; obj_bsssec (abfd)->alignment_power = execp->a_balign; /* The starting addresses of the sections. */ obj_textsec (abfd)->vma = execp->a_tload; obj_datasec (abfd)->vma = execp->a_dload; /* And reload the sizes, since the aout module zaps them. */ obj_textsec (abfd)->size = execp->a_text; bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section. */ obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); /* The file positions of the sections. */ obj_textsec (abfd)->filepos = execp->a_entry; obj_datasec (abfd)->filepos = execp->a_dload; /* The file positions of the relocation info *** obj_textsec (abfd)->rel_filepos = N_TROFF(*execp); obj_datasec (abfd)->rel_filepos = N_DROFF(*execp); */ adata (abfd).page_size = 1; /* Not applicable. */ adata (abfd).segment_size = 1;/* Not applicable. */ adata (abfd).exec_bytes_size = MHCOM_BYTES_SIZE; return abfd->xvec; }
/* Write an object file in LynxOS format. * Section contents have already been written. We write the * file header, symbols, and relocation. */ static bfd_boolean NAME(aout,sparclynx_write_object_contents)(bfd *abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr(abfd); /* Magic number, maestro, please! */ switch (bfd_get_arch(abfd)) { case bfd_arch_m68k: switch (bfd_get_mach(abfd)) { case bfd_mach_m68010: N_SET_MACHTYPE (*execp, M_68010); break; default: case bfd_mach_m68020: N_SET_MACHTYPE (*execp, M_68020); break; } break; case bfd_arch_sparc: N_SET_MACHTYPE (*execp, M_SPARC); break; case bfd_arch_i386: N_SET_MACHTYPE (*execp, M_386); break; case bfd_arch_a29k: N_SET_MACHTYPE (*execp, M_29K); break; default: N_SET_MACHTYPE (*execp, M_UNKNOWN); } choose_reloc_size (abfd); N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); WRITE_HEADERS (abfd, execp); return TRUE; }
static bfd_boolean aout_adobe_mkobject (bfd *abfd) { struct bout_data_struct *rawptr; bfd_size_type amt = sizeof (struct bout_data_struct); rawptr = bfd_zalloc (abfd, amt); if (rawptr == NULL) 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; return TRUE; }
static const bfd_target * aout_adobe_callback (bfd *abfd) { struct internal_exec *execp = exec_hdr (abfd); asection *sect; struct external_segdesc ext[1]; char *section_name; char try_again[30]; /* Name and number. */ char *newname; int trynum; flagword flags; /* Architecture and machine type -- unknown in this format. */ bfd_set_arch_mach (abfd, bfd_arch_unknown, 0L); /* The positions of the string table and symbol table. */ obj_str_filepos (abfd) = N_STROFF (*execp); obj_sym_filepos (abfd) = N_SYMOFF (*execp); /* Suck up the section information from the file, one section at a time. */ for (;;) { bfd_size_type amt = sizeof (*ext); if (bfd_bread ( ext, amt, abfd) != amt) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_wrong_format); return NULL; } 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) (_("%B: Unknown section type in a.out.adobe file: %x\n"), 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_with_flags (abfd, section_name, flags); trynum = 0; while (!sect) { if (bfd_get_error () != bfd_error_no_error) /* Some other error -- slide into the sunset. */ return NULL; sprintf (try_again, "%s%d", section_name, ++trynum); sect = bfd_make_section_with_flags (abfd, try_again, flags); } /* Fix the name, if it is a sprintf'd name. */ if (sect->name == try_again) { amt = strlen (sect->name); newname = bfd_zalloc (abfd, amt); if (newname == NULL) return NULL; strcpy (newname, sect->name); sect->name = newname; } /* Assumed big-endian. */ sect->size = ((ext->e_size[0] << 8) | ext->e_size[1] << 8 | ext->e_size[2]); sect->vma = H_GET_32 (abfd, ext->e_virtbase); sect->filepos = 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; default: break; } } 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; return abfd->xvec; }
static bfd_boolean aout_adobe_write_object_contents (bfd *abfd) { struct external_exec swapped_hdr; static struct external_segdesc sentinel[1]; /* Initialized to zero. */ asection *sect; bfd_size_type amt; exec_hdr (abfd)->a_info = ZMAGIC; /* Calculate text size as total of text sections, etc. */ exec_hdr (abfd)->a_text = 0; exec_hdr (abfd)->a_data = 0; exec_hdr (abfd)->a_bss = 0; 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->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->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->size; } exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * 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); amt = EXEC_BYTES_SIZE; if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 || bfd_bwrite (& swapped_hdr, amt, abfd) != amt) return FALSE; /* 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_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). */ amt = sizeof (*sentinel); if (bfd_bwrite (sentinel, amt, abfd) != amt) return FALSE; /* 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) != 0) return FALSE; if (! aout_32_write_syms (abfd)) return FALSE; 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; 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; } return TRUE; }
static bfd_boolean MY (write_object_contents) (bfd * abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr (abfd); bfd_size_type text_size; /* dummy vars */ file_ptr text_end; memset (&exec_bytes, 0, sizeof (exec_bytes)); obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; if (adata (abfd).magic == undecided_magic) NAME (aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); execp->a_syms = 0; execp->a_entry = bfd_get_start_address (abfd); execp->a_trsize = ((obj_textsec (abfd)->reloc_count) * obj_reloc_entry_size (abfd)); execp->a_drsize = ((obj_datasec (abfd)->reloc_count) * obj_reloc_entry_size (abfd)); N_SET_MACHTYPE (*execp, 0xc); N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); NAME (aout,swap_exec_header_out) (abfd, execp, &exec_bytes); /* update fields not covered by default swap_exec_header_out */ /* this is really the sym table size but we store it in drelocs */ H_PUT_32 (abfd, (bfd_get_symcount (abfd) * 12), exec_bytes.e_drelocs); if (bfd_seek (abfd, (file_ptr) 0, FALSE) != 0 || (bfd_bwrite (&exec_bytes, (bfd_size_type) EXEC_BYTES_SIZE, abfd) != EXEC_BYTES_SIZE)) return FALSE; /* Write out the symbols, and then the relocs. We must write out the symbols first so that we know the symbol indices. */ if (bfd_get_symcount (abfd) != 0) { /* Skip the relocs to where we want to put the symbols. */ if (bfd_seek (abfd, (file_ptr) (N_DRELOFF (*execp) + execp->a_drsize), SEEK_SET) != 0) return FALSE; } if (!MY (write_syms) (abfd)) return FALSE; if (bfd_get_symcount (abfd) != 0) { if (bfd_seek (abfd, (file_ptr) N_TRELOFF (*execp), SEEK_CUR) != 0) return FALSE; if (!NAME (aout,squirt_out_relocs) (abfd, obj_textsec (abfd))) return FALSE; if (bfd_seek (abfd, (file_ptr) N_DRELOFF (*execp), SEEK_CUR) != 0) return FALSE; if (!NAME (aout,squirt_out_relocs) (abfd, obj_datasec (abfd))) return FALSE; } return TRUE; }