PROTO(static void,force_indices_file_symbol_relative,(bfd *abfd,
struct internal_syment *symtab));
-/* All the swapping routines:
-*/
-
-
-
-static void
-DEFUN(swap_reloc_in,(abfd, reloc_src, reloc_dst),
- bfd *abfd AND
- RELOC *reloc_src AND
- struct internal_reloc *reloc_dst)
-{
- reloc_dst->r_vaddr = bfd_h_getlong(abfd, reloc_src->r_vaddr);
- reloc_dst->r_symndx = bfd_h_getlong(abfd, reloc_src->r_symndx);
- reloc_dst->r_type = bfd_h_getshort(abfd, reloc_src->r_type);
-#if M88
- reloc_dst->r_offset = bfd_h_getshort(abfd, reloc_src->r_offset);
-#endif
-}
-
-static void
-DEFUN(swap_reloc_out,(abfd, reloc_src, reloc_dst),
- bfd *abfd AND
- struct internal_reloc *reloc_src AND
- struct external_reloc *reloc_dst)
-{
- bfd_h_putlong(abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
- bfd_h_putlong(abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
- bfd_h_putshort(abfd, reloc_src->r_type, reloc_dst->r_type);
-#if M88
- bfd_h_putshort(abfd, reloc_src->r_offset, reloc_dst->r_offset);
-#endif
-
-}
-
-static void
-DEFUN(swap_filehdr,(abfd, filehdr),
- bfd *abfd AND
- FILHDR *filehdr)
-{
- sp(filehdr->f_magic);
- sp(filehdr->f_nscns);
- sp(filehdr->f_timdat);
- sp(filehdr->f_symptr);
- sp(filehdr->f_nsyms);
- sp(filehdr->f_opthdr);
- sp(filehdr->f_flags);
-
-
-}
-
-
-static void
-DEFUN(bfd_coff_swap_name_in,(abfd, ptr),
- bfd *abfd AND
- long *ptr)
-{
- if (ptr[0] == 0) {
- /* There is an index which needs to be swapped */
- bfd_h_put_x(abfd, ptr[1], (ptr + 1));
- }
- else {
- /* This is a string .. leave it alone */
- }
-}
-
-static void
-DEFUN(bfd_coff_swap_sym_in,(abfd, ext, in),
- bfd *abfd AND
- SYMENT *ext AND
- struct internal_syment *in)
-{
- if( ext->e.e_name[0] == 0) {
- in->_n._n_n._n_zeroes = 0;
- in->_n._n_n._n_offset = bfd_h_getlong(abfd, &ext->e.e.e_offset);
- }
- else {
- memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
- }
- in->n_value = bfd_h_get_x(abfd, &ext->e_value);
- in->n_scnum = bfd_h_get_x(abfd, &ext->e_scnum);
- in->n_type = bfd_h_get_x(abfd, &ext->e_type);
- in->n_sclass = bfd_h_get_x(abfd, &ext->e_sclass);
- in->n_numaux = bfd_h_get_x(abfd, &ext->e_numaux);
-}
-
-static void
-DEFUN(bfd_coff_swap_sym_out,(abfd,in, ext),
- bfd *abfd AND
- struct internal_syment *in AND
- SYMENT *ext)
-{
- if(in->_n._n_name[0] == 0) {
- bfd_h_putlong(abfd, 0, ext->e.e.e_zeroes);
- bfd_h_putlong(abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
- }
- else {
- memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
- }
- bfd_h_put_x(abfd, in->n_value , &ext->e_value);
- bfd_h_put_x(abfd, in->n_scnum , &ext->e_scnum);
- bfd_h_put_x(abfd, in->n_type , &ext->e_type);
- bfd_h_put_x(abfd, in->n_sclass , &ext->e_sclass);
- bfd_h_put_x(abfd, in->n_numaux , &ext->e_numaux);
-}
-
-static void
-DEFUN(bfd_coff_swap_aux_in,(abfd, ext, type, class, in),
- bfd *abfd AND
- AUXENT *ext AND
- int type AND
- int class AND
- union internal_auxent *in)
-{
- switch (class) {
- case C_FILE:
- if (ext->x_file.x_fname[0] == 0) {
- in->x_file.x_n.x_zeroes = 0;
- in->x_file.x_n.x_offset = bfd_h_getlong(abfd, &ext->x_file.x_n.x_offset);
- }
-
- break;
- case C_STAT:
-#ifdef C_LEAFSTAT
- case C_LEAFSTAT:
-#endif
- case C_HIDDEN:
- if (type == T_NULL) {
- in->x_scn.x_scnlen = bfd_h_get_x(abfd, & ext->x_scn.x_scnlen);
- in->x_scn.x_nreloc = bfd_h_get_x(abfd, &ext->x_scn.x_nreloc);
- in->x_scn.x_nlinno = bfd_h_get_x(abfd, &ext->x_scn.x_nlinno);
- break;
- }
- default:
- in->x_sym.x_tagndx = bfd_h_get_x(abfd, &ext->x_sym.x_tagndx);
- in->x_sym.x_tvndx = bfd_h_get_x(abfd, &ext->x_sym.x_tvndx);
-
- if (ISARY(type) || class == C_BLOCK) {
- in->x_sym.x_fcnary.x_ary.x_dimen[0] = bfd_h_get_x(abfd, & ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
- in->x_sym.x_fcnary.x_ary.x_dimen[1] = bfd_h_get_x(abfd, & ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
- in->x_sym.x_fcnary.x_ary.x_dimen[2] = bfd_h_get_x(abfd, & ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
- in->x_sym.x_fcnary.x_ary.x_dimen[3] = bfd_h_get_x(abfd, &ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
- }
- else {
- in->x_sym.x_fcnary.x_fcn.x_lnnoptr = bfd_h_get_x(abfd, & ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
- in->x_sym.x_fcnary.x_fcn.x_endndx = bfd_h_get_x(abfd, & ext->x_sym.x_fcnary.x_fcn.x_endndx);
- }
- if (ISFCN(type)) {
- in->x_sym.x_misc.x_fsize = bfd_h_get_x(abfd, &ext->x_sym.x_misc.x_fsize);
- }
- else {
- in->x_sym.x_misc.x_lnsz.x_lnno = bfd_h_get_x(abfd, & ext->x_sym.x_misc.x_lnsz.x_lnno);
- in->x_sym.x_misc.x_lnsz.x_size = bfd_h_get_x(abfd, & ext->x_sym.x_misc.x_lnsz.x_size);
- }
- }
-}
-
-static void
-DEFUN(bfd_coff_swap_aux_out,(abfd, in, type, class, ext),
- bfd *abfd AND
- union internal_auxent *in AND
- int type AND
- int class AND
- AUXENT *ext)
-{
- switch (class) {
- case C_FILE:
- if (in->x_file.x_fname[0] == 0) {
- bfd_h_put_x(abfd, 0,&ext->x_file.x_n.x_zeroes );
- bfd_h_put_x(abfd, in->x_file.x_n.x_offset, &ext->x_file.x_n.x_offset);
- }
-
- break;
- case C_STAT:
-#ifdef C_LEAFSTAT
- case C_LEAFSTAT:
-#endif
- case C_HIDDEN:
- if (type == T_NULL) {
- bfd_h_put_x(abfd, in->x_scn.x_scnlen, & ext->x_scn.x_scnlen);
- bfd_h_put_x(abfd, in->x_scn.x_nreloc, & ext->x_scn.x_nreloc);
- bfd_h_put_x(abfd, in->x_scn.x_nlinno, & ext->x_scn.x_nlinno);
- break;
- }
- default:
- bfd_h_put_x(abfd, in->x_sym.x_tagndx, &ext->x_sym.x_tagndx);
- bfd_h_put_x(abfd, in->x_sym.x_tvndx , &ext->x_sym.x_tvndx);
-
- if (ISARY(type) || class == C_BLOCK) {
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], & ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], & ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], & ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], & ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
- }
- else {
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, & ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
- bfd_h_put_x(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx, & ext->x_sym.x_fcnary.x_fcn.x_endndx);
- }
- if (ISFCN(type)) {
- bfd_h_put_x(abfd, in->x_sym.x_misc.x_fsize, &ext->x_sym.x_misc.x_fsize);
- }
- else {
- bfd_h_put_x(abfd, in->x_sym.x_misc.x_lnsz.x_lnno, & ext->x_sym.x_misc.x_lnsz.x_lnno);
- bfd_h_put_x(abfd, in->x_sym.x_misc.x_lnsz.x_size, & ext->x_sym.x_misc.x_lnsz.x_size);
- }
- }
-}
-
-static void
-DEFUN(bfd_coff_swap_lineno_in,(abfd, ext, in),
- bfd *abfd AND
- LINENO *ext AND
- struct internal_lineno *in)
-{
- in->l_addr.l_symndx = bfd_h_get_x(abfd, &ext->l_addr.l_symndx);
- in->l_lnno = bfd_h_get_x(abfd, & ext->l_lnno);
-}
-
-static void
-DEFUN(bfd_coff_swap_lineno_out,(abfd, in, ext),
- bfd *abfd AND
- struct internal_lineno *in AND
- struct external_lineno *ext)
-{
- bfd_h_put_x(abfd, in->l_addr.l_symndx, &ext->l_addr.l_symndx);
- bfd_h_put_x(abfd, in->l_lnno, &ext->l_lnno);
-}
-
-
-
-
-static void
-DEFUN(swap_aouthdr,(abfd, aouthdr),
- bfd *abfd AND
- AOUTHDR *aouthdr)
-{
-
- sp(aouthdr->magic);
- sp(aouthdr->vstamp);
- sp(aouthdr->tsize);
- sp(aouthdr->dsize);
- sp(aouthdr->bsize);
- sp(aouthdr->entry);
- sp(aouthdr->text_start);
- sp(aouthdr->data_start);
-#ifdef I960
- sp(aouthdr->tagentries);
-#endif
-}
-
-static void
-DEFUN(swap_scnhdr,(abfd, scnhdr),
- bfd *abfd AND
- SCNHDR *scnhdr)
-{
- sp(scnhdr->s_vaddr);
- sp(scnhdr->s_paddr);
- sp(scnhdr->s_size);
- sp(scnhdr->s_scnptr);
- sp(scnhdr->s_relptr);
- sp(scnhdr->s_lnnoptr);
- sp(scnhdr->s_nreloc);
- sp(scnhdr->s_nlnno);
- sp(scnhdr->s_flags);
-#ifdef I960
- sp(scnhdr->s_align);
-#endif
-}
\f
/* void warning(); */
extern asection abs_section;
symbol->value = idx;
}
-/*
- initialize a section structure with information peculiar to this
- particular implementation of coff
-*/
-
-static boolean
-DEFUN(coff_new_section_hook,(abfd_ignore, section_ignore),
- bfd *abfd_ignore AND
- asection *section_ignore)
-{
-#ifdef MC88MAGIC
- /* FIXME, shouldn't this ifdef be on something that says we are
- actually COMPILING FOR an 88K coff file, rather than simply
- knowing its magic number? */
- /* Align to at least 16 bytes */
- section_ignore->alignment_power = 4;
-#endif
-#if M68
- section_ignore->alignment_power = 3;
-#endif
- return true;
-}
-
-/* Take a section header read from a coff file (in HOST byte order),
- and make a BFD "section" out of it. */
-static boolean
-DEFUN(make_a_section_from_file,(abfd, hdr),
- bfd *abfd AND
- struct scnhdr *hdr)
-{
- asection *return_section;
-
- {
- /* Assorted wastage to null-terminate the name, thanks AT&T! */
- char *name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
- if (name == NULL) {
- bfd_error = no_memory;
- return false;
- }
- strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
- name[sizeof (hdr->s_name)] = 0;
-
- return_section = bfd_make_section(abfd, name);
- }
-
- /* s_paddr is presumed to be = to s_vaddr */
-#define assign(to, from) return_section->to = hdr->from
- assign(vma, s_vaddr);
- /* assign (vma, s_vaddr); */
- assign(size, s_size);
- assign(filepos, s_scnptr);
- assign(rel_filepos, s_relptr);
- assign(reloc_count, s_nreloc);
-#ifdef I960
- {
- /* FIXME, use a temp var rather than alignment_power */
- assign(alignment_power, s_align);
- {
- unsigned int i;
- for (i = 0; i < 32; i++) {
- if ((1 << i) >= (int) (return_section->alignment_power)) {
- return_section->alignment_power = i;
- break;
- }
- }
- }
- }
-#endif
- assign(line_filepos, s_lnnoptr);
- /*
- return_section->linesize = hdr->s_nlnno * sizeof (struct lineno);
- */
-
-#undef assign
- return_section->lineno_count = hdr->s_nlnno;
- return_section->userdata = NULL;
- return_section->next = (asection *) NULL;
- if ((hdr->s_flags & STYP_TEXT) || (hdr->s_flags & STYP_DATA))
- return_section->flags = (SEC_LOAD | SEC_ALLOC);
- else if (hdr->s_flags & STYP_BSS)
- return_section->flags = SEC_ALLOC;
-
- if (hdr->s_nreloc != 0)
- return_section->flags |= SEC_RELOC;
- if (hdr->s_scnptr != 0)
- return_section->flags |= SEC_HAS_CONTENTS;
- return true;
-}
-
-static boolean
-DEFUN(coff_mkobject,(abfd),
- bfd *abfd)
-{
- set_tdata (abfd, bfd_zalloc (abfd,sizeof(coff_data_type)));
- if (coff_data(abfd) == 0) {
- bfd_error = no_memory;
- return false;
- }
- coff_data(abfd)->relocbase = 0;
- return true;
-}
-
-static
-bfd_target *
-DEFUN(coff_real_object_p,(abfd, nscns, opthdr),
- bfd *abfd AND
- unsigned nscns AND
- unsigned opthdr)
-{
- coff_data_type *coff;
- char *file_info; /* buffer for all the headers */
- size_t readsize; /* length of file_info */
- struct filehdr *filehdr; /* points into file_info */
- struct scnhdr *sections; /* points into file_info */
-
- /* Build a play area */
- if (coff_mkobject(abfd) != true)
- return 0;
- coff = coff_data(abfd);
-
- /* OK, now we know the format, read in the filehdr, soi-disant "optional
- header", and all the sections. */
-
- readsize = sizeof(struct filehdr)
- + opthdr
- + (nscns * sizeof(struct scnhdr));
-
- file_info = (PTR) bfd_alloc(abfd, readsize);
- if (file_info == NULL) {
- bfd_error = no_memory;
- goto fail;
- }
-
- if (bfd_seek(abfd, 0L, SEEK_SET) < 0) {
- bfd_release (abfd, (PTR)file_info);
- goto fail;
- }
- if (bfd_read((PTR) file_info, 1, readsize, abfd) != readsize) {
- bfd_release (abfd, (PTR)file_info);
- goto fail;
- }
- filehdr = (struct filehdr *) file_info;
- sections = (struct scnhdr *) (file_info + sizeof(struct filehdr) + opthdr);
-
- swap_filehdr(abfd, filehdr);
-
- /* Now copy data as required; construct all asections etc */
- coff->symbol_index_slew = 0;
- coff->relocbase =0;
- coff->raw_syment_count = 0;
- coff->raw_linenos = 0;
- coff->raw_syments = 0;
- coff->sym_filepos =0;
- coff->flags = filehdr->f_flags;
- if (nscns != 0) {
- unsigned int i;
- for (i = 0; i < nscns; i++) {
- swap_scnhdr(abfd, sections + i);
- make_a_section_from_file(abfd, sections + i);
- }
- }
- /* Determine the machine architecture and type. */
- abfd->obj_machine = 0;
- switch (filehdr->f_magic) {
-#ifdef MC68MAGIC
- case MC68MAGIC:
- case M68MAGIC:
- abfd->obj_arch = bfd_arch_m68k;
- abfd->obj_machine = 68020;
- break;
-#endif
-#ifdef MC88MAGIC
- case MC88MAGIC:
- case MC88DMAGIC:
- case MC88OMAGIC:
- abfd->obj_arch = bfd_arch_m88k;
- abfd->obj_machine = 88100;
- break;
-#endif
-#ifdef I960ROMAGIC
- case I960ROMAGIC:
- case I960RWMAGIC:
- abfd->obj_arch = bfd_arch_i960;
- switch (F_I960TYPE & filehdr->f_flags)
- {
- default:
- case F_I960CORE:
- abfd->obj_machine = bfd_mach_i960_core;
- break;
- case F_I960KB:
- abfd->obj_machine = bfd_mach_i960_kb_sb;
- break;
- case F_I960MC:
- abfd->obj_machine = bfd_mach_i960_mc;
- break;
- case F_I960XA:
- abfd->obj_machine = bfd_mach_i960_xa;
- break;
- case F_I960CA:
- abfd->obj_machine = bfd_mach_i960_ca;
- break;
- case F_I960KA:
- abfd->obj_machine = bfd_mach_i960_ka_sa;
- break;
-
- }
- break;
-#endif
-
- default: /* Unreadable input file type */
- abfd->obj_arch = bfd_arch_obscure;
- break;
- }
-
- if (!(filehdr->f_flags & F_RELFLG))
- abfd->flags |= HAS_RELOC;
- if ((filehdr->f_flags & F_EXEC))
- abfd->flags |= EXEC_P;
- if (!(filehdr->f_flags & F_LNNO))
- abfd->flags |= HAS_LINENO;
- if (!(filehdr->f_flags & F_LSYMS))
- abfd->flags |= HAS_LOCALS;
-
- bfd_get_symcount(abfd) = filehdr->f_nsyms;
- if (filehdr->f_nsyms)
- abfd->flags |= HAS_SYMS;
- coff->sym_filepos = filehdr->f_symptr;
- swap_aouthdr(abfd, &coff->hdr);
-
- coff->symbols = (coff_symbol_type *) NULL;
- bfd_get_start_address(abfd) = opthdr ? exec_hdr(abfd).entry : 0;
-
- return abfd->xvec;
- fail:
- bfd_release(abfd, coff);
- return (bfd_target *)NULL;
-}
+#include "coffish.h"
/*
Takes a bfd and a symbol, returns a pointer to the coff specific area
-static bfd_target *
-DEFUN(coff_object_p,(abfd),
- bfd *abfd)
-{
- unsigned short magic,
- nscns,
- opthdr;
- bfd_error = system_call_error;
-
- /* figure out how much to read */
- if (bfd_read((PTR) &magic, 1, sizeof(magic), abfd) != sizeof(magic))
- return 0;
-
- magic = bfd_h_getshort(abfd, (bfd_byte *) (&magic));
-
- if (BADMAG(*((struct filehdr *) & magic))) {
- bfd_error = wrong_format;
- return 0;
- }
- if (bfd_read((PTR) &nscns, 1, sizeof(nscns), abfd) != sizeof(nscns))
- return 0;
- nscns = bfd_h_getshort(abfd, (unsigned char *) &nscns);
- if (bfd_seek(abfd, (file_ptr) & (((struct filehdr *) NULL)->f_opthdr), SEEK_SET)
- < 0)
- return 0;
- if (bfd_read((PTR) &opthdr, 1, sizeof(opthdr), abfd) != sizeof(opthdr))
- return 0;
- opthdr = bfd_h_getshort(abfd, (unsigned char *) &opthdr);
-
- /* if the optional header is NULL or not the correct size then
- quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
- and Intel 960 readwrite headers (I960WRMAGIC) is that the
- optional header is of a different size
- */
-
- if (opthdr != 0 &&
- opthdr != AOUTSZ)
- return (bfd_target *)NULL;
-
- return coff_real_object_p(abfd, nscns, opthdr);
-}
applied so we can dig it out through a pointer. */
static void
-coff_mangle_symbols(bfd_ptr)
-bfd *bfd_ptr;
+DEFUN(coff_mangle_symbols,(bfd_ptr),
+ bfd *bfd_ptr)
{
unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
if (coff_symbol_ptr == (coff_symbol_type *)NULL) {
/*
- This symbol has no coff information in it, it will take up
- only one slot in the output symbol table
- */
+ This symbol has no coff information in it, it will take up
+ only one slot in the output symbol table
+ */
native_index++;
}
else {
/* Normalize the symbol flags */
if (coff_symbol_ptr->symbol.flags & BSF_FORT_COMM) {
/* a common symbol is undefined with a value */
- syment->n_scnum = N_UNDEF;
- syment->n_value = coff_symbol_ptr->symbol.value;
+ syment->n_scnum = N_UNDEF;
+ syment->n_value = coff_symbol_ptr->symbol.value;
}
else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
syment->n_value = coff_symbol_ptr->symbol.value;
}
else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
- syment->n_scnum = N_UNDEF;
- syment->n_value = 0;
+ syment->n_scnum = N_UNDEF;
+ syment->n_value = 0;
}
else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
syment->n_scnum = N_ABS;
else {
syment->n_scnum =
coff_symbol_ptr->symbol.section->output_section->index+1;
-
+
syment->n_value =
coff_symbol_ptr->symbol.value +
coff_symbol_ptr->symbol.section->output_offset +
coff_symbol_ptr->symbol.section->output_section->vma;
}
-
-
+
+
/* If this symbol ties up something then do it */
if (syment->n_sclass == C_FILE && last_file != (struct internal_syment *)NULL)
#endif
)
&& last_fcn != (struct internal_syment *)NULL)
- {
- union internal_auxent *auxent = (union internal_auxent *)(last_fcn+1);
- auxent->x_sym.x_fcnary.x_fcn.x_endndx = native_index;
- last_fcn = (struct internal_syment *)NULL;
-
- }
+ {
+ union internal_auxent *auxent = (union internal_auxent *)(last_fcn+1);
+ auxent->x_sym.x_fcnary.x_fcn.x_endndx = native_index;
+ last_fcn = (struct internal_syment *)NULL;
+
+ }
else if (syment->n_sclass == C_EOS && last_tagndx != (struct internal_syment*)NULL)
- {
- union internal_auxent *auxent = (union internal_auxent *)(last_tagndx+1);
- /* Remember that we keep the native index in the offset
- so patch the beginning of the struct to point to this
- */
- auxent->x_sym.x_tagndx = last_tagndx->_n._n_n._n_offset;
- auxent->x_sym.x_fcnary.x_fcn.x_endndx = syment->n_numaux + 1 + native_index;
- /* Now point the eos to the structure */
- auxent = (union internal_auxent *)(syment+1);
- auxent->x_sym.x_tagndx = last_tagndx->_n._n_n._n_offset;
- }
+ {
+ union internal_auxent *auxent = (union internal_auxent *)(last_tagndx+1);
+ /* Remember that we keep the native index in the offset
+ so patch the beginning of the struct to point to this
+ */
+ auxent->x_sym.x_tagndx = last_tagndx->_n._n_n._n_offset;
+ auxent->x_sym.x_fcnary.x_fcn.x_endndx = syment->n_numaux + 1 + native_index;
+ /* Now point the eos to the structure */
+ auxent = (union internal_auxent *)(syment+1);
+ auxent->x_sym.x_tagndx = last_tagndx->_n._n_n._n_offset;
+ }
else if (syment->n_sclass == C_BLOCK
&& coff_symbol_ptr->symbol.name[1] == 'e')
{
&& first_time == true
&& last_file != (struct internal_syment *)NULL) {
/* This is the first external symbol seen which isn't a
- function place it in the last .file entry */
- last_file->n_value = native_index;
+ function place it in the last .file entry */
+ last_file->n_value = native_index;
first_time = false;
}
#ifdef C_LEAFPROC
if (syment->n_sclass == C_LEAFPROC &&
- bfd_h_get_x(bfd_ptr, &syment->n_numaux) == 2) {
+ syment->n_numaux == 2) {
union internal_auxent *auxent = (union internal_auxent *)(syment+2);
/* This is the definition of a leaf proc, we'll relocate the
address */
if (syment->n_numaux != 0) {
/*
If this symbol would like to point to something in the
- future then remember where it is
- */
+ future then remember where it is
+ */
if (uses_x_sym_x_tagndx_p(bfd_ptr, syment)) {
/*
If this is a ref to a structure then we'll tie it up
- now - there are never any forward refs for one
- */
+ now - there are never any forward refs for one
+ */
if (syment->n_sclass == C_STRTAG ||
syment->n_sclass == C_ENTAG ||
syment->n_sclass == C_UNTAG) {
if (ISFCN(syment->n_type)) {
last_fcn = syment;
}
- if (bfd_h_get_x(bfd_ptr, & syment->n_sclass) == C_BLOCK
+ if (syment->n_sclass == C_BLOCK
&& coff_symbol_ptr->symbol.name[1] == 'b')
{
*last_block++ = syment;
static void
-coff_write_symbols(abfd)
-bfd *abfd;
- {
- unsigned int i;
- unsigned int limit = bfd_get_symcount(abfd);
- unsigned int written = 0;
- struct internal_syment dummy;
- asymbol **p;
- unsigned int string_size = 0;
+DEFUN(coff_write_symbols,(abfd),
+bfd *abfd)
+{
+ unsigned int i;
+ unsigned int limit = bfd_get_symcount(abfd);
+ unsigned int written = 0;
+ struct internal_syment dummy;
+ asymbol **p;
+ unsigned int string_size = 0;
- /* Seek to the right place */
- bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
+ /* Seek to the right place */
+ bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
- /* Output all the symbols we have */
+ /* Output all the symbols we have */
- written = 0;
- for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
- asymbol *symbol = *p;
- coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
+ written = 0;
+ for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
+ asymbol *symbol = *p;
+ coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
- unsigned int j;
- struct internal_syment *native;
- if (c_symbol == (coff_symbol_type *) NULL ||
- c_symbol->native == (struct internal_syment *) NULL) {
- /*
- This symbol has been created by the loader, or come from a non
- coff format. It has no native element to inherit, make our
- own
- */
+ unsigned int j;
+ struct internal_syment *native;
+ if (c_symbol == (coff_symbol_type *) NULL ||
+ c_symbol->native == (struct internal_syment *) NULL) {
+ /*
+ This symbol has been created by the loader, or come from a non
+ coff format. It has no native element to inherit, make our
+ own
+ */
- native = &dummy;
- native->n_type = T_NULL;
+ native = &dummy;
+ native->n_type = T_NULL;
#ifdef I960
- native->n_flags = 0;
+ native->n_flags = 0;
#endif
- if (symbol->flags & BSF_ABSOLUTE) {
- native->n_scnum = N_ABS;
- native->n_value = symbol->value;
- }
- else if (symbol->flags & (BSF_UNDEFINED | BSF_FORT_COMM)) {
- native->n_scnum = N_UNDEF;
- native->n_value = symbol->value;
- }
- else if (symbol->flags & BSF_DEBUGGING) {
- /*
- remove name so it doesn't take up any space
- */
- symbol->name = "";
- continue;
- }
- else {
- native->n_scnum = symbol->section->output_section->index +
- 1;
- native->n_value = symbol->value +
- symbol->section->output_section->vma +
- symbol->section->output_offset;
+ if (symbol->flags & BSF_ABSOLUTE) {
+ native->n_scnum = N_ABS;
+ native->n_value = symbol->value;
+ }
+ else if (symbol->flags & (BSF_UNDEFINED | BSF_FORT_COMM)) {
+ native->n_scnum = N_UNDEF;
+ native->n_value = symbol->value;
+ }
+ else if (symbol->flags & BSF_DEBUGGING) {
+ /*
+ remove name so it doesn't take up any space
+ */
+ symbol->name = "";
+ continue;
+ }
+ else {
+ native->n_scnum = symbol->section->output_section->index +
+ 1;
+ native->n_value = symbol->value +
+ symbol->section->output_section->vma +
+ symbol->section->output_offset;
#ifdef I960
- /* Copy the any flags from the the file hdr into the symbol */
- {
- coff_symbol_type *c = coff_symbol_from(abfd, symbol);
- if (c != (coff_symbol_type *)NULL) {
- native->n_flags = c->symbol.the_bfd->flags;
- }
+ /* Copy the any flags from the the file hdr into the symbol */
+ {
+ coff_symbol_type *c = coff_symbol_from(abfd, symbol);
+ if (c != (coff_symbol_type *)NULL) {
+ native->n_flags = c->symbol.the_bfd->flags;
}
+ }
#endif
- }
+ }
#ifdef HASPAD1
- native->pad1[0] = 0;
- native->pad1[0] = 0;
+ native->pad1[0] = 0;
+ native->pad1[0] = 0;
#endif
-
- native->n_type = 0;
- if (symbol->flags & BSF_LOCAL)
- native->n_sclass = C_STAT;
- else
- native->n_sclass = C_EXT;
- native->n_numaux = 0;
- }
- else
- /*
- Does this symbol have an ascociated line number - if so then
- make it remember this symbol index. Also tag the auxent of
- this symbol to point to the right place in the lineno table
- */
- {
- alent *lineno = c_symbol->lineno;
- native = c_symbol->native;
- if (lineno) {
- unsigned int count = 0;
- lineno[count].u.offset = written;
- if (native->n_numaux) {
- union internal_auxent *a = (union internal_auxent *) (native + 1);
+
+ native->n_type = 0;
+ if (symbol->flags & BSF_LOCAL)
+ native->n_sclass = C_STAT;
+ else
+ native->n_sclass = C_EXT;
+ native->n_numaux = 0;
+ }
+ else
+ /*
+ Does this symbol have an ascociated line number - if so then
+ make it remember this symbol index. Also tag the auxent of
+ this symbol to point to the right place in the lineno table
+ */
+ {
+ alent *lineno = c_symbol->lineno;
+ native = c_symbol->native;
+ if (lineno) {
+ unsigned int count = 0;
+ lineno[count].u.offset = written;
+ if (native->n_numaux) {
+ union internal_auxent *a = (union internal_auxent *) (native + 1);
- a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
- c_symbol->symbol.section->output_section->moving_line_filepos;
- }
- /*
- And count and relocate all other linenumbers
- */
+ a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
+ c_symbol->symbol.section->output_section->moving_line_filepos;
+ }
+ /*
+ And count and relocate all other linenumbers
+ */
+ count++;
+ while (lineno[count].line_number) {
+ lineno[count].u.offset +=
+ c_symbol->symbol.section->output_section->vma +
+ c_symbol->symbol.section->output_offset;
count++;
- while (lineno[count].line_number) {
- lineno[count].u.offset +=
- c_symbol->symbol.section->output_section->vma +
- c_symbol->symbol.section->output_offset;
- count++;
- }
- c_symbol->symbol.section->output_section->moving_line_filepos +=
- count * LINESZ;
-
}
- } /* if symbol new to coff */
+ c_symbol->symbol.section->output_section->moving_line_filepos +=
+ count * LINESZ;
+
+ }
+ } /* if symbol new to coff */
- /* Fix the symbol names */
- {
- unsigned int name_length;
- if (symbol->name == (char *) NULL) {
+ /* Fix the symbol names */
+ {
+ unsigned int name_length;
+ if (symbol->name == (char *) NULL) {
+ /*
+ coff symbols always have names, so we'll make one up
+ */
+ symbol->name = "strange";
+ }
+ name_length = strlen(symbol->name);
+ if (name_length <= SYMNMLEN) {
+ /* This name will fit into the symbol neatly */
+ strncpy(native->_n._n_name, symbol->name, SYMNMLEN);
+ }
+ else {
+ native->_n._n_n._n_offset = string_size + 4;
+ native->_n._n_n._n_zeroes = 0;
+ string_size += name_length + 1;
+ }
+ {
+ unsigned int numaux = native->n_numaux;
+ int type = native->n_type;
+ int class = native->n_sclass;
+ SYMENT buf;
+ bfd_coff_swap_sym_out(abfd, native, &buf);
+ bfd_write((PTR)& buf, 1, SYMESZ, abfd);
+ for (j = 0; j != native->n_numaux;
+ j++) {
+ AUXENT buf1;
+ bfd_coff_swap_aux_out(abfd,
+ (union internal_auxent *)(native + j + 1), type, class, &buf1);
+ bfd_write((PTR) (native + j + 1), 1, AUXESZ, abfd);
+ }
/*
- coff symbols always have names, so we'll make one up
- */
- symbol->name = "strange";
- }
- name_length = strlen(symbol->name);
- if (name_length <= SYMNMLEN) {
- /* This name will fit into the symbol neatly */
- strncpy(native->_n._n_name, symbol->name, SYMNMLEN);
- }
- else {
- native->_n._n_n._n_offset = string_size + 4;
- native->_n._n_n._n_zeroes = 0;
- string_size += name_length + 1;
+ Reuse somewhere in the symbol to keep the index
+ */
+ set_index(symbol, written);
+ written += 1 + numaux;
}
- {
- unsigned int numaux = native->n_numaux;
- int type = native->n_type;
- int class = native->n_sclass;
- SYMENT buf;
- bfd_coff_swap_sym_out(abfd, native, &buf);
- bfd_write((PTR)& buf, 1, SYMESZ, abfd);
- for (j = 0; j != bfd_h_get_x(abfd, &native->n_numaux);
- j++) {
- AUXENT buf1;
- bfd_coff_swap_aux_out(abfd,
- (union internal_auxent *)(native + j + 1), type, class, &buf1);
- bfd_write((PTR) (native + j + 1), 1, AUXESZ, abfd);
- }
- /*
- Reuse somewhere in the symbol to keep the index
- */
- set_index(symbol, written);
- written += 1 + numaux;
- }
- }
- } /* for each out symbol */
+ }
+ } /* for each out symbol */
- bfd_get_symcount(abfd) = written;
- /* Now write out strings */
+ bfd_get_symcount(abfd) = written;
+ /* Now write out strings */
- if (string_size) {
- unsigned int size = string_size + 4;
- size = size;
- bfd_write((PTR) &size, 1, sizeof(size), abfd);
- for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
- asymbol *q = *p;
- size_t name_length = strlen(q->name);
- if (name_length > SYMNMLEN) {
- bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
- }
+ if (string_size) {
+ unsigned int size = string_size + 4;
+ size = size;
+ bfd_write((PTR) &size, 1, sizeof(size), abfd);
+ for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
+ asymbol *q = *p;
+ size_t name_length = strlen(q->name);
+ if (name_length > SYMNMLEN) {
+ bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
}
}
- else {
- /* We would normally not write anything here, but we'll write
- out 4 so that any stupid coff reader which tries to read
- the string table even when there isn't one won't croak.
- */
+ }
+ else {
+ /* We would normally not write anything here, but we'll write
+ out 4 so that any stupid coff reader which tries to read
+ the string table even when there isn't one won't croak.
+ */
- uint32e_type size = 4;
- size = size;
- bfd_write((PTR)&size, 1, sizeof(size), abfd);
+ uint32e_type size = 4;
+ size = size;
+ bfd_write((PTR)&size, 1, sizeof(size), abfd);
- }
-
}
+
+}
static void
coff_write_relocs(abfd)
}
static void
-coff_write_linenumbers(abfd)
-bfd *abfd;
+DEFUN(coff_write_linenumbers,(abfd),
+ bfd *abfd)
{
asection *s;
for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
/* SUPPRESS 558 */
/* SUPPRESS 529 */
static boolean
-coff_write_object_contents(abfd)
-bfd *abfd;
- {
- struct filehdr file_header;
- asection *current;
- boolean hasrelocs = false;
- boolean haslinno = false;
- file_ptr reloc_base;
- file_ptr lineno_base;
- file_ptr sym_base;
- file_ptr scn_base;
- file_ptr data_base;
- unsigned long reloc_size = 0;
- unsigned long lnno_size = 0;
- asection *text_sec = NULL;
- asection *data_sec = NULL;
- asection *bss_sec = NULL;
- unsigned magic,
-
- flags;
+DEFUN(coff_write_object_contents,(abfd),
+bfd *abfd)
+{
+ asection *current;
+ boolean hasrelocs = false;
+ boolean haslinno = false;
+ file_ptr reloc_base;
+ file_ptr lineno_base;
+ file_ptr sym_base;
+ file_ptr scn_base;
+ file_ptr data_base;
+ unsigned long reloc_size = 0;
+ unsigned long lnno_size = 0;
+ asection *text_sec = NULL;
+ asection *data_sec = NULL;
+ asection *bss_sec = NULL;
+
+ struct internal_filehdr internal_f;
+ struct internal_aouthdr internal_a;
- struct icofdata *coff = obj_icof(abfd);
+ struct icofdata *coff = obj_icof(abfd);
- bfd_error = system_call_error;
+ bfd_error = system_call_error;
- if(abfd->output_has_begun == false) {
- coff_compute_section_file_positions(abfd);
- }
+ if(abfd->output_has_begun == false) {
+ coff_compute_section_file_positions(abfd);
+ }
- if (abfd->sections != (asection *)NULL) {
- scn_base = abfd->sections->filepos;
- }
- else {
- scn_base = 0;
- }
- if (bfd_seek(abfd, scn_base, SEEK_SET) != 0)
- return false;
- reloc_base = obj_relocbase(abfd);
+ if (abfd->sections != (asection *)NULL) {
+ scn_base = abfd->sections->filepos;
+ }
+ else {
+ scn_base = 0;
+ }
+ if (bfd_seek(abfd, scn_base, SEEK_SET) != 0)
+ return false;
+ reloc_base = obj_relocbase(abfd);
- /* Make a pass through the symbol table to count line number entries and
- put them into the correct asections */
+ /* Make a pass through the symbol table to count line number entries and
+ put them into the correct asections */
- coff_count_linenumbers(abfd);
- data_base = scn_base;
+ coff_count_linenumbers(abfd);
+ data_base = scn_base;
- /* Work out the size of the reloc and linno areas */
+ /* Work out the size of the reloc and linno areas */
- for (current = abfd->sections; current != NULL; current = current->next) {
- reloc_size += current->reloc_count * RELSZ;
- lnno_size += current->lineno_count * LINESZ;
- data_base += SCNHSZ;
- }
+ for (current = abfd->sections; current != NULL; current = current->next) {
+ reloc_size += current->reloc_count * RELSZ;
+ lnno_size += current->lineno_count * LINESZ;
+ data_base += SCNHSZ;
+ }
- lineno_base = reloc_base + reloc_size;
- sym_base = lineno_base + lnno_size;
+ lineno_base = reloc_base + reloc_size;
+ sym_base = lineno_base + lnno_size;
- /* Indicate in each section->line_filepos its actual file address */
- for (current = abfd->sections; current != NULL; current = current->next) {
- if (current->lineno_count) {
- current->line_filepos = lineno_base;
- current->moving_line_filepos = lineno_base;
- lineno_base += current->lineno_count * LINESZ;
- }
- else {
- current->line_filepos = 0;
- }
- if (current->reloc_count) {
- current->rel_filepos = reloc_base;
- reloc_base += current->reloc_count * sizeof(struct internal_reloc);
- }
- else {
- current->rel_filepos = 0;
- }
+ /* Indicate in each section->line_filepos its actual file address */
+ for (current = abfd->sections; current != NULL; current = current->next) {
+ if (current->lineno_count) {
+ current->line_filepos = lineno_base;
+ current->moving_line_filepos = lineno_base;
+ lineno_base += current->lineno_count * LINESZ;
+ }
+ else {
+ current->line_filepos = 0;
+ }
+ if (current->reloc_count) {
+ current->rel_filepos = reloc_base;
+ reloc_base += current->reloc_count * sizeof(struct internal_reloc);
+ }
+ else {
+ current->rel_filepos = 0;
}
+ }
- /* Write section headers to the file. */
+ /* Write section headers to the file. */
- bfd_seek(abfd,
- (file_ptr) ((abfd->flags & EXEC_P) ?
- (FILHSZ + AOUTSZ) : FILHSZ),
- SEEK_SET);
+ bfd_seek(abfd,
+ (file_ptr) ((abfd->flags & EXEC_P) ?
+ (FILHSZ + AOUTSZ) : FILHSZ),
+ SEEK_SET);
- {
+ {
#if 0
- unsigned int pad = abfd->flags & D_PAGED ? data_base : 0;
+ unsigned int pad = abfd->flags & D_PAGED ? data_base : 0;
#endif
- unsigned int pad = 0;
+ unsigned int pad = 0;
- for (current = abfd->sections; current != NULL; current = current->next) {
- SCNHDR section;
- strncpy(&(section.s_name[0]), current->name, 8);
- section.s_vaddr = current->vma + pad;
- section.s_paddr = current->vma + pad;
- section.s_size = current->size - pad;
- /*
- If this section has no size or is unloadable then the scnptr
- will be 0 too
- */
- if (current->size - pad == 0 ||
- (current->flags & SEC_LOAD) == 0) {
- section.s_scnptr = 0;
+ for (current = abfd->sections; current != NULL; current = current->next) {
+ struct internal_scnhdr section;
+ strncpy(&(section.s_name[0]), current->name, 8);
+ section.s_vaddr = current->vma + pad;
+ section.s_paddr = current->vma + pad;
+ section.s_size = current->size - pad;
+ /*
+ If this section has no size or is unloadable then the scnptr
+ will be 0 too
+ */
+ if (current->size - pad == 0 ||
+ (current->flags & SEC_LOAD) == 0) {
+ section.s_scnptr = 0;
- }
- else {
- section.s_scnptr = current->filepos;
- }
- section.s_relptr = current->rel_filepos;
- section.s_lnnoptr = current->line_filepos;
- section.s_nreloc = current->reloc_count;
- section.s_nlnno = current->lineno_count;
- if (current->reloc_count != 0)
- hasrelocs = true;
- if (current->lineno_count != 0)
- haslinno = true;
+ }
+ else {
+ section.s_scnptr = current->filepos;
+ }
+ section.s_relptr = current->rel_filepos;
+ section.s_lnnoptr = current->line_filepos;
+ section.s_nreloc = current->reloc_count;
+ section.s_nlnno = current->lineno_count;
+ if (current->reloc_count != 0)
+ hasrelocs = true;
+ if (current->lineno_count != 0)
+ haslinno = true;
- if (!strcmp(current->name, _TEXT)) {
- text_sec = current;
- section.s_flags = STYP_TEXT; /* kinda stupid */
- }
- else if (!strcmp(current->name, _DATA)) {
- data_sec = current;
- section.s_flags = STYP_DATA; /* kinda stupid */
- }
- else if (!strcmp(current->name, _BSS)) {
- bss_sec = current;
- section.s_flags = STYP_BSS; /* kinda stupid */
- }
+ if (!strcmp(current->name, _TEXT)) {
+ text_sec = current;
+ section.s_flags = STYP_TEXT; /* kinda stupid */
+ }
+ else if (!strcmp(current->name, _DATA)) {
+ data_sec = current;
+ section.s_flags = STYP_DATA; /* kinda stupid */
+ }
+ else if (!strcmp(current->name, _BSS)) {
+ bss_sec = current;
+ section.s_flags = STYP_BSS; /* kinda stupid */
+ }
#ifdef I960
- section.s_align = (current->alignment_power
- ? 1 << current->alignment_power
- : 0);
+ section.s_align = (current->alignment_power
+ ? 1 << current->alignment_power
+ : 0);
#endif
- swap_scnhdr(abfd, §ion);
- bfd_write((PTR) (§ion), 1, SCNHSZ, abfd);
- pad = 0;
+ {
+ SCNHDR buff;
+
+ swap_scnhdr_out(abfd, §ion, &buff);
+ bfd_write((PTR) (&buff), 1, SCNHSZ, abfd);
+
+ }
+ pad = 0;
+ }
}
- }
/* OK, now set up the filehdr... */
-
- bfd_h_put_x(abfd, abfd->section_count, &file_header.f_nscns);
+ internal_f.f_nscns = abfd->section_count;
/*
We will NOT put a fucking timestamp in the header here. Every time you
put it back, I will come in and take it out again. I'm sorry. This
steve@cygnus.com
*/
#ifdef COFF_TIMESTAMP
- bfd_h_put_x(abfd, time(0), &file_header.f_timdat);
+ internal_f.f_timdat = time(0);
#else
- bfd_h_put_x(abfd, 0, &file_header.f_timdat);
+ internal_f.f_timdat = 0;
#endif
if (bfd_get_symcount(abfd) != 0)
- bfd_h_put_x(abfd, sym_base, &file_header.f_symptr);
+ internal_f.f_symptr = sym_base;
else
- bfd_h_put_x(abfd, 0, &file_header.f_symptr);
+ internal_f.f_symptr = 0;
- file_header.f_flags = 0;
+ internal_f.f_flags = 0;
if (abfd->flags & EXEC_P)
- bfd_h_put_x(abfd, sizeof(AOUTHDR), &file_header.f_opthdr);
+ internal_f.f_opthdr = AOUTSZ;
else
- bfd_h_put_x(abfd, 0, &file_header.f_opthdr);
+ internal_f.f_opthdr = 0;
if (!hasrelocs)
- file_header.f_flags |= F_RELFLG;
+ internal_f.f_flags |= F_RELFLG;
if (!haslinno)
- file_header.f_flags |= F_LNNO;
+ internal_f.f_flags |= F_LNNO;
if (0 == bfd_get_symcount(abfd))
- file_header.f_flags |= F_LSYMS;
+ internal_f.f_flags |= F_LSYMS;
if (abfd->flags & EXEC_P)
- file_header.f_flags |= F_EXEC;
+ internal_f.f_flags |= F_EXEC;
#if M88
- file_header.f_flags |= F_AR32W;
+ internal_f.f_flags |= F_AR32W;
#else
if (!abfd->xvec->byteorder_big_p)
- file_header.f_flags |= F_AR32WR;
+ internal_f.f_flags |= F_AR32WR;
#endif
/*
FIXME, should do something about the other byte orders and
/* Set up architecture-dependent stuff */
- magic = 0;
- flags = 0;
- coff_set_flags(abfd, &magic, &flags);
- file_header.f_flags |= flags;
+ { int magic = 0;
+ int flags = 0;
+ coff_set_flags(abfd, &magic, &flags);
+ internal_f.f_flags |= flags;
+ internal_f.f_magic = magic;
+ internal_f.f_flags = flags;
+
- bfd_h_put_x(abfd, magic, &file_header.f_magic);
- bfd_h_put_x(abfd, file_header.f_flags, &file_header.f_flags);
+ /* ...and the "opt"hdr... */
- /* ...and the "opt"hdr... */
#ifdef I960
- bfd_h_put_x(abfd, (magic == I960ROMAGIC ? NMAGIC : OMAGIC),
- &(exec_hdr(abfd).magic));
+ internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
#endif
#if M88
- exec_hdr(abfd).magic = PAGEMAGICBCS;
+ internal_a.magic = PAGEMAGICBCS;
#endif
-
+ }
/* Now should write relocs, strings, syms */
obj_sym_filepos(abfd) = sym_base;
coff_write_relocs(abfd);
}
if (text_sec) {
- bfd_h_put_x(abfd, text_sec->size, &coff->hdr.tsize);
- bfd_h_put_x(abfd,
- text_sec->size ? text_sec->vma : 0,
- &exec_hdr(abfd).text_start);
+ internal_a.tsize = text_sec->size;
+ internal_a.text_start =text_sec->size ? text_sec->vma : 0;
}
if (data_sec) {
- bfd_h_put_x(abfd, data_sec->size, &coff->hdr.dsize);
- bfd_h_put_x(abfd,
- data_sec->size ? data_sec->vma : 0,
- &exec_hdr(abfd).data_start);
+ internal_a.dsize = data_sec->size;
+ internal_a.data_start = data_sec->size ? data_sec->vma : 0;
}
if (bss_sec) {
- bfd_h_put_x(abfd, bss_sec->size, &coff->hdr.bsize);
+ internal_a.bsize = bss_sec->size;
}
- bfd_h_put_x(abfd, bfd_get_start_address(abfd), &coff->hdr.entry);
- bfd_h_put_x(abfd, bfd_get_symcount(abfd), &file_header.f_nsyms);
+ internal_a.entry = bfd_get_start_address(abfd);
+ internal_f.f_nsyms = bfd_get_symcount(abfd);
/* now write them */
if (bfd_seek(abfd, 0L, SEEK_SET) != 0)
return false;
-
- bfd_write((PTR) &file_header, 1, FILHSZ, abfd);
-
+ {
+ FILHDR buff;
+ swap_filehdr_out(abfd, &internal_f, &buff);
+ bfd_write((PTR) &internal_f, 1, FILHSZ, abfd);
+ }
if (abfd->flags & EXEC_P) {
- bfd_write((PTR) &coff->hdr, 1, AOUTSZ, abfd);
+ AOUTHDR buff;
+ swap_aouthdr_out(abfd, &internal_a, &buff);
+ bfd_write((PTR) &buff, 1, AOUTSZ, abfd);
}
return true;
}
return true;
}
+static boolean
+coff_close_and_cleanup(abfd)
+ bfd *abfd;
+{
+ if (!bfd_read_p(abfd))
+ switch (abfd->format) {
+ case bfd_archive:
+ if (!_bfd_write_archive_contents(abfd))
+ return false;
+ break;
+ case bfd_object:
+ if (!coff_write_object_contents(abfd))
+ return false;
+ break;
+ default:
+ bfd_error = invalid_operation;
+ return false;
+ }
+
+ /* We depend on bfd_close to free all the memory on the obstack. */
+ /* FIXME if bfd_release is not using obstacks! */
+ return true;
+}
+
static PTR
buy_and_read(abfd, where, seek_direction, size)
{
struct internal_syment *end = symtab + count;
for (; symtab < end; ++symtab) {
- if (bfd_h_get_x(abfd, &symtab->n_sclass) == C_FILE) {
- bfd_h_put_x(abfd, 0, & symtab->n_value);
+ if (symtab->n_sclass == C_FILE) {
+ symtab->n_value = 0;
}
- else if (bfd_h_get_x(abfd, &symtab->n_sclass) == C_ALIAS) {
+ else if (symtab->n_sclass == C_ALIAS) {
/*
These guys have indices in their values.
*/
- bfd_h_put_x(abfd, bfd_h_get_x(abfd, & symtab->n_value) + offset, & symtab->n_value);
-
+ symtab->n_value = symtab->n_value + offset;
}
else if (symtab->n_numaux) {
/*
|| symtab->n_sclass == C_ENTAG
|| symtab->n_sclass == C_BLOCK
|| symtab->n_sclass == C_FCN
- || ISFCN(bfd_h_get_x(abfd, &symtab->n_type))) {
+ || ISFCN(symtab->n_type)) {
((union internal_auxent *) (symtab +
1))->x_sym.x_fcnary.x_fcn.x_endndx
} /* These guys have an endndx */
#ifndef I960
- if (ISFCN(bfd_h_get_x(abfd,& symtab->n_type))) {
+ if (ISFCN(symtab->n_type)) {
((union internal_auxent *) (symtab + 1))->x_sym.x_tvndx += offset;
} /* These guys have a tvndx. I think...
(FIXME) */
#endif /* Not I960 */
} /* if value, else if aux */
- symtab += bfd_h_get_x(abfd, &symtab->n_numaux);
+ symtab += symtab->n_numaux;
} /* walk the symtab */
return;
symbols === the symbol table size.
*/
- if (bfd_read((char *) &string_table_size_buffer,
+ if (bfd_read((char *) string_table_size_buffer,
sizeof(string_table_size_buffer),
1, abfd) != sizeof(string_table_size)) {
bfd_error = system_call_error;
return (NULL);
} /* on error */
- string_table_size = bfd_h_getlong(abfd, &string_table_size_buffer);
+ string_table_size = bfd_h_getlong(abfd, string_table_size_buffer);
if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
bfd_error = no_memory;
#endif
for (i = 0; i < cof->raw_syment_count; i++) {
- if (bfd_h_get_x(abfd, &p->n_sclass) == C_FILE) {
+ if (p->n_sclass == C_FILE) {
/* File name is embeded in auxent */
/*
This isn't right. The fname should probably be normalized
*filename_ptr = ((AUXENT *) (p + 1))->x_file.x_fname;
break;
}
- p += 1 + bfd_h_get_x(abfd, & p->n_numaux);
+ p += 1 + p->n_numaux;
}
/* Now wander though the raw linenumbers of the section */
/*
The linenumber is stored in the auxent
*/
union internal_auxent *a = (union internal_auxent *) (s + 1);
- line_base = bfd_h_get_x(abfd, &a->x_sym.x_misc.x_lnsz.x_lnno);
+ line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
}
}
}
size_t size;
if (reloc == false) {
- size = sizeof(struct filehdr) + sizeof(AOUTHDR);
+ size = FILHSZ + AOUTSZ;
}
else {
- size = sizeof(struct filehdr);
+ size = FILHSZ;
}
size += abfd->section_count * SCNHSZ;
#include "intel-coff.h"
#include "libcoff.h" /* to allow easier abstraction-breaking */
-/* initialize a section structure with information
- * peculiar to this particular implementation of coff
- */
-
-static boolean
-ecoff_new_section_hook(ignore_abfd, ignore)
-bfd *ignore_abfd;
-asection *ignore;
-{
- return true;
-}
-
-/* Take a section header read from a coff file (in HOST byte order),
- and make a BFD "section" out of it. */
-static boolean
-DEFUN(make_a_section_from_file,(abfd, hdr),
- bfd *abfd AND
- struct scnhdr *hdr)
-{
- asection *return_section;
-
- {
- /* Assorted wastage to null-terminate the name, thanks AT&T! */
- char *name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
- if (name == NULL) {
- bfd_error = no_memory;
- return false;
- }
- strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
- name[sizeof (hdr->s_name)] = 0;
-
- return_section = bfd_make_section(abfd, name);
- }
-
- /* s_paddr is presumed to be = to s_vaddr */
-#define assign(to, from) return_section->to = hdr->from
- assign(vma, s_vaddr);
- /* assign (vma, s_vaddr); */
- assign(size, s_size);
- assign(filepos, s_scnptr);
- assign(rel_filepos, s_relptr);
- assign(reloc_count, s_nreloc);
- assign(line_filepos, s_lnnoptr);
- /*
- return_section->linesize = hdr->s_nlnno * sizeof (struct lineno);
- */
-
-#undef assign
- return_section->lineno_count = hdr->s_nlnno;
- return_section->userdata = NULL;
- return_section->next = (asection *) NULL;
- if ((hdr->s_flags & STYP_TEXT) || (hdr->s_flags & STYP_DATA))
- return_section->flags = (SEC_LOAD | SEC_ALLOC);
- else if (hdr->s_flags & STYP_BSS)
- return_section->flags = SEC_ALLOC;
-
- if (hdr->s_nreloc != 0)
- return_section->flags |= SEC_RELOC;
- if (hdr->s_scnptr != 0)
- return_section->flags |= SEC_HAS_CONTENTS;
- return true;
-}
-
-bfd_target *
-ecoff_real_object_p (abfd, nscns, opthdr)
- bfd *abfd;
- unsigned short nscns, opthdr;
-{
- struct icofdata *tdata;
- char *file_info; /* buffer for all the headers */
- long readsize; /* length of file_info */
- struct filehdr* filehdr; /* points into file_info */
- struct scnhdr *sections; /* points into file_info */
-
- /* OK, now we know the format, read in the filehdr, soi-disant
- "optional header", and all the sections.*/
- readsize = sizeof(struct filehdr) + opthdr + (nscns * sizeof (struct scnhdr));
- file_info = (char*)bfd_alloc (abfd, readsize);
- if (file_info == NULL) {
- bfd_error = no_memory;
- return 0;
- }
- if (bfd_seek (abfd, 0, false) < 0) return 0;
- if (bfd_read (file_info, 1, readsize, abfd) != readsize) return 0;
- filehdr = (struct filehdr *) file_info;
- sections = (struct scnhdr *) (file_info + sizeof (struct filehdr) + opthdr);
-
- /* Now copy data as required; construct all asections etc */
- tdata = (struct icofdata *) bfd_zalloc (abfd, sizeof (struct icofdata) +
- sizeof (AOUTHDR));
- if (tdata == NULL) {
- bfd_release (abfd, file_info);
- bfd_error = no_memory;
- return 0;
- }
-
- if (nscns != 0)
- {
- unsigned int i;
- for (i = 0; i < nscns; i++)
- {
- make_a_section_from_file (abfd, sections + i);
- }
- }
-
- abfd->flags |= HAS_RELOC | HAS_LINENO | HAS_LOCALS;
-
- /* FIXME, the guess should be set by OR-ing info from the sections */
- if ((filehdr->f_flags & F_RELFLG) != F_RELFLG) abfd->flags &= ~HAS_RELOC;
- if ((filehdr->f_flags & F_EXEC) == F_EXEC) abfd->flags |= EXEC_P;
- if ((filehdr->f_flags & F_LNNO) != F_LNNO) abfd->flags &= ~HAS_LINENO;
- if ((filehdr->f_flags & F_LSYMS) != F_LSYMS) abfd->flags &= ~HAS_LOCALS;
- set_tdata (abfd, tdata);
- bfd_get_symcount (abfd) = filehdr->f_nsyms;
- if (filehdr->f_nsyms) abfd->flags |= HAS_SYMS;
-
- tdata->sym_filepos = filehdr->f_symptr;
-/* FIXME, needs byte swapping */
- tdata->hdr = *(struct aouthdr *)(file_info + sizeof (struct filehdr));
- tdata->symbols = (coff_symbol_type *)NULL;
- bfd_get_start_address (abfd) = exec_hdr (abfd).entry;
- return abfd->xvec;
-}
-
-bfd_target *
-ecoff_object_p (abfd)
- bfd *abfd;
-{
- unsigned char short_bytes[SHORT_SIZE];
- unsigned short magic, nscns, opthdr;
-
- bfd_error = no_error;
-
- /* figure out how much to read */
- if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE)
- return 0;
-
- magic = bfd_h_getshort (abfd, short_bytes);
- if (magic != (abfd->xvec->byteorder_big_p ? 0x160 : 0x162)) {
- bfd_error = wrong_format;
- return 0;
- }
- 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 ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE)
- return 0;
- opthdr = bfd_h_getshort (abfd, short_bytes);
-
- return ecoff_real_object_p (abfd, nscns, opthdr);
-}
-
-static boolean
-ecoff_mkobject (abfd)
- bfd *abfd;
-{
- char *rawptr;
-
-
- bfd_error = no_error;
-
- /* Use an intermediate variable for clarity */
- rawptr = (char*)bfd_zalloc (abfd, sizeof (struct icofdata));
- if (rawptr == NULL) {
- bfd_error = no_memory;
- return false;
- }
- set_tdata (abfd, rawptr);
- return true;
-}
-\f
-void
-ecoff_write_linenumbers(ignore_abfd)
-bfd *ignore_abfd;
-{
-}
-
-
-static asymbol *
-ecoff_make_empty_symbol(abfd)
- bfd *abfd;
-{
- coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
- if (new == NULL) {
- bfd_error = no_memory;
- return (NULL);
- } /* on error */
- new->native = 0;
- new->lineno = (alent *) NULL;
- new->symbol.the_bfd = abfd;
- return &new->symbol;
-}
-
-/*SUPPRESS 558*/
-/*SUPPRESS 529*/
-boolean
-ecoff_write_object_contents (ignore_abfd)
- bfd *ignore_abfd;
-{
- return false;
-}
-\f
-/* Calculate the file position for each section. */
-/* ARGSUSED */
-boolean
-ecoff_set_section_contents (abfd, section, location, offset, count)
- bfd *abfd;
- sec_ptr section;
- unsigned char *location;
- file_ptr offset;
- int count;
-{
- return false;
-}
-
-/* ARGSUSED */
-boolean
-ecoff_set_section_linenos (abfd, section, location, offset, count)
- bfd *abfd;
- sec_ptr section;
- unsigned char *location;
- file_ptr offset;
- int count;
-{
- return 0;
-}
-\f
-/* ARGSUSED */
-static boolean
-ecoff_slurp_symbol_table(abfd)
- bfd *abfd;
-{
- abort();
-}
-
-unsigned int
-ecoff_get_symtab_upper_bound (abfd)
- bfd *abfd;
-{
- if (!ecoff_slurp_symbol_table (abfd)) return 0;
-
- return (bfd_get_symcount (abfd)+1) * (sizeof (coff_symbol_type *));
-}
-
-
-unsigned int
-ecoff_get_symtab(abfd, alocation)
-bfd *abfd;
-asymbol **alocation;
-{
- unsigned int counter = 0;
- coff_symbol_type *symbase;
- coff_symbol_type **location = (coff_symbol_type **)(alocation);
-
- if (!ecoff_slurp_symbol_table (abfd)) return 0;
-
- for (symbase = obj_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
- *(location++) = symbase++;
- *location++ =0;
- return counter;
-}
-
-unsigned int
-ecoff_get_reloc_upper_bound (abfd, asect)
- bfd *abfd;
- sec_ptr asect;
-{
- if (bfd_get_format (abfd) != bfd_object) {
- bfd_error = invalid_operation;
- return 0;
- }
-
- return (asect->reloc_count + 1) * sizeof(arelent *);
-}
-
-
-
-/* ARGSUSED */
-boolean
-ecoff_slurp_reloc_table (abfd, asect)
- bfd *abfd;
- sec_ptr asect;
-{
- abort();
-}
-
-
-/* This is stupid. This function should be a boolean predicate */
-unsigned int
-ecoff_canonicalize_reloc (abfd, section, relptr)
- bfd *abfd;
- sec_ptr section;
- arelent **relptr;
-{
- return 0;
-}
-
-boolean
-ecoff_get_section_contents (abfd, section, location, offset, count)
- bfd *abfd;
- sec_ptr section;
- PTR location;
- file_ptr offset;
- int count;
-{
- if (count) {
- if (offset >= section->size) return false;
-
- bfd_seek (abfd, section->filepos + offset, SEEK_SET);
-
- return (bfd_read (location, 1, count, abfd) == count) ? true:false;
- }
- else return true;
-}
-
-/* ARGSUSED */
-alent *
-ecoff_get_lineno(ignore_abfd, ignore_symbol)
-bfd *ignore_abfd;
-PTR ignore_symbol;
-{
-return (alent *)NULL;
-}
-
-#define ecoff_core_file_failing_command _bfd_dummy_core_file_failing_command
-#define ecoff_core_file_failing_signal _bfd_dummy_core_file_failing_signal
-#define ecoff_core_file_matches_executable_p _bfd_dummy_core_file_matches_executable_p
-
-/* Archives not supported yet. FIXME. */
-#define ecoff_slurp_armap bfd_false
-#define ecoff_slurp_extended_name_table bfd_false
-#define ecoff_truncate_arname bfd_dont_truncate_arname
-#define ecoff_write_armap bfd_false
-#define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file
-#define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt
-
-/* Unimplemented routines. FIXME. */
-#define ecoff_print_symbol bfd_void
-#define ecoff_set_arch_mach bfd_false
-#define ecoff_find_nearest_line bfd_false
-#define ecoff_sizeof_headers bfd_0
-
-/* We use the generic BFD version of these. */
-#define ecoff_close_and_cleanup bfd_generic_close_and_cleanup
+#define BADMAG(x) ECOFFBADMAG(x)
+#include "coff-code.h"
bfd_target ecoff_little_vec =
{"ecoff-littlemips", /* name */
bfd_target_coff_flavour_enum,
_do_getllong, _do_putllong, _do_getlshort, _do_putlshort, /* data */
_do_getllong, _do_putllong, _do_getlshort, _do_putlshort, /* hdrs */
- {_bfd_dummy_target, ecoff_object_p, /* bfd_check_format */
+ {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
bfd_generic_archive_p, _bfd_dummy_target},
- {bfd_false, ecoff_mkobject, bfd_false, /* bfd_set_format */
+ {bfd_false, coff_mkobject, bfd_false, /* bfd_set_format */
bfd_false},
- {bfd_false, ecoff_write_object_contents, bfd_false, bfd_false},
- JUMP_TABLE (ecoff)
+ {bfd_false, coff_write_object_contents, bfd_false, bfd_false},
+ JUMP_TABLE (coff)
};
bfd_target ecoff_big_vec =
_do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* data */
_do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* hdrs */
- {_bfd_dummy_target, ecoff_object_p, /* bfd_check_format */
+ {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
bfd_generic_archive_p, _bfd_dummy_target},
- {bfd_false, ecoff_mkobject, bfd_false, /* bfd_set_format */
+ {bfd_false, coff_mkobject, bfd_false, /* bfd_set_format */
bfd_false},
- {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */
+ {bfd_false, coff_write_object_contents, /* bfd_write_contents */
bfd_false, bfd_false},
- JUMP_TABLE(ecoff)
+ JUMP_TABLE(coff)
};