aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffcode.h
diff options
context:
space:
mode:
authorJohn Gilmore <gnu@cygnus>1991-10-25 07:06:02 +0000
committerJohn Gilmore <gnu@cygnus>1991-10-25 07:06:02 +0000
commitcbdc790909da22bc1114e681765b152e650aa92b (patch)
treeca55e91a8ba4fc80a9eed11c59049bdbf1f35dac /bfd/coffcode.h
parentc8c0a2bd59cf277c1ebaf857b4e84eff91b94580 (diff)
downloadgdb-cbdc790909da22bc1114e681765b152e650aa92b.zip
gdb-cbdc790909da22bc1114e681765b152e650aa92b.tar.gz
gdb-cbdc790909da22bc1114e681765b152e650aa92b.tar.bz2
RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and John Gilmore.
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r--bfd/coffcode.h718
1 files changed, 405 insertions, 313 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index bfa0036..315daac 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -34,12 +34,12 @@ which defines the internal structure. @code{m88k-bcs.c} also defines
the relocations used by the 88k format @xref{Relocations}. Then the
major portion of coff code is included (@code{coffcode.h}) which
defines the methods used to act upon the types defined in
-@code{m88k-bcs.h} and @code{internalcoff.h}.
+@code{m88k-bcs.h} and @code{internalcoff.h}.
The Intel i960 processor version of coff is implemented in
-@code{icoff.c}. This file has the same structure as
+@code{icoff.c}. This file has the same structure as
@code{m88k-bcs.c}, except that it includes @code{intel-coff.h} rather
-than @code{m88k-bcs.h}.
+than @code{m88k-bcs.h}.
@subsection Porting To A New Version of Coff
@@ -49,7 +49,7 @@ our purposes, we'll say that i386 coff is the one you select, and that
your coff flavour is called foo. Copy the @code{i386coff.c} to @code{foocoff.c},
copy @code{../include/i386coff.h} to @code{../include/foocoff.h} and
add the lines to @code{targets.c} and @code{Makefile.in} so that your
-new back end is used.
+new back end is used.
Alter the shapes of the structures in @code{../include/foocoff.h} so
that they match what you need. You will probably also have to add
@@ -105,7 +105,7 @@ avenue to disaster disappear.
The simple canonical form for symbols used by BFD is not rich enough
to keep all the information available in a coff symbol table. The back
end gets around this by keeping the original symbol table around,
-"behind the sceens".
+"behind the scenes".
When a symbol table is requested (through a call to
@code{bfd_canonicalize_symtab}, a request gets through to
@@ -147,14 +147,14 @@ makes sure that the same destination target as source target is
present.
When the symbols have come from a coff file then all the debugging
-information is preserved.
+information is preserved.
Symbol tables are provided for writing to the back end in a vector of
pointers to pointers. This allows applications like the linker to
accumulate and output large symbol tables without having to do too
much byte copying.
-The symbol table is not output to a writable BFD until it is closed.
+The symbol table is not output to a writable BFD until it is closed.
The order of operations on the canonical symbol table at that point
are:
@table @code
@@ -163,7 +163,7 @@ This function runs through the provided symbol table and patches each
symbol marked as a file place holder (@code{C_FILE}) to point to the
next file place holder in the list. It also marks each @code{offset}
field in the list with the offset from the first symbol of the current
-symbol.
+symbol.
Another function of this procedure is to turn the canonical value form
of BFD into the form used by coff. Internally, BFD expects symbol
@@ -279,7 +279,7 @@ $ } coff_symbol_type;
#ifndef PUT_LNSZ_SIZE
#define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
#endif
-#ifndef GET_SCN_SCNLEN
+#ifndef GET_SCN_SCNLEN
#define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
#endif
#ifndef GET_SCN_NRELOC
@@ -288,7 +288,7 @@ $ } coff_symbol_type;
#ifndef GET_SCN_NLINNO
#define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
#endif
-#ifndef PUT_SCN_SCNLEN
+#ifndef PUT_SCN_SCNLEN
#define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
#endif
#ifndef PUT_SCN_NRELOC
@@ -302,13 +302,13 @@ $ } coff_symbol_type;
/* void warning(); */
-/*
- * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
+/*
+ * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
* incoming SEC_* flags. The inverse of this function is styp_to_sec_flags().
* NOTE: If you add to/change this routine, you should mirror the changes
* in styp_to_sec_flags().
*/
-static long
+static long
DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
CONST char * sec_name AND
flagword sec_flags)
@@ -321,16 +321,16 @@ DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
return((long)STYP_DATA);
} else if (!strcmp(sec_name, _BSS)) {
return((long)STYP_BSS);
- }
+ }
/* Try and figure out what it should be */
- if (sec_flags & SEC_CODE) styp_flags = STYP_TEXT;
- if (sec_flags & SEC_DATA) styp_flags = STYP_DATA;
- else if (sec_flags & SEC_READONLY)
+ if (sec_flags & SEC_CODE) styp_flags = STYP_TEXT;
+ if (sec_flags & SEC_DATA) styp_flags = STYP_DATA;
+ else if (sec_flags & SEC_READONLY)
#ifdef STYP_LIT /* 29k readonly text/data section */
- styp_flags = STYP_LIT;
+ styp_flags = STYP_LIT;
#else
- styp_flags = STYP_TEXT;
+ styp_flags = STYP_TEXT;
#endif /* STYP_LIT */
else if (sec_flags & SEC_LOAD) styp_flags = STYP_TEXT;
@@ -338,14 +338,14 @@ DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
return(styp_flags);
}
-/*
+/*
* Return a word with SEC_* flags set to represent the incoming
- * STYP_* flags (from scnhdr.s_flags). The inverse of this
- * function is sec_to_styp_flags().
+ * STYP_* flags (from scnhdr.s_flags). The inverse of this
+ * function is sec_to_styp_flags().
* NOTE: If you add to/change this routine, you should mirror the changes
* in sec_to_styp_flags().
*/
-static flagword
+static flagword
DEFUN(styp_to_sec_flags, (styp_flags),
long styp_flags)
{
@@ -369,7 +369,7 @@ DEFUN(styp_to_sec_flags, (styp_flags),
/* **********************************************************************
Here are all the routines for swapping the structures seen in the
-outside world into the internal forms.
+outside world into the internal forms.
*/
@@ -381,7 +381,14 @@ DEFUN(bfd_swap_reloc_in,(abfd, reloc_src, reloc_dst),
{
reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
reloc_dst->r_symndx = bfd_h_get_32(abfd, (bfd_byte *) reloc_src->r_symndx);
+
+#ifdef RS6000COFF_C
+ reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
+ reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
+#else
reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
+#endif
+
#if M88
reloc_dst->r_offset = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_offset);
#endif
@@ -441,7 +448,7 @@ DEFUN(coff_swap_filehdr_out,(abfd, in, out),
#ifndef NO_COFF_SYMBOLS
-static void
+static void
DEFUN(coff_swap_sym_in,(abfd, ext1, in1),
bfd *abfd AND
PTR ext1 AND
@@ -494,7 +501,7 @@ DEFUN(coff_swap_sym_out,(abfd, inp, extp),
}
bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
- if (sizeof(ext->e_type) == 2)
+ if (sizeof(ext->e_type) == 2)
{
bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
}
@@ -584,7 +591,7 @@ DEFUN(coff_swap_aux_out,(abfd, inp, type, class, extp),
switch (class) {
case C_FILE:
if (in->x_file.x_fname[0] == 0) {
- PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes );
+ PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
PUTWORD(abfd,
in->x_file.x_n.x_offset,
(bfd_byte *) ext->x_file.x_n.x_offset);
@@ -595,7 +602,7 @@ DEFUN(coff_swap_aux_out,(abfd, inp, type, class, extp),
#else
memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
#endif
- }
+ }
break;
case C_STAT:
#ifdef C_LEAFSTAT
@@ -685,7 +692,7 @@ DEFUN(coff_swap_lineno_out,(abfd, inp, outp),
#endif /* NO_COFF_LINENOS */
-static void
+static void
DEFUN(bfd_swap_aouthdr_in,(abfd, aouthdr_ext1, aouthdr_int1),
bfd *abfd AND
PTR aouthdr_ext1 AND
@@ -705,6 +712,20 @@ DEFUN(bfd_swap_aouthdr_in,(abfd, aouthdr_ext1, aouthdr_int1),
#ifdef I960
aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
#endif
+
+#ifdef RS6000COFF_C
+ aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
+ aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
+ aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
+ aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
+ aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
+ aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
+ aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
+ aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
+ aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
+ aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
+ aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
+#endif
}
static unsigned int
@@ -730,7 +751,7 @@ DEFUN(coff_swap_aouthdr_out,(abfd, in, out),
return sizeof(AOUTHDR);
}
-static void
+static void
DEFUN(coff_swap_scnhdr_in,(abfd, scnhdr_ext, scnhdr_int),
bfd *abfd AND
SCNHDR *scnhdr_ext AND
@@ -756,7 +777,7 @@ DEFUN(coff_swap_scnhdr_in,(abfd, scnhdr_ext, scnhdr_int),
#endif
}
-static unsigned int
+static unsigned int
DEFUN(coff_swap_scnhdr_out,(abfd, in, out),
bfd *abfd AND
PTR in AND
@@ -780,7 +801,7 @@ DEFUN(coff_swap_scnhdr_out,(abfd, in, out),
PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
#endif
-#if defined(I960)
+#if defined(I960)
PUTWORD(abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
#endif
return sizeof(SCNHDR);
@@ -821,6 +842,8 @@ DEFUN(make_a_section_from_file,(abfd, hdr),
name[sizeof (hdr->s_name)] = 0;
return_section = bfd_make_section(abfd, name);
+ if (return_section == NULL)
+ return false;
}
/* s_paddr is presumed to be = to s_vaddr */
@@ -890,20 +913,20 @@ DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
long machine;
size_t readsize; /* length of file_info */
SCNHDR *external_sections;
-
+
/* Build a play area */
if (coff_mkobject(abfd) != true)
return 0;
coff = coff_data(abfd);
-
-
+
+
external_sections = (SCNHDR *)bfd_alloc(abfd, readsize = (nscns * SCNHSZ));
-
+
if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
goto fail;
}
-
-
+
+
/* Now copy data as required; construct all asections etc */
coff->symbol_index_slew = 0;
coff->relocbase =0;
@@ -929,15 +952,15 @@ machine = 0;
machine = 0;
break;
#endif
-
-#ifdef A29K_MAGIC_BIG
+
+#ifdef A29K_MAGIC_BIG
case A29K_MAGIC_BIG:
case A29K_MAGIC_LITTLE:
arch = bfd_arch_a29k;
machine = 0;
break;
#endif
-
+
#ifdef MIPS
case MIPS_MAGIC_1:
case MIPS_MAGIC_2:
@@ -946,7 +969,7 @@ machine = 0;
machine = 0;
break;
#endif
-
+
#ifdef MC68MAGIC
case MC68MAGIC:
case M68MAGIC:
@@ -967,7 +990,7 @@ machine = 0;
case I960ROMAGIC:
case I960RWMAGIC:
arch = bfd_arch_i960;
- switch (F_I960TYPE & internal_f->f_flags)
+ switch (F_I960TYPE & internal_f->f_flags)
{
default:
case F_I960CORE:
@@ -988,17 +1011,26 @@ machine = 0;
case F_I960KA:
machine = bfd_mach_i960_ka_sa;
break;
-
}
break;
#endif
#endif
-
+
+#ifdef U802ROMAGIC
+ case U802ROMAGIC:
+ case U802WRMAGIC:
+ case U802TOCMAGIC:
+ arch = bfd_arch_rs6000;
+ machine = 6000;
+ break;
+#endif
+
+
default: /* Unreadable input file type */
arch = bfd_arch_obscure;
break;
}
-
+
bfd_default_set_arch_mach(abfd, arch, machine);
if (!(internal_f->f_flags & F_RELFLG))
abfd->flags |= HAS_RELOC;
@@ -1008,14 +1040,14 @@ machine = 0;
abfd->flags |= HAS_LINENO;
if (!(internal_f->f_flags & F_LSYMS))
abfd->flags |= HAS_LOCALS;
-
-
+
+
bfd_get_symcount(abfd) = internal_f->f_nsyms;
if (internal_f->f_nsyms)
abfd->flags |= HAS_SYMS;
-
+
coff->sym_filepos = internal_f->f_symptr;
-
+
/* These members communicate important constants about the symbol table
to GDB's symbol-reading code. These `constants' unfortunately vary
from coff implementation to implementation... */
@@ -1028,10 +1060,10 @@ machine = 0;
coff->local_auxesz = AUXESZ;
coff->local_linesz = LINESZ;
#endif
-
+
coff->symbols = (coff_symbol_type *) NULL;
bfd_get_start_address(abfd) = internal_f->f_opthdr ? internal_a->entry : 0;
-
+
return abfd->xvec;
fail:
bfd_release(abfd, coff);
@@ -1047,45 +1079,45 @@ DEFUN(coff_object_p,(abfd),
AOUTHDR opthdr;
struct internal_filehdr internal_f;
struct internal_aouthdr internal_a;
-
+
bfd_error = system_call_error;
-
+
/* figure out how much to read */
if (bfd_read((PTR) &filehdr, 1, FILHSZ, abfd) != FILHSZ)
return 0;
-
+
bfd_swap_filehdr_in(abfd, &filehdr, &internal_f);
-
+
if (BADMAG(internal_f)) {
bfd_error = wrong_format;
return 0;
}
nscns =internal_f.f_nscns;
-
+
if (internal_f.f_opthdr) {
if (bfd_read((PTR) &opthdr, 1,AOUTSZ, abfd) != AOUTSZ) {
return 0;
}
bfd_swap_aouthdr_in(abfd, (char *)&opthdr, (char *)&internal_a);
}
-
+
/* Seek past the opt hdr stuff */
bfd_seek(abfd, internal_f.f_opthdr + FILHSZ, SEEK_SET);
-
+
/* 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.
-
+
But the mips keeps extra stuff in it's opthdr, so dont check
when doing that
*/
-
+
#if defined(M88) || defined(I960)
if (internal_f.f_opthdr != 0 && AOUTSZ != internal_f.f_opthdr)
return (bfd_target *)NULL;
#endif
-
+
return coff_real_object_p(abfd, nscns, &internal_f, &internal_a);
}
@@ -1093,7 +1125,7 @@ DEFUN(coff_object_p,(abfd),
#ifndef NO_COFF_LINENOS
-static void
+static void
DEFUN(coff_count_linenumbers,(abfd),
bfd *abfd)
{
@@ -1107,8 +1139,8 @@ DEFUN(coff_count_linenumbers,(abfd),
s = s->next;
}
}
-
-
+
+
for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
asymbol *q_maybe = *p;
if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour) {
@@ -1134,7 +1166,7 @@ DEFUN(coff_count_linenumbers,(abfd),
#ifndef NO_COFF_SYMBOLS
-/*
+/*
Takes a bfd and a symbol, returns a pointer to the coff specific area
of the symbol if there is one.
*/
@@ -1143,12 +1175,12 @@ DEFUN(coff_symbol_from,(ignore_abfd, symbol),
bfd *ignore_abfd AND
asymbol *symbol)
{
- if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour)
+ if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour)
return (coff_symbol_type *)NULL;
-
+
if (symbol->the_bfd->tdata == (PTR)NULL)
return (coff_symbol_type *)NULL;
-
+
return (coff_symbol_type *) symbol;
}
@@ -1172,17 +1204,17 @@ struct internal_syment *syment)
else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
syment->n_scnum = N_UNDEF;
syment->n_value = 0;
- }
+ }
else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
syment->n_scnum = N_ABS;
syment->n_value = coff_symbol_ptr->symbol.value;
- }
+ }
else {
if (coff_symbol_ptr->symbol.section) {
- syment->n_scnum =
+ syment->n_scnum =
coff_symbol_ptr->symbol.section->output_section->index+1;
-
- syment->n_value =
+
+ syment->n_value =
coff_symbol_ptr->symbol.value +
coff_symbol_ptr->symbol.section->output_offset +
coff_symbol_ptr->symbol.section->output_section->vma;
@@ -1190,13 +1222,13 @@ struct internal_syment *syment)
else {
/* This can happen, but I don't know why yet (steve@cygnus.com) */
syment->n_scnum = N_ABS;
- syment->n_value = coff_symbol_ptr->symbol.value;
+ syment->n_value = coff_symbol_ptr->symbol.value;
}
}
}
/* run through all the symbols in the symbol table and work out what
- their indexes into the symbol table will be when output
+ their indexes into the symbol table will be when output
Coff requires that each C_FILE symbol points to the next one in the
chain, and that the last one points to the first external symbol. We
@@ -1212,14 +1244,14 @@ DEFUN(coff_renumber_symbols,(bfd_ptr),
unsigned int native_index = 0;
struct internal_syment *last_file = (struct internal_syment *)NULL;
unsigned int symbol_index;
- for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
+ for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
{
coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
if (coff_symbol_ptr && coff_symbol_ptr->native) {
combined_entry_type *s = coff_symbol_ptr->native;
int i;
- if (s->u.syment.n_sclass == C_FILE)
+ if (s->u.syment.n_sclass == C_FILE)
{
if (last_file != (struct internal_syment *)NULL) {
last_file->n_value = native_index;
@@ -1249,31 +1281,28 @@ DEFUN(coff_renumber_symbols,(bfd_ptr),
entries are changed to the entries' index in the output symbol table.
*/
-static void
+static void
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;
-
unsigned int symbol_index;
-
- for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
+ for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
{
- coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
- if (coff_symbol_ptr && coff_symbol_ptr->native ) {
+ coff_symbol_type *coff_symbol_ptr =
+ coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
+
+ if (coff_symbol_ptr && coff_symbol_ptr->native) {
int i;
combined_entry_type *s = coff_symbol_ptr->native;
-
-
-
-
for (i = 0; i < s->u.syment.n_numaux ; i++) {
combined_entry_type *a = s + i + 1;
if (a->fix_tag) {
- a->u.auxent.x_sym.x_tagndx.l = a->u.auxent.x_sym.x_tagndx.p->offset;
+ a->u.auxent.x_sym.x_tagndx.l =
+ a->u.auxent.x_sym.x_tagndx.p->offset;
}
if (a->fix_end) {
a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
@@ -1293,15 +1322,15 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
struct internal_syment *last_fcn = (struct internal_syment *)NULL;
struct internal_syment *block_stack[50];
struct internal_syment **last_block = &block_stack[0];
- boolean first_time = true;
+ boolean first_time = true;
unsigned int symbol_index;
unsigned int native_index = 0;
-
+
for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) {
coff_symbol_type *coff_symbol_ptr =
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
*/
@@ -1325,46 +1354,44 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
syment->n_scnum = N_UNDEF;
syment->n_value = 0;
- }
+ }
else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
syment->n_scnum = N_ABS;
syment->n_value = coff_symbol_ptr->symbol.value;
- }
+ }
else {
- syment->n_scnum =
+ syment->n_scnum =
coff_symbol_ptr->symbol.section->output_section->index+1;
-
- syment->n_value =
+
+ 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)
{
last_file->n_value = native_index;
}
- else if ((syment->n_sclass == C_EXT
- || syment->n_sclass == C_STAT
+ else if ((syment->n_sclass == C_EXT /* FIXME - may need C_HIDEXT */
+ || syment->n_sclass == C_STAT
#ifdef C_LEAFEXT
- || syment->n_sclass == C_LEAFEXT
+ || syment->n_sclass == C_LEAFEXT
|| syment->n_sclass == C_LEAFSTAT
#endif
)
- && last_fcn != (struct internal_syment *)NULL)
+ && 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.l = 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
+ /* Remember that we keep the native index in the offset
so patch the beginning of the struct to point to this
*/
/*if (last_
@@ -1374,17 +1401,17 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
auxent = (union internal_auxent *)(syment+1);
auxent->x_sym.x_tagndx.l = last_tagndx->_n._n_n._n_offset;
}
- else if (syment->n_sclass == C_BLOCK
- && coff_symbol_ptr->symbol.name[1] == 'e')
+ else if (syment->n_sclass == C_BLOCK
+ && coff_symbol_ptr->symbol.name[1] == 'e')
{
union internal_auxent *auxent = (union internal_auxent *)((*(--last_block))+1);
auxent->x_sym.x_fcnary.x_fcn.x_endndx.l = native_index + syment->n_numaux + 1;
}
- if (syment->n_sclass == C_EXT
- && !ISFCN(syment->n_type)
- && first_time == true
+ if (syment->n_sclass == C_EXT
+ && !ISFCN(syment->n_type)
+ && first_time == true
&& last_file != (struct internal_syment *)NULL) {
- /* This is the first external symbol seen which isn't a
+ /* 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;
first_time = false;
@@ -1393,28 +1420,28 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
if (syment->n_sclass == C_LEAFPROC &&
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
+ /* This is the definition of a leaf proc, we'll relocate the
address */
- auxent->x_bal.x_balntry =
- coff_symbol_ptr->symbol.section->output_offset +
+ auxent->x_bal.x_balntry =
+ coff_symbol_ptr->symbol.section->output_offset +
coff_symbol_ptr->symbol.section->output_section->vma +
auxent->x_bal.x_balntry ;
}
#endif
/* If this symbol needs to be tied up then remember some facts */
- if (syment->n_sclass == C_FILE)
+ if (syment->n_sclass == C_FILE)
{
last_file = syment;
}
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
+ /*
+ If this is a ref to a structure then we'll tie it up
+ now - there are never any forward refs for one
*/
if (syment->n_sclass == C_STRTAG ||
syment->n_sclass == C_ENTAG ||
@@ -1430,16 +1457,14 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
*/
union internal_auxent *auxent = (union internal_auxent *)(syment+1);
bfd *bfd_ptr = coff_symbol_ptr->symbol.the_bfd;
- struct internal_syment *base = obj_raw_syments(bfd_ptr);
+ struct internal_syment *base = obj_raw_syments(bfd_ptr);
/* auxent->x_sym.x_tagndx = base[auxent->x_sym.x_tagndx]._n._n_n._n_offset;*/
-
-
}
}
if (ISFCN(syment->n_type)) {
last_fcn = syment;
}
- if (syment->n_sclass == C_BLOCK
+ if (syment->n_sclass == C_BLOCK
&& coff_symbol_ptr->symbol.name[1] == 'b')
{
*last_block++ = syment;
@@ -1454,7 +1479,7 @@ DEFUN(coff_mangle_symbols,(bfd_ptr),
#endif
-static int string_size;
+static int string_size;
static void
DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
bfd *ignore_abfd AND
@@ -1471,11 +1496,11 @@ DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
name = (char *)symbol->name;
}
name_length = strlen(name);
-
+
if (native->u.syment.n_sclass == C_FILE) {
strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
auxent = &(native+1)->u.auxent;
-
+
#ifdef COFF_LONG_FILENAMES
if (name_length <= FILNMLEN) {
strncpy(auxent->x_file.x_fname, name, FILNMLEN);
@@ -1508,7 +1533,7 @@ DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
-static unsigned int
+static unsigned int
DEFUN(coff_write_symbol,(abfd, symbol, native, written),
bfd *abfd AND
asymbol *symbol AND
@@ -1524,7 +1549,7 @@ unsigned int written)
coff_fix_symbol_name(abfd, symbol, native);
coff_swap_sym_out(abfd, &native->u.syment, &buf);
bfd_write((PTR)& buf, 1, SYMESZ, abfd);
- for (j = 0; j != native->u.syment.n_numaux; j++)
+ for (j = 0; j != native->u.syment.n_numaux; j++)
{
AUXENT buf1;
bzero((PTR)&buf, AUXESZ);
@@ -1588,23 +1613,23 @@ DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
}
#endif
}
-
+
#ifdef HASPAD1
native->u.syment.pad1[0] = 0;
native->u.syment.pad1[0] = 0;
#endif
-
+
native->u.syment.n_type = 0;
if (symbol->flags & BSF_LOCAL)
native->u.syment.n_sclass = C_STAT;
- else
+ else
native->u.syment.n_sclass = C_EXT;
native->u.syment.n_numaux = 0;
return coff_write_symbol(abfd, symbol, native, written);
}
-static unsigned int
+static unsigned int
DEFUN(coff_write_native_symbol,(abfd, symbol, written),
bfd *abfd AND
coff_symbol_type *symbol AND
@@ -1624,8 +1649,8 @@ unsigned int written)
lineno[count].u.offset = written;
if (native->u.syment.n_numaux) {
union internal_auxent *a = &((native+1)->u.auxent);
-
- a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
+
+ a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
symbol->symbol.section->output_section->moving_line_filepos;
}
/*
@@ -1640,12 +1665,11 @@ unsigned int written)
}
symbol->symbol.section->output_section->moving_line_filepos +=
count * LINESZ;
-
}
return coff_write_symbol(abfd, &( symbol->symbol), native,written);
}
-static void
+static void
DEFUN(coff_write_symbols,(abfd),
bfd *abfd)
{
@@ -1656,20 +1680,18 @@ DEFUN(coff_write_symbols,(abfd),
asymbol **p;
string_size = 0;
-
-
+
+
/* Seek to the right place */
bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
-
+
/* Output all the symbols we have */
-
+
written = 0;
- for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
+ for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
{
asymbol *symbol = *p;
coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
-
-
if (c_symbol == (coff_symbol_type *) NULL ||
c_symbol->native == (combined_entry_type *)NULL)
@@ -1686,15 +1708,17 @@ DEFUN(coff_write_symbols,(abfd),
bfd_get_symcount(abfd) = written;
/* Now write out strings */
-
- if (string_size != 0)
+
+ if (string_size != 0)
{
unsigned int size = string_size + 4;
bfd_byte buffer[4];
bfd_h_put_32(abfd, size, buffer);
bfd_write((PTR) buffer, 1, sizeof(buffer), abfd);
- for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
+ for (p = abfd->outsymbols, i = 0;
+ i < limit;
+ i++, p++)
{
asymbol *q = *p;
size_t name_length = strlen(q->name);
@@ -1703,7 +1727,7 @@ DEFUN(coff_write_symbols,(abfd),
maxlen = ((c_symbol != NULL && c_symbol->native != NULL) &&
(c_symbol->native->u.syment.n_sclass == C_FILE)) ?
FILNMLEN : SYMNMLEN;
-
+
if (name_length > maxlen) {
bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
}
@@ -1714,11 +1738,11 @@ DEFUN(coff_write_symbols,(abfd),
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);
-
+
}
}
@@ -1735,7 +1759,7 @@ Then the @code{internal_reloc} is swapped into the shape of an
@code{external_reloc} and written out to disk.
*/
-static void
+static void
DEFUN(coff_write_relocs,(abfd),
bfd *abfd)
{
@@ -1743,7 +1767,7 @@ DEFUN(coff_write_relocs,(abfd),
for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
unsigned int i;
struct external_reloc dst;
-
+
arelent **p = s->orelocation;
bfd_seek(abfd, s->rel_filepos, SEEK_SET);
for (i = 0; i < s->reloc_count; i++) {
@@ -1769,7 +1793,7 @@ DEFUN(coff_write_relocs,(abfd),
#ifndef NO_COFF_LINENOS
-static void
+static void
DEFUN(coff_write_linenumbers,(abfd),
bfd *abfd)
{
@@ -1833,7 +1857,7 @@ bfd *abfd;
#ifndef NO_COFF_SYMBOLS
-static void
+static void
DEFUN(coff_print_symbol,(ignore_abfd, filep, symbol, how),
bfd *ignore_abfd AND
PTR filep AND
@@ -1854,15 +1878,15 @@ DEFUN(coff_print_symbol,(ignore_abfd, filep, symbol, how),
CONST char *section_name = symbol->section == (asection *) NULL ?
"*abs" : symbol->section->name;
bfd_print_symbol_vandf((PTR) file, symbol);
-
+
fprintf(file, " %-5s %s %s %s",
section_name,
coffsymbol(symbol)->native ? "n" : "g",
coffsymbol(symbol)->lineno ? "l" : " ",
symbol->name);
}
-
-
+
+
break;
}
}
@@ -1879,11 +1903,11 @@ DEFUN(coff_set_flags,(abfd, magicp, flagsp),
unsigned short *flagsp)
{
switch (bfd_get_arch(abfd)) {
-
+
#ifdef I960ROMAGIC
-
+
case bfd_arch_i960:
-
+
{
unsigned flags;
*magicp = I960ROMAGIC;
@@ -1934,7 +1958,7 @@ DEFUN(coff_set_flags,(abfd, magicp, flagsp),
*magicp = MC68MAGIC;
return true;
#endif
-
+
#ifdef MC88MAGIC
case bfd_arch_m88k:
*magicp = MC88OMAGIC;
@@ -1951,13 +1975,19 @@ DEFUN(coff_set_flags,(abfd, magicp, flagsp),
return true;
break;
#endif
-
+
+#ifdef U802TOCMAGIC
+ case bfd_arch_rs6000:
+ *magicp = U802TOCMAGIC;
+ break;
+#endif
+
default: /* Unknown architecture */
/* return false; -- fall through to "return false" below, to avoid
- "statement never reached" errors on the one below. */
+ "statement never reached" errors on the one below. */
break;
}
-
+
return false;
}
@@ -1981,7 +2011,7 @@ DEFUN(coff_set_arch_mach,(abfd, arch, machine),
/* Calculate the file position for each section. */
-static void
+static void
DEFUN(coff_compute_section_file_positions,(abfd),
bfd *abfd)
{
@@ -1996,22 +2026,22 @@ DEFUN(coff_compute_section_file_positions,(abfd),
}
if (abfd->flags & EXEC_P)
sofar += AOUTSZ;
-
-
+
+
sofar += abfd->section_count * SCNHSZ;
- for (current = abfd->sections;
+ for (current = abfd->sections;
current != (asection *)NULL;
current = current->next) {
/* Only deal with sections which have contents */
if (!(current->flags & SEC_HAS_CONTENTS))
continue;
-
- /* Align the sections in the file to the same boundary on
+
+ /* Align the sections in the file to the same boundary on
which they are aligned in virtual memory. I960 doesn't
do this (FIXME) so we can stay in sync with Intel. 960
doesn't yet page from files... */
#ifndef I960
- {
+ {
/* Whatever the alignment, make sure that the sections are big
enough to cover the gap */
bfd_vma old_sofar= sofar;
@@ -2023,7 +2053,7 @@ DEFUN(coff_compute_section_file_positions,(abfd),
offset must match the low order bits of the virtual address.
"Low order" is apparently implementation defined. Add code
here to round sofar up to match the virtual address. */
-
+
current->filepos = sofar;
sofar += current->size;
}
@@ -2052,18 +2082,18 @@ DEFUN(coff_write_object_contents,(abfd),
asection *text_sec = NULL;
asection *data_sec = NULL;
asection *bss_sec = NULL;
-
+
struct internal_filehdr internal_f;
struct internal_aouthdr internal_a;
-
-
+
+
bfd_error = system_call_error;
-
-
+
+
if(abfd->output_has_begun == false) {
coff_compute_section_file_positions(abfd);
}
-
+
if (abfd->sections != (asection *)NULL) {
scn_base = abfd->sections->filepos;
}
@@ -2073,17 +2103,17 @@ DEFUN(coff_write_object_contents,(abfd),
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 */
-
+
#ifndef NO_COFF_LINENOS
coff_count_linenumbers(abfd);
#endif
data_base = scn_base;
-
+
/* 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;
#ifndef NO_COFF_LINENOS
@@ -2091,10 +2121,10 @@ DEFUN(coff_write_object_contents,(abfd),
#endif
data_base += SCNHSZ;
}
-
+
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) {
@@ -2115,20 +2145,20 @@ DEFUN(coff_write_object_contents,(abfd),
current->rel_filepos = 0;
}
}
-
+
/* Write section headers to the file. */
-
+
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;
#endif
unsigned int pad = 0;
-
+
for (current = abfd->sections; current != NULL; current = current->next) {
struct internal_scnhdr section;
strncpy(&(section.s_name[0]), current->name, 8);
@@ -2142,7 +2172,6 @@ DEFUN(coff_write_object_contents,(abfd),
if (current->size - pad == 0 ||
(current->flags & SEC_LOAD) == 0) {
section.s_scnptr = 0;
-
}
else {
section.s_scnptr = current->filepos;
@@ -2155,7 +2184,7 @@ DEFUN(coff_write_object_contents,(abfd),
hasrelocs = true;
if (current->lineno_count != 0)
haslinno = true;
-
+
section.s_flags = sec_to_styp_flags(current->name,current->flags);
if (!strcmp(current->name, _TEXT)) {
@@ -2164,8 +2193,8 @@ DEFUN(coff_write_object_contents,(abfd),
data_sec = current;
} else if (!strcmp(current->name, _BSS)) {
bss_sec = current;
- }
-
+ }
+
#ifdef I960
section.s_align = (current->alignment_power
? 1 << current->alignment_power
@@ -2241,12 +2270,12 @@ DEFUN(coff_write_object_contents,(abfd),
internal_f.f_flags |= flags;
/* ...and the "opt"hdr... */
-#ifdef A29K
+#ifdef A29K
# ifdef ULTRA3 /* NYU's machine */
/* FIXME: This is a bogus check. I really want to see if there
* is a .shbss or a .shdata section, if so then set the magic
* number to indicate a shared data executable.
- */
+ */
if (internal_f.f_nscns >= 7)
internal_a.magic = SHMAGIC; /* Shared magic */
else
@@ -2255,7 +2284,7 @@ DEFUN(coff_write_object_contents,(abfd),
#define __A_MAGIC_SET__
#endif /* A29K */
#ifdef I960
- internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
+ internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
#define __A_MAGIC_SET__
#endif /* I960 */
#if M88
@@ -2265,9 +2294,16 @@ DEFUN(coff_write_object_contents,(abfd),
#if M68 || I386 || MIPS
#define __A_MAGIC_SET__
- /* Never was anything here for the 68k */
+ /* Never was anything here for the 68k */
#endif /* M88 */
+#if RS6000COFF_C
+#define __A_MAGIC_SET__
+ internal_a.magic = (abfd->flags & D_PAGED)? RS6K_AOUTHDR_ZMAGIC:
+ (abfd->flags & WP_TEXT)? RS6K_AOUTHDR_NMAGIC:
+ RS6K_AOUTHDR_OMAGIC;
+#endif
+
#ifndef __A_MAGIC_SET__
# include "Your aouthdr magic number is not being set!"
#else
@@ -2395,7 +2431,7 @@ coff_close_and_cleanup(abfd)
}
#endif
-static PTR
+static PTR
buy_and_read(abfd, where, seek_direction, size)
bfd *abfd;
file_ptr where;
@@ -2425,20 +2461,18 @@ bfd *abfd)
char string_table_size_buffer[4];
unsigned int string_table_size;
char *string_table;
- /*
- At this point we should be "seek"'d to the end of the
- symbols === the symbol table size.
- */
-
+
+ /* At this point we should be "seek"'d to the end of the
+ symbols === the symbol table size. */
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_get_32(abfd, (bfd_byte *) string_table_size_buffer);
-
+
if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
bfd_error = no_memory;
return (NULL);
@@ -2446,10 +2480,50 @@ bfd *abfd)
if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
bfd_error = system_call_error;
return (NULL);
- }
+ }
return string_table;
}
+/* Allocate space for the ".debug" section, and read it.
+ We did not read the debug section until now, because
+ we didn't want to go to the trouble until someone needed it. */
+
+static char *
+DEFUN(build_debug_section,(abfd),
+ bfd *abfd)
+{
+ char *debug_section;
+ long position;
+
+ asection *sect = bfd_get_section_by_name (abfd, ".debug");
+
+ if (!sect) {
+ bfd_error = no_debug_section;
+ return NULL;
+ }
+
+ debug_section = (PTR) bfd_alloc (abfd, bfd_section_size (abfd, sect));
+ if (debug_section == NULL) {
+ bfd_error = no_memory;
+ return NULL;
+ }
+
+ /* Seek to the beginning of the `.debug' section and read it.
+ Save the current position first; it is needed by our caller.
+ Then read debug section and reset the file pointer. */
+
+ position = bfd_tell (abfd);
+ bfd_seek (abfd, sect->filepos, SEEK_SET);
+ if (bfd_read (debug_section, bfd_section_size (abfd, sect), 1, abfd)
+ != bfd_section_size (abfd, sect)) {
+ bfd_error = system_call_error;
+ return NULL;
+ }
+ bfd_seek (abfd, position, SEEK_SET);
+ return debug_section;
+}
+
+
/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
\0-terminated, but will not exceed 'maxlen' characters. The copy *will*
be \0-terminated. */
@@ -2461,13 +2535,13 @@ DEFUN(copy_name,(abfd, name, maxlen),
{
int len;
char *newname;
-
+
for (len = 0; len < maxlen; ++len) {
if (name[len] == '\0') {
break;
}
}
-
+
if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
bfd_error = no_memory;
return (NULL);
@@ -2478,19 +2552,19 @@ DEFUN(copy_name,(abfd, name, maxlen),
}
-/*
-read a symbol table into freshly mallocated memory, swap it, and knit the
-symbol names into a normalized form. By normalized here I mean that all
-symbols have an n_offset pointer that points to a NULL terminated string.
-Oh, and the first symbol MUST be a C_FILE. If there wasn't one there
-before, put one there.
-*/
+/* Read a symbol table into freshly bfd_allocated memory, swap it, and
+ knit the symbol names into a normalized form. By normalized here I
+ mean that all symbols have an n_offset pointer that points to a null-
+ terminated string. */
+
+#ifndef SYMNAME_IN_DEBUG
+#define SYMNAME_IN_DEBUG(x) 0
+#endif
static combined_entry_type *
DEFUN(get_normalized_symtab,(abfd),
bfd *abfd)
{
-
combined_entry_type *internal;
combined_entry_type *internal_ptr;
combined_entry_type *internal_end;
@@ -2498,9 +2572,9 @@ bfd *abfd)
SYMENT *raw_src;
SYMENT *raw_end;
char *string_table = NULL;
+ char *debug_section = NULL;
unsigned long size;
-
unsigned int raw_size;
if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
return obj_raw_syments(abfd);
@@ -2529,39 +2603,46 @@ bfd *abfd)
*/
/* Swap all the raw entries */
- for (raw_src = raw, internal_ptr = internal; raw_src < raw_end; raw_src++, internal_ptr++) {
+ for (raw_src = raw, internal_ptr = internal;
+ raw_src < raw_end;
+ raw_src++, internal_ptr++) {
+
unsigned int i;
- coff_swap_sym_in(abfd, (char *)raw_src, (char *)&internal_ptr->u.syment);
+ coff_swap_sym_in(abfd, (char *)raw_src, (char *)&internal_ptr->u.syment);
internal_ptr->fix_tag = 0;
internal_ptr->fix_end = 0;
- for (i = internal_ptr->u.syment.n_numaux; i; --i, raw_src++, internal_ptr++) {
+ for (i = internal_ptr->u.syment.n_numaux;
+ i;
+ --i, raw_src++, internal_ptr++) {
+
(internal_ptr+1)->fix_tag = 0;
(internal_ptr+1)->fix_end = 0;
- coff_swap_aux_in(abfd, (char *)(raw_src +1), internal_ptr->u.syment.n_type,
- internal_ptr->u.syment.n_sclass, & (internal_ptr+1)->u.auxent);
+ coff_swap_aux_in(abfd, (char *)(raw_src +1),
+ internal_ptr->u.syment.n_type,
+ internal_ptr->u.syment.n_sclass,
+ &(internal_ptr+1)->u.auxent);
- coff_pointerize_aux(abfd,
+ coff_pointerize_aux(abfd,
internal,
internal_ptr->u.syment.n_type,
internal_ptr->u.syment.n_sclass,
internal_ptr +1);
}
}
-
+
/* Free all the raw stuff */
bfd_release(abfd, raw);
for (internal_ptr = internal; internal_ptr < internal_end;
- internal_ptr ++)
+ internal_ptr ++)
{
if (internal_ptr->u.syment.n_sclass == C_FILE) {
/* make a file symbol point to the name in the auxent, since
the text ".file" is redundant */
if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
- /* the filename is a long one, point into the string table
- */
+ /* the filename is a long one, point into the string table */
if (string_table == NULL) {
string_table = build_string_table(abfd);
}
@@ -2573,28 +2654,24 @@ bfd *abfd)
else {
/* ordinary short filename, put into memory anyway */
internal_ptr->u.syment._n._n_n._n_offset = (int)
- copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname, FILNMLEN);
-
+ copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
+ FILNMLEN);
}
}
else {
if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
- /*
- This is a "short" name. Make it long.
- */
+ /* This is a "short" name. Make it long. */
unsigned long i = 0;
char *newstring = NULL;
- /*
- find the length of this string without walking into memory
- that isn't ours.
- */
-
+
+ /* find the length of this string without walking into memory
+ that isn't ours. */
for (i = 0; i < 8; ++i) {
if (internal_ptr->u.syment._n._n_name[i] == '\0') {
break;
} /* if end of string */
} /* possible lengths of this string. */
-
+
if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
bfd_error = no_memory;
return (NULL);
@@ -2603,23 +2680,29 @@ bfd *abfd)
strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
internal_ptr->u.syment._n._n_n._n_offset = (int) newstring;
internal_ptr->u.syment._n._n_n._n_zeroes = 0;
-
}
- else {
- /* This is a long name already. Just point it at the string in memory. */
+ else if (!SYMNAME_IN_DEBUG(&internal_ptr->u.syment)) {
+ /* Long name already. Point symbol at the string in the table. */
if (string_table == NULL) {
string_table = build_string_table(abfd);
}
- internal_ptr->u.syment._n._n_n._n_offset =
- (int) (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
- }
+ internal_ptr->u.syment._n._n_n._n_offset = (int)
+ (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
+ }
+ else {
+ /* Long name in debug section. Very similar. */
+ if (debug_section == NULL) {
+ debug_section = build_debug_section(abfd);
+ }
+ internal_ptr->u.syment._n._n_n._n_offset = (int)
+ (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
+ }
}
internal_ptr += internal_ptr->u.syment.n_numaux;
- }
+ }
obj_raw_syments(abfd) = internal;
- obj_string_table(abfd) = string_table;
-
+
return (internal);
} /* get_normalized_symtab() */
@@ -2668,9 +2751,9 @@ asection *asect;
{
LINENO *native_lineno;
alent *lineno_cache;
-
+
BFD_ASSERT(asect->lineno == (alent *) NULL);
-
+
native_lineno = (LINENO *) buy_and_read(abfd,
asect->line_filepos,
SEEK_SET,
@@ -2681,16 +2764,16 @@ asection *asect;
if (lineno_cache == NULL) {
bfd_error = no_memory;
return false;
- } else {
+ } else {
unsigned int counter = 0;
alent *cache_ptr = lineno_cache;
LINENO *src = native_lineno;
-
+
while (counter < asect->lineno_count) {
struct internal_lineno dst;
coff_swap_lineno_in(abfd, src, &dst);
cache_ptr->line_number = dst.l_lnno;
-
+
if (cache_ptr->line_number == 0) {
coff_symbol_type *sym =
(coff_symbol_type *) (dst.l_addr.l_symndx
@@ -2703,13 +2786,13 @@ asection *asect;
cache_ptr->u.offset = dst.l_addr.l_paddr
- bfd_section_vma(abfd, asect);
} /* If no linenumber expect a symbol index */
-
+
cache_ptr++;
src++;
counter++;
}
cache_ptr->line_number = 0;
-
+
}
asect->lineno = lineno_cache;
/* FIXME, free native_lineno here, or use alloca or something. */
@@ -2727,23 +2810,22 @@ DEFUN(coff_slurp_symbol_table,(abfd),
combined_entry_type *native_symbols;
coff_symbol_type *cached_area;
unsigned int *table_ptr;
-
+
unsigned int number_of_symbols = 0;
if (obj_symbols(abfd))
return true;
bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
-
+
/* Read in the symbol table */
if ((native_symbols = get_normalized_symtab(abfd)) == NULL) {
return (false);
} /* on error */
-
-
+
/* Allocate enough room for all the symbols in cached form */
cached_area =
(coff_symbol_type *)
bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(coff_symbol_type)));
-
+
if (cached_area == NULL) {
bfd_error = no_memory;
return false;
@@ -2751,7 +2833,7 @@ DEFUN(coff_slurp_symbol_table,(abfd),
table_ptr =
(unsigned int *)
bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(unsigned int)));
-
+
if (table_ptr == NULL) {
bfd_error = no_memory;
return false;
@@ -2763,7 +2845,7 @@ DEFUN(coff_slurp_symbol_table,(abfd),
combined_entry_type *src = native_symbols + this_index;
table_ptr[this_index] = number_of_symbols;
dst->symbol.the_bfd = abfd;
-
+
dst->symbol.name = (char *)(src->u.syment._n._n_n._n_offset);
/*
We use the native name field to point to the cached field
@@ -2780,10 +2862,13 @@ DEFUN(coff_slurp_symbol_table,(abfd),
dst->symbol.flags |= BSF_NOT_AT_END;
#endif
/* Fall through to next case */
-
+
#endif
-
+
case C_EXT:
+#ifdef RS6000COFF_C
+ case C_HIDEXT:
+#endif
if ((src->u.syment.n_scnum) == 0) {
if ((src->u.syment.n_value) == 0) {
dst->symbol.flags = BSF_UNDEFINED;
@@ -2814,8 +2899,8 @@ DEFUN(coff_slurp_symbol_table,(abfd),
dst->symbol.flags |= BSF_NOT_AT_END;
}
}
-
break;
+
case C_STAT: /* static */
#ifdef I960
case C_LEAFSTAT: /* static leaf procedure */
@@ -2835,7 +2920,7 @@ DEFUN(coff_slurp_symbol_table,(abfd),
else
dst->symbol.value = (src->u.syment.n_value) ;
break;
-
+
case C_MOS: /* member of structure */
case C_EOS: /* end of structure */
#ifdef NOTDEF /* C_AUTOARG has the same value */
@@ -2849,7 +2934,6 @@ DEFUN(coff_slurp_symbol_table,(abfd),
case C_AUTOARG: /* 960-specific storage class */
#endif
case C_TPDEF: /* type definition */
-
case C_ARG:
case C_AUTO: /* automatic variable */
case C_FIELD: /* bit field */
@@ -2857,17 +2941,31 @@ DEFUN(coff_slurp_symbol_table,(abfd),
case C_MOE: /* member of enumeration */
case C_MOU: /* member of union */
case C_UNTAG: /* union tag */
-
dst->symbol.flags = BSF_DEBUGGING;
dst->symbol.value = (src->u.syment.n_value);
break;
-
+
case C_FILE: /* file name */
case C_STRTAG: /* structure tag */
+#ifdef RS6000COFF_C
+ case C_BINCL: /* beginning of include file */
+ case C_EINCL: /* ending of include file */
+ case C_GSYM:
+ case C_LSYM:
+ case C_PSYM:
+ case C_RSYM:
+ case C_RPSYM:
+ case C_STSYM:
+ case C_DECL:
+ case C_ENTRY:
+ case C_FUN:
+ case C_BSTAT:
+ case C_ESTAT:
+#endif
dst->symbol.flags = BSF_DEBUGGING;
dst->symbol.value = (src->u.syment.n_value);
-
break;
+
case C_BLOCK: /* ".bb" or ".eb" */
case C_FCN: /* ".bf" or ".ef" */
case C_EFCN: /* physical end of function */
@@ -2876,8 +2974,8 @@ DEFUN(coff_slurp_symbol_table,(abfd),
Base the value as an index from the base of the section
*/
dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
-
break;
+
case C_NULL:
case C_EXTDEF: /* external definition */
case C_ULABEL: /* undefined label */
@@ -2885,22 +2983,20 @@ DEFUN(coff_slurp_symbol_table,(abfd),
case C_LINE: /* line # reformatted as symbol table entry */
case C_ALIAS: /* duplicate tag */
case C_HIDDEN: /* ext symbol in dmert public lib */
-
default:
-
- fprintf(stderr,"Unrecognized storage class %d\n",
+
+ fprintf(stderr,"Unrecognized storage class %d\n",
src->u.syment.n_sclass);
abort();
dst->symbol.flags = BSF_DEBUGGING;
dst->symbol.value = (src->u.syment.n_value);
-
break;
}
-
+
BFD_ASSERT(dst->symbol.flags != 0);
-
+
dst->native = src;
-
+
dst->symbol.udata = 0;
dst->lineno = (alent *) NULL;
this_index += (src->u.syment.n_numaux) + 1;
@@ -2908,10 +3004,10 @@ DEFUN(coff_slurp_symbol_table,(abfd),
number_of_symbols++;
} /* walk the native symtab */
} /* bfdize the native symtab */
-
+
obj_symbols(abfd) = cached_area;
obj_raw_syments(abfd) = native_symbols;
-
+
bfd_get_symcount(abfd) = number_of_symbols;
obj_convert(abfd) = table_ptr;
/* Slurp the line tables for each section too */
@@ -2932,7 +3028,7 @@ bfd *abfd;
{
if (!coff_slurp_symbol_table(abfd))
return 0;
-
+
return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
}
@@ -2947,7 +3043,7 @@ asymbol **alocation;
coff_symbol_type **location = (coff_symbol_type **) (alocation);
if (!coff_slurp_symbol_table(abfd))
return 0;
-
+
for (symbase = obj_symbols(abfd); counter++ < bfd_get_symcount(abfd);)
*(location++) = symbase++;
*location++ = 0;
@@ -2971,11 +3067,11 @@ sec_ptr asect;
/*doc*
@subsubsection Reading Relocations
Coff relocations are easily transformed into the internal BFD form
-(@code{arelent}).
+(@code{arelent}).
Reading a coff relocation table is done in the following stages:
@itemize @bullet
-@item
+@item
The entire coff relocation table is read into memory.
@item
Each relocation is processed in turn, first it is swapped from the
@@ -3019,7 +3115,7 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
asect->reloc_count));
reloc_cache = (arelent *)
bfd_alloc(abfd, (size_t) (asect->reloc_count * sizeof(arelent)));
-
+
if (reloc_cache == NULL) {
bfd_error = no_memory;
return false;
@@ -3034,10 +3130,10 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
struct internal_reloc dst;
asymbol *ptr;
bfd_swap_reloc_in(abfd, src, &dst);
-
+
dst.r_symndx += obj_symbol_slew(abfd);
cache_ptr->sym_ptr_ptr = symbols + obj_convert(abfd)[dst.r_symndx];
-#ifdef A29K
+#ifdef A29K
/* AMD has two relocation entries for the 'consth' instruction.
* The first is R_IHIHALF (part 1), the second is R_IHCONST
* (part 2). The second entry's r_symndx does not contain
@@ -3055,13 +3151,12 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
relocated as if their sections started at 0. But the offsets
refering to the symbols in the raw data have not been
modified, so we have to have a negative addend to compensate.
-
- Note that symbols which used to be common must be left alone
- */
-
- if (ptr && ptr->the_bfd == abfd
- && ptr->section != (asection *) NULL
- && ((ptr->flags & BSF_OLD_COMMON)== 0))
+
+ Note that symbols which used to be common must be left alone */
+
+ if (ptr && ptr->the_bfd == abfd
+ && ptr->section != (asection *) NULL
+ && ((ptr->flags & BSF_OLD_COMMON)== 0))
{
#ifndef M88
cache_ptr->addend = -(ptr->section->vma + ptr->value);
@@ -3073,12 +3168,12 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
else {
cache_ptr->addend = 0;
}
-
+
cache_ptr->address -= asect->vma;
-
+
cache_ptr->section = (asection *) NULL;
-#ifdef A29K
+#ifdef A29K
if (dst.r_type == R_IHCONST) {
/* Add in the value which was stored in the symbol index */
/* See above comment */
@@ -3106,11 +3201,9 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
BFD_ASSERT(0);
}
#endif
-
}
-
}
-
+
asect->relocation = reloc_cache;
return true;
}
@@ -3131,12 +3224,12 @@ asymbol **symbols;
tblptr = section->relocation;
if (!tblptr)
return 0;
-
+
for (; count++ < section->reloc_count;)
*relptr++ = tblptr++;
-
+
*relptr = 0;
-
+
return section->reloc_count;
}
@@ -3169,28 +3262,28 @@ DEFUN(coff_find_nearest_line,(abfd,
static bfd_vma cache_offset;
static unsigned int cache_i;
static alent *cache_l;
-
+
unsigned int i = 0;
coff_data_type *cof = coff_data(abfd);
/* Run through the raw syments if available */
combined_entry_type *p;
alent *l;
unsigned int line_base = 0;
-
-
+
+
*filename_ptr = 0;
*functionname_ptr = 0;
*line_ptr = 0;
-
+
/* Don't try and find line numbers in a non coff file */
if (abfd->xvec->flavour != bfd_target_coff_flavour)
return false;
-
+
if (cof == NULL)
return false;
p = cof->raw_syments;
-
+
for (i = 0; i < cof->raw_syment_count; i++) {
if (p->u.syment.n_sclass == C_FILE) {
/* File name has been moved into symbol */
@@ -3215,7 +3308,7 @@ DEFUN(coff_find_nearest_line,(abfd,
i = 0;
l = section->lineno;
}
-
+
for (; i < section->lineno_count; i++) {
if (l->line_number == 0) {
/* Get the symbol this line number points at */
@@ -3243,7 +3336,7 @@ DEFUN(coff_find_nearest_line,(abfd,
}
l++;
}
-
+
cache_abfd = abfd;
cache_section = section;
cache_offset = offset;
@@ -3265,20 +3358,20 @@ bfd *abfd;
#endif /* NO_COFF_SYMBOLS */
-static int
+static int
DEFUN(coff_sizeof_headers,(abfd, reloc),
bfd *abfd AND
boolean reloc)
{
size_t size;
-
+
if (reloc == false) {
size = FILHSZ + AOUTSZ;
}
else {
size = FILHSZ;
}
-
+
size += abfd->section_count * SCNHSZ;
return size;
}
@@ -3298,4 +3391,3 @@ DEFUN(coff_sizeof_headers,(abfd, reloc),
#define coff_bfd_debug_info_start bfd_void
#define coff_bfd_debug_info_end bfd_void
#define coff_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
-