1 /* Support for Intel 960 COFF and Motorola 88k BCS COFF (and maybe others)
2 Copyright (C) 1990-1991 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 @section coff backends
24 BFD supports a number of different flavours of coff format. The major
25 difference between formats are the sizes and alignments of fields in
26 structures on disk, and the occasional extra field.
28 Coff in all its varieties is implimented with a few common files and a
29 number of implementation specific files. For example, The 88k bcs coff
30 format is implemented in the file @code{m88k-bcs.c}. This file
31 @code{#include}s @code{m88k-bcs.h} which defines the external
32 structure of the coff format for the 88k, and @code{internalcoff.h}
33 which defines the internal structure. @code{m88k-bcs.c} also defines
34 the relocations used by the 88k format @xref{Relocations}. Then the
35 major portion of coff code is included (@code{coffcode.h}) which
36 defines the methods used to act upon the types defined in
37 @code{m88k-bcs.h} and @code{internalcoff.h}.
39 The Intel i960 processor version of coff is implemented in
40 @code{icoff.c}. This file has the same structure as
41 @code{m88k-bcs.c}, except that it includes @code{intel-coff.h} rather
42 than @code{m88k-bcs.h}.
44 @subsection Porting To A New Version of Coff
46 The recommended method is to select from the existing implimentations
47 the version of coff which is most like the one you want to use, for
48 our purposes, we'll say that i386 coff is the one you select, and that
49 your coff flavour is called foo. Copy the @code{i386coff.c} to @code{foocoff.c},
50 copy @code{../include/i386coff.h} to @code{../include/foocoff.h} and
51 add the lines to @code{targets.c} and @code{Makefile.in} so that your
54 Alter the shapes of the structures in @code{../include/foocoff.h} so
55 that they match what you need. You will probably also have to add
56 @code{#ifdef}s to the code in @code{internalcoff.h} and
57 @code{coffcode.h} if your version of coff is too wild.
59 You can verify that your new BFD backend works quite simply by
60 building @code{objdump} from the @code{binutils} directory, and
61 making sure that its version of what's going on at your host systems
62 idea (assuming it has the pretty standard coff dump utility (usually
63 called @code{att-dump} or just @code{dump})) are the same.
65 Then clean up your code, and send what you've done to Cygnus. Then your stuff
66 will be in the next release, and you won't have to keep integrating
69 @subsection How The Coff Backend Works
71 @subsubsection Bit Twiddling
72 Each flavour of coff supported in BFD has its own header file
73 descibing the external layout of the structures. There is also an
74 internal description of the coff layout (in @code{internalcoff.h})
75 file (@code{}). A major function of the coff backend is swapping the
76 bytes and twiddling the bits to translate the external form of the
77 structures into the normal internal form. This is all performed in the
78 @code{bfd_swap}_@i{thing}_@i{direction} routines. Some elements are
79 different sizes between different versions of coff, it is the duty of
80 the coff version specific include file to override the definitions of
81 various packing routines in @code{coffcode.h}. Eg the size of line
82 number entry in coff is sometimes 16 bits, and sometimes 32 bits.
83 @code{#define}ing @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will
84 select the correct one. No doubt, some day someone will find a version
85 of coff which has a varying field size not catered for at the moment.
86 To port BFD, that person will have to add more @code{#defines}.
88 Three of the bit twiddling routines are exported to @code{gdb};
89 @code{coff_swap_aux_in}, @code{coff_swap_sym_in} and
90 @code{coff_swap_linno_in}. @code{GDB} reads the symbol table on its
91 own, but uses BFD to fix things up.
93 More of the bit twiddlers are exported for @code{gas};
94 @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
95 @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
96 @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
97 @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track of all
98 the symbol table and reloc drudgery itself, thereby saving the
99 internal BFD overhead, but uses BFD to swap things on the way out,
100 making cross ports much safer. This also allows BFD (and thus the
101 linker) to use the same header files as @code{gas}, which makes one
102 avenue to disaster disappear.
104 @subsubsection Symbol Reading
105 The simple canonical form for symbols used by BFD is not rich enough
106 to keep all the information available in a coff symbol table. The back
107 end gets around this by keeping the original symbol table around,
110 When a symbol table is requested (through a call to
111 @code{bfd_canonicalize_symtab}, a request gets through to
112 @code{get_normalized_symtab}. This reads the symbol table from the
113 coff file and swaps all the structures inside into the internal form.
114 It also fixes up all the pointers in the table (represented in the file
115 by offsets from the first symbol in the table) into physical pointers
116 to elements in the new internal table. This involves some work since
117 the meanings of fields changes depending upon context; a field that is a
118 pointer to another structure in the symbol table at one moment may be
119 the size in bytes of a structure in the next.
121 Another pass is made over the table. All symbols which mark file names
122 (@code{C_FILE} symbols) are modified so that the internal string
123 points to the value in the auxent (the real filename) rather than the
124 normal text associated with the symbol (@code{".file"}).
126 At this time the symbol names are moved around. Coff stores all
127 symbols less than nine characters long physically within the symbol
128 table, longer strings are kept at the end of the file in the string
129 table. This pass moves all strings into memory, and replaces them with
130 pointers to the strings.
132 The symbol table is massaged once again, this time to create the
133 canonical table used by the BFD application. Each symbol is inspected
134 in turn, and a decision made (using the @code{sclass} field) about the
135 various flags to set in the @code{asymbol} @xref{Symbols}. The
136 generated canonical table shares strings with the hidden internal
139 Any linenumbers are read from the coff file too, and attached to the
140 symbols which own the functions the linenumbers belong to.
142 @subsubsection Symbol Writing
143 Writing a symbol to a coff file which didn't come from a coff file
144 will lose any debugging information. The @code{asymbol} structure
145 remembers the BFD from which was born, and on output the back end
146 makes sure that the same destination target as source target is
149 When the symbols have come from a coff file then all the debugging
150 information is preserved.
152 Symbol tables are provided for writing to the back end in a vector of
153 pointers to pointers. This allows applications like the linker to
154 accumulate and output large symbol tables without having to do too
157 The symbol table is not output to a writable BFD until it is closed.
158 The order of operations on the canonical symbol table at that point
161 @item coff_renumber_symbols
162 This function runs through the provided symbol table and patches each
163 symbol marked as a file place holder (@code{C_FILE}) to point to the
164 next file place holder in the list. It also marks each @code{offset}
165 field in the list with the offset from the first symbol of the current
168 Another function of this procedure is to turn the canonical value form
169 of BFD into the form used by coff. Internally, BFD expects symbol
170 values to be offsets from a section base; so a symbol physically at
171 0x120, but in a section starting at 0x100, would have the value 0x20.
172 Coff expects symbols to contain their final value, so symbols have
173 their values changed at this point to reflect their sum with their
174 owning section. Note that this transformation uses the
175 @code{output_section} field of the @code{asymbol}'s @code{asection}
177 @item coff_mangle_symbols
178 This routine runs though the provided symbol table and uses the
179 offsets generated by the previous pass and the pointers generated when
180 the symbol table was read in to create the structured hierachy
181 required by coff. It changes each pointer to a symbol to an index into
182 the symbol table of the symbol being referenced.
183 @item coff_write_symbols
184 This routine runs through the symbol table and patches up the symbols
185 from their internal form into the coff way, calls the bit twiddlers
186 and writes out the tabel to the file.
192 The hidden information for an asymbol is:
196 $ typedef struct coff_ptr_struct
199 Remembers the offset from the first symbol in the file for this
200 symbol. Generated by @code{coff_renumber_symbols}.
202 $ unsigned int offset;
204 Should the tag field of this symbol be renumbered.
205 Created by @code{coff_pointerize_aux}.
209 Should the endidx field of this symbol be renumbered.
210 Created by @code{coff_pointerize_aux}.
214 The container for the symbol structure as read and translated from the file.
217 $ union internal_auxent auxent;
218 $ struct internal_syment syment;
220 $ } combined_entry_type;
225 Each canonical asymbol really looks like this:
229 $ typedef struct coff_symbol_struct
232 The actual symbol which the rest of BFD works with
236 A pointer to the hidden information for this symbol
238 $ combined_entry_type *native;
240 A pointer to the linenumber information for this symbol
242 $ struct lineno_cache_entry *lineno;
243 $ } coff_symbol_type;
250 /* Most of this hacked by Steve Chamberlain, steve@cygnus.com */
253 #define PUTWORD bfd_h_put_32
254 #define PUTHALF bfd_h_put_16
256 #ifndef GET_FCN_LNNOPTR
257 #define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
260 #ifndef GET_FCN_ENDNDX
261 #define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
264 #ifndef PUT_FCN_LNNOPTR
265 #define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
267 #ifndef PUT_FCN_ENDNDX
268 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
270 #ifndef GET_LNSZ_LNNO
271 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
273 #ifndef GET_LNSZ_SIZE
274 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
276 #ifndef PUT_LNSZ_LNNO
277 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
279 #ifndef PUT_LNSZ_SIZE
280 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
282 #ifndef GET_SCN_SCNLEN
283 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
285 #ifndef GET_SCN_NRELOC
286 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
288 #ifndef GET_SCN_NLINNO
289 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
291 #ifndef PUT_SCN_SCNLEN
292 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
294 #ifndef PUT_SCN_NRELOC
295 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
297 #ifndef PUT_SCN_NLINNO
298 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
303 /* void warning(); */
306 * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
307 * incoming SEC_* flags. The inverse of this function is styp_to_sec_flags().
308 * NOTE: If you add to/change this routine, you should mirror the changes
309 * in styp_to_sec_flags().
312 DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
313 CONST char * sec_name AND
318 if (!strcmp(sec_name, _TEXT)) {
319 return((long)STYP_TEXT);
320 } else if (!strcmp(sec_name, _DATA)) {
321 return((long)STYP_DATA);
322 } else if (!strcmp(sec_name, _BSS)) {
323 return((long)STYP_BSS);
326 /* Try and figure out what it should be */
327 if (sec_flags & SEC_CODE) styp_flags = STYP_TEXT;
328 if (sec_flags & SEC_DATA) styp_flags = STYP_DATA;
329 else if (sec_flags & SEC_READONLY)
330 #ifdef STYP_LIT /* 29k readonly text/data section */
331 styp_flags = STYP_LIT;
333 styp_flags = STYP_TEXT;
334 #endif /* STYP_LIT */
335 else if (sec_flags & SEC_LOAD) styp_flags = STYP_TEXT;
337 if (styp_flags == 0) styp_flags = STYP_BSS;
342 * Return a word with SEC_* flags set to represent the incoming
343 * STYP_* flags (from scnhdr.s_flags). The inverse of this
344 * function is sec_to_styp_flags().
345 * NOTE: If you add to/change this routine, you should mirror the changes
346 * in sec_to_styp_flags().
349 DEFUN(styp_to_sec_flags, (styp_flags),
352 flagword sec_flags=0;
354 if ((styp_flags & STYP_TEXT) || (styp_flags & STYP_DATA))
355 sec_flags = (SEC_LOAD | SEC_ALLOC);
356 else if (styp_flags & STYP_BSS)
357 sec_flags = SEC_ALLOC;
359 #ifdef STYP_LIT /* A29k readonly text/data section type */
360 if ((styp_flags & STYP_LIT) == STYP_LIT)
361 sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
362 #endif /* STYP_LIT */
367 #define get_index(symbol) ((int) (symbol)->value)
368 #define set_index(symbol, idx) ((symbol)->value = (idx))
370 /* **********************************************************************
371 Here are all the routines for swapping the structures seen in the
372 outside world into the internal forms.
377 DEFUN(bfd_swap_reloc_in,(abfd, reloc_src, reloc_dst),
380 struct internal_reloc *reloc_dst)
382 reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
383 reloc_dst->r_symndx = bfd_h_get_32(abfd, (bfd_byte *) reloc_src->r_symndx);
386 reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
387 reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
389 reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
393 reloc_dst->r_offset = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_offset);
399 DEFUN(coff_swap_reloc_out,(abfd, src, dst),
404 struct internal_reloc *reloc_src = (struct internal_reloc *)src;
405 struct external_reloc *reloc_dst = (struct external_reloc *)dst;
406 bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
407 bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
408 bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *) reloc_dst->r_type);
410 bfd_h_put_16(abfd, reloc_src->r_offset, (bfd_byte *) reloc_dst->r_offset);
412 return sizeof(struct external_reloc);
416 DEFUN(bfd_swap_filehdr_in,(abfd, filehdr_src, filehdr_dst),
418 FILHDR *filehdr_src AND
419 struct internal_filehdr *filehdr_dst)
421 filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
422 filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
423 filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
424 filehdr_dst->f_symptr = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_symptr);
425 filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
426 filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
427 filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
431 DEFUN(coff_swap_filehdr_out,(abfd, in, out),
436 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
437 FILHDR *filehdr_out = (FILHDR *)out;
438 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
439 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
440 bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
441 bfd_h_put_32(abfd, filehdr_in->f_symptr, (bfd_byte *) filehdr_out->f_symptr);
442 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
443 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
444 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
445 return sizeof(FILHDR);
449 #ifndef NO_COFF_SYMBOLS
452 DEFUN(coff_swap_sym_in,(abfd, ext1, in1),
457 SYMENT *ext = (SYMENT *)ext1;
458 struct internal_syment *in = (struct internal_syment *)in1;
460 if( ext->e.e_name[0] == 0) {
461 in->_n._n_n._n_zeroes = 0;
462 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
465 #if SYMNMLEN != E_SYMNMLEN
466 -> Error, we need to cope with truncating or extending SYMNMLEN!;
468 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
471 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
472 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
473 if (sizeof(ext->e_type) == 2){
474 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
477 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
479 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
480 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
484 DEFUN(coff_swap_sym_out,(abfd, inp, extp),
489 struct internal_syment *in = (struct internal_syment *)inp;
490 SYMENT *ext =(SYMENT *)extp;
491 if(in->_n._n_name[0] == 0) {
492 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
493 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
496 #if SYMNMLEN != E_SYMNMLEN
497 -> Error, we need to cope with truncating or extending SYMNMLEN!;
499 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
502 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
503 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
504 if (sizeof(ext->e_type) == 2)
506 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
510 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
512 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
513 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
514 return sizeof(SYMENT);
518 DEFUN(coff_swap_aux_in,(abfd, ext1, type, class, in1),
525 AUXENT *ext = (AUXENT *)ext1;
526 union internal_auxent *in = (union internal_auxent *)in1;
529 if (ext->x_file.x_fname[0] == 0) {
530 in->x_file.x_n.x_zeroes = 0;
531 in->x_file.x_n.x_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
533 #if FILNMLEN != E_FILNMLEN
534 -> Error, we need to cope with truncating or extending FILNMLEN!;
536 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
546 if (type == T_NULL) {
547 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
548 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
549 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
553 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
555 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
558 if (ISARY(type) || class == C_BLOCK) {
559 #if DIMNUM != E_DIMNUM
560 -> Error, we need to cope with truncating or extending DIMNUM!;
562 in->x_sym.x_fcnary.x_ary.x_dimen[0] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
563 in->x_sym.x_fcnary.x_ary.x_dimen[1] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
564 in->x_sym.x_fcnary.x_ary.x_dimen[2] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
565 in->x_sym.x_fcnary.x_ary.x_dimen[3] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
568 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR(abfd, ext);
569 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX(abfd, ext);
572 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
575 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
576 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
582 DEFUN(coff_swap_aux_out,(abfd, inp, type, class, extp),
589 union internal_auxent *in = (union internal_auxent *)inp;
590 AUXENT *ext = (AUXENT *)extp;
593 if (in->x_file.x_fname[0] == 0) {
594 PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
596 in->x_file.x_n.x_offset,
597 (bfd_byte *) ext->x_file.x_n.x_offset);
600 #if FILNMLEN != E_FILNMLEN
601 -> Error, we need to cope with truncating or extending FILNMLEN!;
603 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
612 if (type == T_NULL) {
614 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
615 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
616 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
620 PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
622 PUTWORD(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
626 PUTWORD(abfd, in->x_sym.x_misc.x_fsize, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
627 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
628 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
632 if (ISARY(type) || class == C_BLOCK) {
633 #if DIMNUM != E_DIMNUM
634 -> Error, we need to cope with truncating or extending DIMNUM!;
636 bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
637 bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
638 bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
639 bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
642 PUT_LNSZ_LNNO(abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
643 PUT_LNSZ_SIZE(abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
645 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
646 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
651 return sizeof(AUXENT);
654 #endif /* NO_COFF_SYMBOLS */
656 #ifndef NO_COFF_LINENOS
659 DEFUN(coff_swap_lineno_in,(abfd, ext1, in1),
664 LINENO *ext = (LINENO *)ext1;
665 struct internal_lineno *in = (struct internal_lineno *)in1;
667 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
669 in->l_lnno = bfd_h_get_32(abfd, (bfd_byte *) ext->l_lnno);
671 in->l_lnno = bfd_h_get_16(abfd, (bfd_byte *) ext->l_lnno);
676 DEFUN(coff_swap_lineno_out,(abfd, inp, outp),
681 struct internal_lineno *in = (struct internal_lineno *)inp;
682 struct external_lineno *ext = (struct external_lineno *)outp;
683 PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *) ext->l_addr.l_symndx);
685 PUTWORD(abfd, in->l_lnno, (bfd_byte *) ext->l_lnno);
687 PUTHALF(abfd, in->l_lnno, (bfd_byte *) ext->l_lnno);
689 return sizeof(struct external_lineno);
692 #endif /* NO_COFF_LINENOS */
696 DEFUN(bfd_swap_aouthdr_in,(abfd, aouthdr_ext1, aouthdr_int1),
701 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
702 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
704 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
705 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
706 aouthdr_int->tsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tsize);
707 aouthdr_int->dsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->dsize);
708 aouthdr_int->bsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->bsize);
709 aouthdr_int->entry = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->entry);
710 aouthdr_int->text_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->text_start);
711 aouthdr_int->data_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->data_start);
713 aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
717 aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
718 aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
719 aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
720 aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
721 aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
722 aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
723 aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
724 aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
725 aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
726 aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
727 aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
732 DEFUN(coff_swap_aouthdr_out,(abfd, in, out),
737 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
738 AOUTHDR *aouthdr_out = (AOUTHDR *)out;
739 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
740 bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
741 bfd_h_put_32(abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
742 bfd_h_put_32(abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
743 bfd_h_put_32(abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
744 bfd_h_put_32(abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
745 bfd_h_put_32(abfd, aouthdr_in->text_start,
746 (bfd_byte *) aouthdr_out->text_start);
747 bfd_h_put_32(abfd, aouthdr_in->data_start, (bfd_byte *) aouthdr_out->data_start);
749 bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
751 return sizeof(AOUTHDR);
755 DEFUN(coff_swap_scnhdr_in,(abfd, scnhdr_ext, scnhdr_int),
757 SCNHDR *scnhdr_ext AND
758 struct internal_scnhdr *scnhdr_int)
760 memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
761 scnhdr_int->s_vaddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
762 scnhdr_int->s_paddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_paddr);
763 scnhdr_int->s_size = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_size);
764 scnhdr_int->s_scnptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
765 scnhdr_int->s_relptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_relptr);
766 scnhdr_int->s_lnnoptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
767 scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
769 scnhdr_int->s_nreloc = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
770 scnhdr_int->s_nlnno = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
772 scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
773 scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
776 scnhdr_int->s_align = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_align);
781 DEFUN(coff_swap_scnhdr_out,(abfd, in, out),
786 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
787 SCNHDR *scnhdr_ext = (SCNHDR *)out;
788 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
789 PUTWORD(abfd, scnhdr_int->s_vaddr, (bfd_byte *) scnhdr_ext->s_vaddr);
790 PUTWORD(abfd, scnhdr_int->s_paddr, (bfd_byte *) scnhdr_ext->s_paddr);
791 PUTWORD(abfd, scnhdr_int->s_size, (bfd_byte *) scnhdr_ext->s_size);
792 PUTWORD(abfd, scnhdr_int->s_scnptr, (bfd_byte *) scnhdr_ext->s_scnptr);
793 PUTWORD(abfd, scnhdr_int->s_relptr, (bfd_byte *) scnhdr_ext->s_relptr);
794 PUTWORD(abfd, scnhdr_int->s_lnnoptr, (bfd_byte *) scnhdr_ext->s_lnnoptr);
795 PUTWORD(abfd, scnhdr_int->s_flags, (bfd_byte *) scnhdr_ext->s_flags);
797 PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
798 PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
800 PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
801 PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
805 PUTWORD(abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
807 return sizeof(SCNHDR);
812 initialize a section structure with information peculiar to this
813 particular implementation of coff
817 DEFUN(coff_new_section_hook,(abfd_ignore, section_ignore),
819 asection *section_ignore)
821 section_ignore->alignment_power = abfd_ignore->xvec->align_power_min;
825 /* Take a section header read from a coff file (in HOST byte order),
826 and make a BFD "section" out of it. */
828 DEFUN(make_a_section_from_file,(abfd, hdr),
830 struct internal_scnhdr *hdr)
832 asection *return_section;
835 /* Assorted wastage to null-terminate the name, thanks AT&T! */
836 char *name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
838 bfd_error = no_memory;
841 strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
842 name[sizeof (hdr->s_name)] = 0;
844 return_section = bfd_make_section(abfd, name);
845 if (return_section == NULL)
849 /* s_paddr is presumed to be = to s_vaddr */
850 #define assign(to, from) return_section->to = hdr->from
851 assign(vma, s_vaddr);
852 /* assign (vma, s_vaddr); */
853 assign(size, s_size);
854 assign(filepos, s_scnptr);
855 assign(rel_filepos, s_relptr);
856 assign(reloc_count, s_nreloc);
859 /* FIXME, use a temp var rather than alignment_power */
860 assign(alignment_power, s_align);
863 for (i = 0; i < 32; i++) {
864 if ((1 << i) >= (int) (return_section->alignment_power)) {
865 return_section->alignment_power = i;
872 assign(line_filepos, s_lnnoptr);
874 return_section->linesize = hdr->s_nlnno * sizeof (struct lineno);
877 return_section->lineno_count = hdr->s_nlnno;
878 return_section->userdata = NULL;
879 return_section->next = (asection *) NULL;
880 return_section->flags = styp_to_sec_flags(hdr->s_flags);
883 if (hdr->s_nreloc != 0)
884 return_section->flags |= SEC_RELOC;
885 /* FIXME: should this check 'hdr->s_size > 0' */
886 if (hdr->s_scnptr != 0)
887 return_section->flags |= SEC_HAS_CONTENTS;
891 DEFUN(coff_mkobject,(abfd),
894 set_tdata (abfd, bfd_zalloc (abfd,sizeof(coff_data_type)));
895 if (coff_data(abfd) == 0) {
896 bfd_error = no_memory;
899 coff_data(abfd)->relocbase = 0;
905 DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
908 struct internal_filehdr *internal_f AND
909 struct internal_aouthdr *internal_a)
911 coff_data_type *coff;
912 enum bfd_architecture arch;
914 size_t readsize; /* length of file_info */
915 SCNHDR *external_sections;
917 /* Build a play area */
918 if (coff_mkobject(abfd) != true)
920 coff = coff_data(abfd);
923 external_sections = (SCNHDR *)bfd_alloc(abfd, readsize = (nscns * SCNHSZ));
925 if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
930 /* Now copy data as required; construct all asections etc */
931 coff->symbol_index_slew = 0;
933 coff->raw_syment_count = 0;
934 coff->raw_linenos = 0;
935 coff->raw_syments = 0;
936 coff->sym_filepos =0;
937 coff->flags = internal_f->f_flags;
940 for (i = 0; i < nscns; i++) {
941 struct internal_scnhdr tmp;
942 coff_swap_scnhdr_in(abfd, external_sections + i, &tmp);
943 make_a_section_from_file(abfd,&tmp);
946 /* Determine the machine architecture and type. */
948 switch (internal_f->f_magic) {
951 arch = bfd_arch_i386;
956 #ifdef A29K_MAGIC_BIG
958 case A29K_MAGIC_LITTLE:
959 arch = bfd_arch_a29k;
968 arch = bfd_arch_mips;
976 arch = bfd_arch_m68k;
984 arch = bfd_arch_m88k;
992 arch = bfd_arch_i960;
993 switch (F_I960TYPE & internal_f->f_flags)
997 machine = bfd_mach_i960_core;
1000 machine = bfd_mach_i960_kb_sb;
1003 machine = bfd_mach_i960_mc;
1006 machine = bfd_mach_i960_xa;
1009 machine = bfd_mach_i960_ca;
1012 machine = bfd_mach_i960_ka_sa;
1023 arch = bfd_arch_rs6000;
1029 default: /* Unreadable input file type */
1030 arch = bfd_arch_obscure;
1034 bfd_default_set_arch_mach(abfd, arch, machine);
1035 if (!(internal_f->f_flags & F_RELFLG))
1036 abfd->flags |= HAS_RELOC;
1037 if ((internal_f->f_flags & F_EXEC))
1038 abfd->flags |= EXEC_P;
1039 if (!(internal_f->f_flags & F_LNNO))
1040 abfd->flags |= HAS_LINENO;
1041 if (!(internal_f->f_flags & F_LSYMS))
1042 abfd->flags |= HAS_LOCALS;
1045 bfd_get_symcount(abfd) = internal_f->f_nsyms;
1046 if (internal_f->f_nsyms)
1047 abfd->flags |= HAS_SYMS;
1049 coff->sym_filepos = internal_f->f_symptr;
1051 /* These members communicate important constants about the symbol table
1052 to GDB's symbol-reading code. These `constants' unfortunately vary
1053 from coff implementation to implementation... */
1054 #ifndef NO_COFF_SYMBOLS
1055 coff->local_n_btmask = N_BTMASK;
1056 coff->local_n_btshft = N_BTSHFT;
1057 coff->local_n_tmask = N_TMASK;
1058 coff->local_n_tshift = N_TSHIFT;
1059 coff->local_symesz = SYMESZ;
1060 coff->local_auxesz = AUXESZ;
1061 coff->local_linesz = LINESZ;
1064 coff->symbols = (coff_symbol_type *) NULL;
1065 bfd_get_start_address(abfd) = internal_f->f_opthdr ? internal_a->entry : 0;
1069 bfd_release(abfd, coff);
1070 return (bfd_target *)NULL;
1074 DEFUN(coff_object_p,(abfd),
1080 struct internal_filehdr internal_f;
1081 struct internal_aouthdr internal_a;
1083 bfd_error = system_call_error;
1085 /* figure out how much to read */
1086 if (bfd_read((PTR) &filehdr, 1, FILHSZ, abfd) != FILHSZ)
1089 bfd_swap_filehdr_in(abfd, &filehdr, &internal_f);
1091 if (BADMAG(internal_f)) {
1092 bfd_error = wrong_format;
1095 nscns =internal_f.f_nscns;
1097 if (internal_f.f_opthdr) {
1098 if (bfd_read((PTR) &opthdr, 1,AOUTSZ, abfd) != AOUTSZ) {
1101 bfd_swap_aouthdr_in(abfd, (char *)&opthdr, (char *)&internal_a);
1104 /* Seek past the opt hdr stuff */
1105 bfd_seek(abfd, internal_f.f_opthdr + FILHSZ, SEEK_SET);
1107 /* if the optional header is NULL or not the correct size then
1108 quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1109 and Intel 960 readwrite headers (I960WRMAGIC) is that the
1110 optional header is of a different size.
1112 But the mips keeps extra stuff in it's opthdr, so dont check
1116 #if defined(M88) || defined(I960)
1117 if (internal_f.f_opthdr != 0 && AOUTSZ != internal_f.f_opthdr)
1118 return (bfd_target *)NULL;
1121 return coff_real_object_p(abfd, nscns, &internal_f, &internal_a);
1126 #ifndef NO_COFF_LINENOS
1129 DEFUN(coff_count_linenumbers,(abfd),
1132 unsigned int limit = bfd_get_symcount(abfd);
1136 asection *s = abfd->sections->output_section;
1138 BFD_ASSERT(s->lineno_count == 0);
1144 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
1145 asymbol *q_maybe = *p;
1146 if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour) {
1147 coff_symbol_type *q = coffsymbol(q_maybe);
1150 This symbol has a linenumber, increment the owning
1151 section's linenumber count
1153 alent *l = q->lineno;
1154 q->symbol.section->output_section->lineno_count++;
1156 while (l->line_number) {
1157 q->symbol.section->output_section->lineno_count++;
1165 #endif /* NO_COFF_LINENOS */
1167 #ifndef NO_COFF_SYMBOLS
1170 Takes a bfd and a symbol, returns a pointer to the coff specific area
1171 of the symbol if there is one.
1173 static coff_symbol_type *
1174 DEFUN(coff_symbol_from,(ignore_abfd, symbol),
1175 bfd *ignore_abfd AND
1178 if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour)
1179 return (coff_symbol_type *)NULL;
1181 if (symbol->the_bfd->tdata == (PTR)NULL)
1182 return (coff_symbol_type *)NULL;
1184 return (coff_symbol_type *) symbol;
1190 DEFUN(fixup_symbol_value,(coff_symbol_ptr, syment),
1191 coff_symbol_type *coff_symbol_ptr AND
1192 struct internal_syment *syment)
1195 /* Normalize the symbol flags */
1196 if (coff_symbol_ptr->symbol.flags & BSF_FORT_COMM) {
1197 /* a common symbol is undefined with a value */
1198 syment->n_scnum = N_UNDEF;
1199 syment->n_value = coff_symbol_ptr->symbol.value;
1201 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
1202 syment->n_value = coff_symbol_ptr->symbol.value;
1204 else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
1205 syment->n_scnum = N_UNDEF;
1206 syment->n_value = 0;
1208 else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
1209 syment->n_scnum = N_ABS;
1210 syment->n_value = coff_symbol_ptr->symbol.value;
1213 if (coff_symbol_ptr->symbol.section) {
1215 coff_symbol_ptr->symbol.section->output_section->index+1;
1218 coff_symbol_ptr->symbol.value +
1219 coff_symbol_ptr->symbol.section->output_offset +
1220 coff_symbol_ptr->symbol.section->output_section->vma;
1223 /* This can happen, but I don't know why yet (steve@cygnus.com) */
1224 syment->n_scnum = N_ABS;
1225 syment->n_value = coff_symbol_ptr->symbol.value;
1230 /* run through all the symbols in the symbol table and work out what
1231 their indexes into the symbol table will be when output
1233 Coff requires that each C_FILE symbol points to the next one in the
1234 chain, and that the last one points to the first external symbol. We
1239 DEFUN(coff_renumber_symbols,(bfd_ptr),
1242 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
1243 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
1244 unsigned int native_index = 0;
1245 struct internal_syment *last_file = (struct internal_syment *)NULL;
1246 unsigned int symbol_index;
1247 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
1249 coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
1250 if (coff_symbol_ptr && coff_symbol_ptr->native) {
1251 combined_entry_type *s = coff_symbol_ptr->native;
1254 if (s->u.syment.n_sclass == C_FILE)
1256 if (last_file != (struct internal_syment *)NULL) {
1257 last_file->n_value = native_index;
1259 last_file = &(s->u.syment);
1263 /* Modify the symbol values according to their section and
1266 fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
1268 for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
1269 s[i].offset = native_index ++;
1280 Run thorough the symbol table again, and fix it so that all pointers to
1281 entries are changed to the entries' index in the output symbol table.
1285 DEFUN(coff_mangle_symbols,(bfd_ptr),
1288 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
1289 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
1290 unsigned int symbol_index;
1292 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
1294 coff_symbol_type *coff_symbol_ptr =
1295 coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
1297 if (coff_symbol_ptr && coff_symbol_ptr->native) {
1299 combined_entry_type *s = coff_symbol_ptr->native;
1301 for (i = 0; i < s->u.syment.n_numaux ; i++) {
1302 combined_entry_type *a = s + i + 1;
1304 a->u.auxent.x_sym.x_tagndx.l =
1305 a->u.auxent.x_sym.x_tagndx.p->offset;
1308 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
1309 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
1318 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
1319 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
1320 struct internal_syment *last_tagndx = (struct internal_syment *)NULL;
1321 struct internal_syment *last_file = (struct internal_syment *)NULL;
1322 struct internal_syment *last_fcn = (struct internal_syment *)NULL;
1323 struct internal_syment *block_stack[50];
1324 struct internal_syment **last_block = &block_stack[0];
1325 boolean first_time = true;
1326 unsigned int symbol_index;
1327 unsigned int native_index = 0;
1329 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) {
1330 coff_symbol_type *coff_symbol_ptr =
1331 coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
1332 if (coff_symbol_ptr == (coff_symbol_type *)NULL) {
1334 This symbol has no coff information in it, it will take up
1335 only one slot in the output symbol table
1340 struct internal_syment *syment = coff_symbol_ptr->native;
1341 if (syment == (struct internal_syment *)NULL) {
1345 /* Normalize the symbol flags */
1346 if (coff_symbol_ptr->symbol.flags & BSF_FORT_COMM) {
1347 /* a common symbol is undefined with a value */
1348 syment->n_scnum = N_UNDEF;
1349 syment->n_value = coff_symbol_ptr->symbol.value;
1351 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
1352 syment->n_value = coff_symbol_ptr->symbol.value;
1354 else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
1355 syment->n_scnum = N_UNDEF;
1356 syment->n_value = 0;
1358 else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
1359 syment->n_scnum = N_ABS;
1360 syment->n_value = coff_symbol_ptr->symbol.value;
1364 coff_symbol_ptr->symbol.section->output_section->index+1;
1367 coff_symbol_ptr->symbol.value +
1368 coff_symbol_ptr->symbol.section->output_offset +
1369 coff_symbol_ptr->symbol.section->output_section->vma;
1372 /* If this symbol ties up something then do it */
1374 if (syment->n_sclass == C_FILE && last_file != (struct internal_syment *)NULL)
1376 last_file->n_value = native_index;
1378 else if ((syment->n_sclass == C_EXT /* FIXME - may need C_HIDEXT */
1379 || syment->n_sclass == C_STAT
1381 || syment->n_sclass == C_LEAFEXT
1382 || syment->n_sclass == C_LEAFSTAT
1385 && last_fcn != (struct internal_syment *)NULL)
1387 union internal_auxent *auxent = (union internal_auxent *)(last_fcn+1);
1388 auxent->x_sym.x_fcnary.x_fcn.x_endndx.l = native_index;
1389 last_fcn = (struct internal_syment *)NULL;
1391 else if (syment->n_sclass == C_EOS && last_tagndx != (struct internal_syment*)NULL)
1393 union internal_auxent *auxent = (union internal_auxent *)(last_tagndx+1);
1394 /* Remember that we keep the native index in the offset
1395 so patch the beginning of the struct to point to this
1398 auxent->x_sym.x_tagndx = last_tagndx->_n._n_n._n_offset;*/
1399 auxent->x_sym.x_fcnary.x_fcn.x_endndx.l = syment->n_numaux + 1 + native_index;
1400 /* Now point the eos to the structure */
1401 auxent = (union internal_auxent *)(syment+1);
1402 auxent->x_sym.x_tagndx.l = last_tagndx->_n._n_n._n_offset;
1404 else if (syment->n_sclass == C_BLOCK
1405 && coff_symbol_ptr->symbol.name[1] == 'e')
1407 union internal_auxent *auxent = (union internal_auxent *)((*(--last_block))+1);
1408 auxent->x_sym.x_fcnary.x_fcn.x_endndx.l = native_index + syment->n_numaux + 1;
1410 if (syment->n_sclass == C_EXT
1411 && !ISFCN(syment->n_type)
1412 && first_time == true
1413 && last_file != (struct internal_syment *)NULL) {
1414 /* This is the first external symbol seen which isn't a
1415 function place it in the last .file entry */
1416 last_file->n_value = native_index;
1420 if (syment->n_sclass == C_LEAFPROC &&
1421 syment->n_numaux == 2) {
1422 union internal_auxent *auxent = (union internal_auxent *)(syment+2);
1423 /* This is the definition of a leaf proc, we'll relocate the
1425 auxent->x_bal.x_balntry =
1426 coff_symbol_ptr->symbol.section->output_offset +
1427 coff_symbol_ptr->symbol.section->output_section->vma +
1428 auxent->x_bal.x_balntry ;
1431 /* If this symbol needs to be tied up then remember some facts */
1432 if (syment->n_sclass == C_FILE)
1436 if (syment->n_numaux != 0) {
1438 If this symbol would like to point to something in the
1439 future then remember where it is
1441 if (uses_x_sym_x_tagndx_p(bfd_ptr, syment)) {
1443 If this is a ref to a structure then we'll tie it up
1444 now - there are never any forward refs for one
1446 if (syment->n_sclass == C_STRTAG ||
1447 syment->n_sclass == C_ENTAG ||
1448 syment->n_sclass == C_UNTAG) {
1449 last_tagndx = syment;
1453 This is a ref to a structure - the structure must
1454 have been defined within the same file, and previous
1455 to this point, so we can deduce the new tagndx
1458 union internal_auxent *auxent = (union internal_auxent *)(syment+1);
1459 bfd *bfd_ptr = coff_symbol_ptr->symbol.the_bfd;
1460 struct internal_syment *base = obj_raw_syments(bfd_ptr);
1461 /* auxent->x_sym.x_tagndx = base[auxent->x_sym.x_tagndx]._n._n_n._n_offset;*/
1464 if (ISFCN(syment->n_type)) {
1467 if (syment->n_sclass == C_BLOCK
1468 && coff_symbol_ptr->symbol.name[1] == 'b')
1470 *last_block++ = syment;
1473 syment->_n._n_n._n_offset = native_index;
1474 native_index = native_index + 1 + syment->n_numaux;
1482 static int string_size;
1484 DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
1485 bfd *ignore_abfd AND
1487 combined_entry_type *native)
1489 unsigned int name_length;
1490 union internal_auxent *auxent;
1491 char * name = ( char *)(symbol->name);
1493 if (name == (char *) NULL) {
1494 /* coff symbols always have names, so we'll make one up */
1495 symbol->name = "strange";
1496 name = (char *)symbol->name;
1498 name_length = strlen(name);
1500 if (native->u.syment.n_sclass == C_FILE) {
1501 strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
1502 auxent = &(native+1)->u.auxent;
1504 #ifdef COFF_LONG_FILENAMES
1505 if (name_length <= FILNMLEN) {
1506 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
1509 auxent->x_file.x_n.x_offset = string_size + 4;
1510 auxent->x_file.x_n.x_zeroes = 0;
1511 string_size += name_length + 1;
1514 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
1515 if (name_length > FILNMLEN) {
1516 name[FILNMLEN] = '\0';
1521 { /* NOT A C_FILE SYMBOL */
1522 if (name_length <= SYMNMLEN) {
1523 /* This name will fit into the symbol neatly */
1524 strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
1527 native->u.syment._n._n_n._n_offset = string_size + 4;
1528 native->u.syment._n._n_n._n_zeroes = 0;
1529 string_size += name_length + 1;
1537 DEFUN(coff_write_symbol,(abfd, symbol, native, written),
1540 combined_entry_type *native AND
1541 unsigned int written)
1543 unsigned int numaux = native->u.syment.n_numaux;
1544 int type = native->u.syment.n_type;
1545 int class = native->u.syment.n_sclass;
1549 coff_fix_symbol_name(abfd, symbol, native);
1550 coff_swap_sym_out(abfd, &native->u.syment, &buf);
1551 bfd_write((PTR)& buf, 1, SYMESZ, abfd);
1552 for (j = 0; j != native->u.syment.n_numaux; j++)
1555 bzero((PTR)&buf, AUXESZ);
1556 coff_swap_aux_out(abfd,
1557 &( (native + j + 1)->u.auxent), type, class, &buf1);
1558 bfd_write((PTR) (&buf1), 1, AUXESZ, abfd);
1561 Reuse somewhere in the symbol to keep the index
1563 set_index(symbol, written);
1564 return written + 1 + numaux;
1569 DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
1572 unsigned int written)
1575 This symbol has been created by the loader, or come from a non
1576 coff format. It has no native element to inherit, make our
1579 combined_entry_type *native;
1580 combined_entry_type dummy;
1582 native->u.syment.n_type = T_NULL;
1584 native->u.syment.n_flags = 0;
1586 if (symbol->flags & BSF_ABSOLUTE) {
1587 native->u.syment.n_scnum = N_ABS;
1588 native->u.syment.n_value = symbol->value;
1590 else if (symbol->flags & (BSF_UNDEFINED | BSF_FORT_COMM)) {
1591 native->u.syment.n_scnum = N_UNDEF;
1592 native->u.syment.n_value = symbol->value;
1594 else if (symbol->flags & BSF_DEBUGGING) {
1596 remove name so it doesn't take up any space
1601 native->u.syment.n_scnum = symbol->section->output_section->index +
1603 native->u.syment.n_value = symbol->value +
1604 symbol->section->output_section->vma +
1605 symbol->section->output_offset;
1607 /* Copy the any flags from the the file hdr into the symbol */
1609 coff_symbol_type *c = coff_symbol_from(abfd, symbol);
1610 if (c != (coff_symbol_type *)NULL) {
1611 native->u.syment.n_flags = c->symbol.the_bfd->flags;
1618 native->u.syment.pad1[0] = 0;
1619 native->u.syment.pad1[0] = 0;
1622 native->u.syment.n_type = 0;
1623 if (symbol->flags & BSF_LOCAL)
1624 native->u.syment.n_sclass = C_STAT;
1626 native->u.syment.n_sclass = C_EXT;
1627 native->u.syment.n_numaux = 0;
1629 return coff_write_symbol(abfd, symbol, native, written);
1633 DEFUN(coff_write_native_symbol,(abfd, symbol, written),
1635 coff_symbol_type *symbol AND
1636 unsigned int written)
1639 Does this symbol have an ascociated line number - if so then
1640 make it remember this symbol index. Also tag the auxent of
1641 this symbol to point to the right place in the lineno table
1643 combined_entry_type *native = symbol->native;
1645 alent *lineno = symbol->lineno;
1648 unsigned int count = 0;
1649 lineno[count].u.offset = written;
1650 if (native->u.syment.n_numaux) {
1651 union internal_auxent *a = &((native+1)->u.auxent);
1653 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1654 symbol->symbol.section->output_section->moving_line_filepos;
1657 And count and relocate all other linenumbers
1660 while (lineno[count].line_number) {
1661 lineno[count].u.offset +=
1662 symbol->symbol.section->output_section->vma +
1663 symbol->symbol.section->output_offset;
1666 symbol->symbol.section->output_section->moving_line_filepos +=
1669 return coff_write_symbol(abfd, &( symbol->symbol), native,written);
1673 DEFUN(coff_write_symbols,(abfd),
1677 unsigned int limit = bfd_get_symcount(abfd);
1678 unsigned int written = 0;
1685 /* Seek to the right place */
1686 bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
1688 /* Output all the symbols we have */
1691 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1693 asymbol *symbol = *p;
1694 coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
1696 if (c_symbol == (coff_symbol_type *) NULL ||
1697 c_symbol->native == (combined_entry_type *)NULL)
1699 written = coff_write_alien_symbol(abfd, symbol, written);
1703 written = coff_write_native_symbol(abfd, c_symbol, written);
1708 bfd_get_symcount(abfd) = written;
1710 /* Now write out strings */
1712 if (string_size != 0)
1714 unsigned int size = string_size + 4;
1717 bfd_h_put_32(abfd, size, buffer);
1718 bfd_write((PTR) buffer, 1, sizeof(buffer), abfd);
1719 for (p = abfd->outsymbols, i = 0;
1724 size_t name_length = strlen(q->name);
1726 coff_symbol_type* c_symbol = coff_symbol_from(abfd, q);
1727 maxlen = ((c_symbol != NULL && c_symbol->native != NULL) &&
1728 (c_symbol->native->u.syment.n_sclass == C_FILE)) ?
1729 FILNMLEN : SYMNMLEN;
1731 if (name_length > maxlen) {
1732 bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
1737 /* We would normally not write anything here, but we'll write
1738 out 4 so that any stupid coff reader which tries to read
1739 the string table even when there isn't one won't croak.
1742 uint32e_type size = 4;
1744 bfd_write((PTR)&size, 1, sizeof(size), abfd);
1750 @subsubsection Writing Relocations
1751 To write a relocations, all the back end does is step though the
1752 canonical relocation table, and create an @code{internal_reloc}. The
1753 symbol index to use is removed from the @code{offset} field in the
1754 symbol table supplied, the address comes directly from the sum of the
1755 section base address and the relocation offset and the type is dug
1756 directly from the howto field.
1758 Then the @code{internal_reloc} is swapped into the shape of an
1759 @code{external_reloc} and written out to disk.
1763 DEFUN(coff_write_relocs,(abfd),
1767 for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1769 struct external_reloc dst;
1771 arelent **p = s->orelocation;
1772 bfd_seek(abfd, s->rel_filepos, SEEK_SET);
1773 for (i = 0; i < s->reloc_count; i++) {
1774 struct internal_reloc n;
1776 memset((PTR)&n, 0, sizeof(n));
1777 n.r_vaddr = q->address + s->vma;
1778 if (q->sym_ptr_ptr) {
1779 n.r_symndx = get_index((*(q->sym_ptr_ptr)));
1782 /* Work out reloc type from what is required */
1783 SELECT_RELOC(n.r_type, q->howto);
1785 n.r_type = q->howto->type;
1787 coff_swap_reloc_out(abfd, &n, &dst);
1788 bfd_write((PTR) &n, 1, RELSZ, abfd);
1792 #endif /* NO_COFF_SYMBOLS */
1794 #ifndef NO_COFF_LINENOS
1797 DEFUN(coff_write_linenumbers,(abfd),
1801 for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1802 if (s->lineno_count) {
1803 asymbol **q = abfd->outsymbols;
1804 bfd_seek(abfd, s->line_filepos, SEEK_SET);
1805 /* Find all the linenumbers in this section */
1808 alent *l = BFD_SEND(p->the_bfd, _get_lineno, (p->the_bfd, p));
1810 /* Found a linenumber entry, output */
1811 struct internal_lineno out;
1813 memset( (PTR)&out, 0, sizeof(out));
1815 out.l_addr.l_symndx = l->u.offset;
1816 coff_swap_lineno_out(abfd, &out, &buff);
1817 bfd_write((PTR) &buff, 1, LINESZ, abfd);
1819 while (l->line_number) {
1820 out.l_lnno = l->line_number;
1821 out.l_addr.l_symndx = l->u.offset;
1822 coff_swap_lineno_out(abfd, &out, &buff);
1823 bfd_write((PTR) &buff, 1, LINESZ, abfd);
1834 DEFUN(coff_get_lineno,(ignore_abfd, symbol),
1835 bfd *ignore_abfd AND
1838 return coffsymbol(symbol)->lineno;
1841 #endif /* NO_COFF_LINENOS */
1844 coff_make_empty_symbol(abfd)
1847 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1849 bfd_error = no_memory;
1853 new->lineno = (alent *) NULL;
1854 new->symbol.the_bfd = abfd;
1855 return &new->symbol;
1858 #ifndef NO_COFF_SYMBOLS
1861 DEFUN(coff_print_symbol,(ignore_abfd, filep, symbol, how),
1862 bfd *ignore_abfd AND
1865 bfd_print_symbol_type how)
1867 FILE *file = (FILE *)filep;
1869 case bfd_print_symbol_name:
1870 fprintf(file, "%s", symbol->name);
1872 case bfd_print_symbol_more:
1873 fprintf(file, "coff %lx %lx", (unsigned long) coffsymbol(symbol)->native,
1874 (unsigned long) coffsymbol(symbol)->lineno);
1876 case bfd_print_symbol_all:
1878 CONST char *section_name = symbol->section == (asection *) NULL ?
1879 "*abs" : symbol->section->name;
1880 bfd_print_symbol_vandf((PTR) file, symbol);
1882 fprintf(file, " %-5s %s %s %s",
1884 coffsymbol(symbol)->native ? "n" : "g",
1885 coffsymbol(symbol)->lineno ? "l" : " ",
1894 #endif /* NO_COFF_SYMBOLS */
1896 /* Set flags and magic number of a coff file from architecture and machine
1897 type. Result is true if we can represent the arch&type, false if not. */
1900 DEFUN(coff_set_flags,(abfd, magicp, flagsp),
1902 unsigned *magicp AND
1903 unsigned short *flagsp)
1905 switch (bfd_get_arch(abfd)) {
1913 *magicp = I960ROMAGIC;
1915 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
1916 I960RWMAGIC); FIXME???
1918 switch (bfd_get_mach(abfd)) {
1919 case bfd_mach_i960_core:
1922 case bfd_mach_i960_kb_sb:
1925 case bfd_mach_i960_mc:
1928 case bfd_mach_i960_xa:
1931 case bfd_mach_i960_ca:
1934 case bfd_mach_i960_ka_sa:
1947 *magicp = MIPS_MAGIC_2;
1953 *magicp = I386MAGIC;
1958 *magicp = MC68MAGIC;
1964 *magicp = MC88OMAGIC;
1969 #ifdef A29K_MAGIC_BIG
1971 if (abfd->xvec->byteorder_big_p)
1972 *magicp = A29K_MAGIC_BIG;
1974 *magicp = A29K_MAGIC_LITTLE;
1980 case bfd_arch_rs6000:
1981 *magicp = U802TOCMAGIC;
1985 default: /* Unknown architecture */
1986 /* return false; -- fall through to "return false" below, to avoid
1987 "statement never reached" errors on the one below. */
1996 DEFUN(coff_set_arch_mach,(abfd, arch, machine),
1998 enum bfd_architecture arch AND
1999 unsigned long machine)
2002 unsigned short dummy2;
2003 bfd_default_set_arch_mach(abfd, arch, machine);
2005 if (arch != bfd_arch_unknown &&
2006 coff_set_flags(abfd, &dummy1, &dummy2) != true)
2007 return false; /* We can't represent this type */
2008 return true; /* We're easy ... */
2012 /* Calculate the file position for each section. */
2015 DEFUN(coff_compute_section_file_positions,(abfd),
2019 file_ptr sofar = FILHSZ;
2020 if (bfd_get_start_address(abfd)) {
2022 A start address may have been added to the original file. In this
2023 case it will need an optional header to record it.
2025 abfd->flags |= EXEC_P;
2027 if (abfd->flags & EXEC_P)
2031 sofar += abfd->section_count * SCNHSZ;
2032 for (current = abfd->sections;
2033 current != (asection *)NULL;
2034 current = current->next) {
2035 /* Only deal with sections which have contents */
2036 if (!(current->flags & SEC_HAS_CONTENTS))
2039 /* Align the sections in the file to the same boundary on
2040 which they are aligned in virtual memory. I960 doesn't
2041 do this (FIXME) so we can stay in sync with Intel. 960
2042 doesn't yet page from files... */
2045 /* Whatever the alignment, make sure that the sections are big
2046 enough to cover the gap */
2047 bfd_vma old_sofar= sofar;
2048 sofar = ALIGN(sofar, 1 << current->alignment_power);
2049 current->size += sofar - old_sofar;
2052 /* FIXME, in demand paged files, the low order bits of the file
2053 offset must match the low order bits of the virtual address.
2054 "Low order" is apparently implementation defined. Add code
2055 here to round sofar up to match the virtual address. */
2057 current->filepos = sofar;
2058 sofar += current->size;
2060 obj_relocbase(abfd) = sofar;
2069 DEFUN(coff_write_object_contents,(abfd),
2073 boolean hasrelocs = false;
2074 boolean haslinno = false;
2075 file_ptr reloc_base;
2076 file_ptr lineno_base;
2080 unsigned long reloc_size = 0;
2081 unsigned long lnno_size = 0;
2082 asection *text_sec = NULL;
2083 asection *data_sec = NULL;
2084 asection *bss_sec = NULL;
2086 struct internal_filehdr internal_f;
2087 struct internal_aouthdr internal_a;
2090 bfd_error = system_call_error;
2093 if(abfd->output_has_begun == false) {
2094 coff_compute_section_file_positions(abfd);
2097 if (abfd->sections != (asection *)NULL) {
2098 scn_base = abfd->sections->filepos;
2103 if (bfd_seek(abfd, scn_base, SEEK_SET) != 0)
2105 reloc_base = obj_relocbase(abfd);
2107 /* Make a pass through the symbol table to count line number entries and
2108 put them into the correct asections */
2110 #ifndef NO_COFF_LINENOS
2111 coff_count_linenumbers(abfd);
2113 data_base = scn_base;
2115 /* Work out the size of the reloc and linno areas */
2117 for (current = abfd->sections; current != NULL; current = current->next) {
2118 reloc_size += current->reloc_count * RELSZ;
2119 #ifndef NO_COFF_LINENOS
2120 lnno_size += current->lineno_count * LINESZ;
2122 data_base += SCNHSZ;
2125 lineno_base = reloc_base + reloc_size;
2126 sym_base = lineno_base + lnno_size;
2128 /* Indicate in each section->line_filepos its actual file address */
2129 for (current = abfd->sections; current != NULL; current = current->next) {
2130 if (current->lineno_count) {
2131 current->line_filepos = lineno_base;
2132 current->moving_line_filepos = lineno_base;
2133 #ifndef NO_COFF_LINENOS
2134 lineno_base += current->lineno_count * LINESZ;
2138 current->line_filepos = 0;
2140 if (current->reloc_count) {
2141 current->rel_filepos = reloc_base;
2142 reloc_base += current->reloc_count * sizeof(struct internal_reloc);
2145 current->rel_filepos = 0;
2149 /* Write section headers to the file. */
2152 (file_ptr) ((abfd->flags & EXEC_P) ?
2153 (FILHSZ + AOUTSZ) : FILHSZ),
2158 unsigned int pad = abfd->flags & D_PAGED ? data_base : 0;
2160 unsigned int pad = 0;
2162 for (current = abfd->sections; current != NULL; current = current->next) {
2163 struct internal_scnhdr section;
2164 strncpy(&(section.s_name[0]), current->name, 8);
2165 section.s_vaddr = current->vma + pad;
2166 section.s_paddr = current->vma + pad;
2167 section.s_size = current->size - pad;
2169 If this section has no size or is unloadable then the scnptr
2172 if (current->size - pad == 0 ||
2173 (current->flags & SEC_LOAD) == 0) {
2174 section.s_scnptr = 0;
2177 section.s_scnptr = current->filepos;
2179 section.s_relptr = current->rel_filepos;
2180 section.s_lnnoptr = current->line_filepos;
2181 section.s_nreloc = current->reloc_count;
2182 section.s_nlnno = current->lineno_count;
2183 if (current->reloc_count != 0)
2185 if (current->lineno_count != 0)
2188 section.s_flags = sec_to_styp_flags(current->name,current->flags);
2190 if (!strcmp(current->name, _TEXT)) {
2192 } else if (!strcmp(current->name, _DATA)) {
2194 } else if (!strcmp(current->name, _BSS)) {
2199 section.s_align = (current->alignment_power
2200 ? 1 << current->alignment_power
2207 coff_swap_scnhdr_out(abfd, §ion, &buff);
2208 bfd_write((PTR) (&buff), 1, SCNHSZ, abfd);
2215 /* OK, now set up the filehdr... */
2216 internal_f.f_nscns = abfd->section_count;
2218 We will NOT put a fucking timestamp in the header here. Every time you
2219 put it back, I will come in and take it out again. I'm sorry. This
2220 field does not belong here. We fill it with a 0 so it compares the
2221 same but is not a reasonable time. -- gnu@cygnus.com
2224 Well, I like it, so I'm conditionally compiling it in.
2227 #ifdef COFF_TIMESTAMP
2228 internal_f.f_timdat = time(0);
2230 internal_f.f_timdat = 0;
2233 if (bfd_get_symcount(abfd) != 0)
2234 internal_f.f_symptr = sym_base;
2236 internal_f.f_symptr = 0;
2238 internal_f.f_flags = 0;
2240 if (abfd->flags & EXEC_P)
2241 internal_f.f_opthdr = AOUTSZ;
2243 internal_f.f_opthdr = 0;
2246 internal_f.f_flags |= F_RELFLG;
2248 internal_f.f_flags |= F_LNNO;
2249 if (0 == bfd_get_symcount(abfd))
2250 internal_f.f_flags |= F_LSYMS;
2251 if (abfd->flags & EXEC_P)
2252 internal_f.f_flags |= F_EXEC;
2254 internal_f.f_flags |= F_AR32W;
2256 if (!abfd->xvec->byteorder_big_p)
2257 internal_f.f_flags |= F_AR32WR;
2260 FIXME, should do something about the other byte orders and
2264 /* Set up architecture-dependent stuff */
2266 { unsigned int magic = 0;
2267 unsigned short flags = 0;
2268 coff_set_flags(abfd, &magic, &flags);
2269 internal_f.f_magic = magic;
2270 internal_f.f_flags |= flags;
2271 /* ...and the "opt"hdr... */
2274 # ifdef ULTRA3 /* NYU's machine */
2275 /* FIXME: This is a bogus check. I really want to see if there
2276 * is a .shbss or a .shdata section, if so then set the magic
2277 * number to indicate a shared data executable.
2279 if (internal_f.f_nscns >= 7)
2280 internal_a.magic = SHMAGIC; /* Shared magic */
2282 # endif /* ULTRA3 */
2283 internal_a.magic = NMAGIC; /* Assume separate i/d */
2284 #define __A_MAGIC_SET__
2287 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
2288 #define __A_MAGIC_SET__
2291 #define __A_MAGIC_SET__
2292 internal_a.magic = PAGEMAGICBCS;
2295 #if M68 || I386 || MIPS
2296 #define __A_MAGIC_SET__
2297 /* Never was anything here for the 68k */
2301 #define __A_MAGIC_SET__
2302 internal_a.magic = (abfd->flags & D_PAGED)? RS6K_AOUTHDR_ZMAGIC:
2303 (abfd->flags & WP_TEXT)? RS6K_AOUTHDR_NMAGIC:
2304 RS6K_AOUTHDR_OMAGIC;
2307 #ifndef __A_MAGIC_SET__
2308 # include "Your aouthdr magic number is not being set!"
2310 # undef __A_MAGIC_SET__
2313 /* Now should write relocs, strings, syms */
2314 obj_sym_filepos(abfd) = sym_base;
2316 #ifndef NO_COFF_SYMBOLS
2317 if (bfd_get_symcount(abfd) != 0) {
2318 coff_renumber_symbols(abfd);
2319 coff_mangle_symbols(abfd);
2320 coff_write_symbols(abfd);
2321 coff_write_linenumbers(abfd);
2322 coff_write_relocs(abfd);
2324 #endif /* NO_COFF_SYMBOLS */
2326 internal_a.tsize = text_sec->size;
2327 internal_a.text_start =text_sec->size ? text_sec->vma : 0;
2330 internal_a.dsize = data_sec->size;
2331 internal_a.data_start = data_sec->size ? data_sec->vma : 0;
2334 internal_a.bsize = bss_sec->size;
2337 internal_a.entry = bfd_get_start_address(abfd);
2338 internal_f.f_nsyms = bfd_get_symcount(abfd);
2340 /* now write them */
2341 if (bfd_seek(abfd, 0L, SEEK_SET) != 0)
2345 coff_swap_filehdr_out(abfd, &internal_f, &buff);
2346 bfd_write((PTR) &buff, 1, FILHSZ, abfd);
2348 if (abfd->flags & EXEC_P) {
2350 coff_swap_aouthdr_out(abfd, &internal_a, &buff);
2351 bfd_write((PTR) &buff, 1, AOUTSZ, abfd);
2356 #ifndef NO_COFF_SYMBOLS
2359 this function transforms the offsets into the symbol table into
2360 pointers to syments.
2365 DEFUN(coff_pointerize_aux,(ignore_abfd, table_base, type, class, auxent),
2366 bfd *ignore_abfd AND
2367 combined_entry_type *table_base AND
2370 combined_entry_type *auxent)
2372 /* Don't bother if this is a file or a section */
2373 if (class == C_STAT && type == T_NULL) return;
2374 if (class == C_FILE) return;
2376 /* Otherwise patch up */
2377 if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
2378 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
2379 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2380 auxent->fix_end = 1;
2382 if (auxent->u.auxent.x_sym.x_tagndx.l != 0) {
2383 auxent->u.auxent.x_sym.x_tagndx.p = table_base + auxent->u.auxent.x_sym.x_tagndx.l;
2384 auxent->fix_tag = 1;
2388 #endif /* NO_COFF_SYMBOLS */
2391 DEFUN(coff_set_section_contents,(abfd, section, location, offset, count),
2396 bfd_size_type count)
2398 if (abfd->output_has_begun == false) /* set by bfd.c handler */
2399 coff_compute_section_file_positions(abfd);
2401 bfd_seek(abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
2404 return (bfd_write(location, 1, count, abfd) == count) ? true : false;
2410 coff_close_and_cleanup(abfd)
2413 if (!bfd_read_p(abfd))
2414 switch (abfd->format) {
2416 if (!_bfd_write_archive_contents(abfd))
2420 if (!coff_write_object_contents(abfd))
2424 bfd_error = invalid_operation;
2428 /* We depend on bfd_close to free all the memory on the obstack. */
2429 /* FIXME if bfd_release is not using obstacks! */
2435 buy_and_read(abfd, where, seek_direction, size)
2441 PTR area = (PTR) bfd_alloc(abfd, size);
2443 bfd_error = no_memory;
2446 bfd_seek(abfd, where, seek_direction);
2447 if (bfd_read(area, 1, size, abfd) != size) {
2448 bfd_error = system_call_error;
2452 } /* buy_and_read() */
2455 #ifndef NO_COFF_SYMBOLS
2458 DEFUN(build_string_table,(abfd),
2461 char string_table_size_buffer[4];
2462 unsigned int string_table_size;
2465 /* At this point we should be "seek"'d to the end of the
2466 symbols === the symbol table size. */
2467 if (bfd_read((char *) string_table_size_buffer,
2468 sizeof(string_table_size_buffer),
2469 1, abfd) != sizeof(string_table_size)) {
2470 bfd_error = system_call_error;
2474 string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
2476 if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
2477 bfd_error = no_memory;
2479 } /* on mallocation error */
2480 if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
2481 bfd_error = system_call_error;
2484 return string_table;
2487 /* Allocate space for the ".debug" section, and read it.
2488 We did not read the debug section until now, because
2489 we didn't want to go to the trouble until someone needed it. */
2492 DEFUN(build_debug_section,(abfd),
2495 char *debug_section;
2498 asection *sect = bfd_get_section_by_name (abfd, ".debug");
2501 bfd_error = no_debug_section;
2505 debug_section = (PTR) bfd_alloc (abfd, bfd_section_size (abfd, sect));
2506 if (debug_section == NULL) {
2507 bfd_error = no_memory;
2511 /* Seek to the beginning of the `.debug' section and read it.
2512 Save the current position first; it is needed by our caller.
2513 Then read debug section and reset the file pointer. */
2515 position = bfd_tell (abfd);
2516 bfd_seek (abfd, sect->filepos, SEEK_SET);
2517 if (bfd_read (debug_section, bfd_section_size (abfd, sect), 1, abfd)
2518 != bfd_section_size (abfd, sect)) {
2519 bfd_error = system_call_error;
2522 bfd_seek (abfd, position, SEEK_SET);
2523 return debug_section;
2527 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
2528 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
2529 be \0-terminated. */
2531 DEFUN(copy_name,(abfd, name, maxlen),
2539 for (len = 0; len < maxlen; ++len) {
2540 if (name[len] == '\0') {
2545 if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
2546 bfd_error = no_memory;
2549 strncpy(newname, name, len);
2550 newname[len] = '\0';
2555 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
2556 knit the symbol names into a normalized form. By normalized here I
2557 mean that all symbols have an n_offset pointer that points to a null-
2558 terminated string. */
2560 #ifndef SYMNAME_IN_DEBUG
2561 #define SYMNAME_IN_DEBUG(x) 0
2564 static combined_entry_type *
2565 DEFUN(get_normalized_symtab,(abfd),
2568 combined_entry_type *internal;
2569 combined_entry_type *internal_ptr;
2570 combined_entry_type *internal_end;
2574 char *string_table = NULL;
2575 char *debug_section = NULL;
2578 unsigned int raw_size;
2579 if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
2580 return obj_raw_syments(abfd);
2582 if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
2583 bfd_error = no_symbols;
2587 internal = (combined_entry_type *)bfd_alloc(abfd, size);
2588 internal_end = internal + bfd_get_symcount(abfd);
2590 raw_size = bfd_get_symcount(abfd) * SYMESZ;
2591 raw = (SYMENT *)bfd_alloc(abfd,raw_size);
2593 if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
2594 || bfd_read((PTR)raw, raw_size, 1, abfd) != raw_size) {
2595 bfd_error = system_call_error;
2598 /* mark the end of the symbols */
2599 raw_end = raw + bfd_get_symcount(abfd);
2601 FIXME SOMEDAY. A string table size of zero is very weird, but
2602 probably possible. If one shows up, it will probably kill us.
2605 /* Swap all the raw entries */
2606 for (raw_src = raw, internal_ptr = internal;
2608 raw_src++, internal_ptr++) {
2611 coff_swap_sym_in(abfd, (char *)raw_src, (char *)&internal_ptr->u.syment);
2612 internal_ptr->fix_tag = 0;
2613 internal_ptr->fix_end = 0;
2615 for (i = internal_ptr->u.syment.n_numaux;
2617 --i, raw_src++, internal_ptr++) {
2619 (internal_ptr+1)->fix_tag = 0;
2620 (internal_ptr+1)->fix_end = 0;
2622 coff_swap_aux_in(abfd, (char *)(raw_src +1),
2623 internal_ptr->u.syment.n_type,
2624 internal_ptr->u.syment.n_sclass,
2625 &(internal_ptr+1)->u.auxent);
2627 coff_pointerize_aux(abfd,
2629 internal_ptr->u.syment.n_type,
2630 internal_ptr->u.syment.n_sclass,
2635 /* Free all the raw stuff */
2636 bfd_release(abfd, raw);
2638 for (internal_ptr = internal; internal_ptr < internal_end;
2641 if (internal_ptr->u.syment.n_sclass == C_FILE) {
2642 /* make a file symbol point to the name in the auxent, since
2643 the text ".file" is redundant */
2644 if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
2645 /* the filename is a long one, point into the string table */
2646 if (string_table == NULL) {
2647 string_table = build_string_table(abfd);
2650 internal_ptr->u.syment._n._n_n._n_offset =
2651 (int) (string_table - 4 +
2652 (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
2655 /* ordinary short filename, put into memory anyway */
2656 internal_ptr->u.syment._n._n_n._n_offset = (int)
2657 copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
2662 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
2663 /* This is a "short" name. Make it long. */
2664 unsigned long i = 0;
2665 char *newstring = NULL;
2667 /* find the length of this string without walking into memory
2669 for (i = 0; i < 8; ++i) {
2670 if (internal_ptr->u.syment._n._n_name[i] == '\0') {
2672 } /* if end of string */
2673 } /* possible lengths of this string. */
2675 if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
2676 bfd_error = no_memory;
2679 bzero(newstring, i);
2680 strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
2681 internal_ptr->u.syment._n._n_n._n_offset = (int) newstring;
2682 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
2684 else if (!SYMNAME_IN_DEBUG(&internal_ptr->u.syment)) {
2685 /* Long name already. Point symbol at the string in the table. */
2686 if (string_table == NULL) {
2687 string_table = build_string_table(abfd);
2689 internal_ptr->u.syment._n._n_n._n_offset = (int)
2690 (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
2693 /* Long name in debug section. Very similar. */
2694 if (debug_section == NULL) {
2695 debug_section = build_debug_section(abfd);
2697 internal_ptr->u.syment._n._n_n._n_offset = (int)
2698 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
2701 internal_ptr += internal_ptr->u.syment.n_numaux;
2704 obj_raw_syments(abfd) = internal;
2707 } /* get_normalized_symtab() */
2709 #endif /* NO_COFF_SYMBOLS */
2713 DEFUN(section_from_bfd_index,(abfd, index),
2718 struct sec *answer = abfd->sections;
2720 answer = answer->next;
2727 #ifndef NO_COFF_LINENOS
2730 @subsubsection Reading Linenumbers
2731 Createing the linenumber table is done by reading in the entire coff
2732 linenumber table, and creating another table for internal use.
2734 A coff line number table is structured so that each
2735 function is marked as having a line number of 0. Each line within the
2736 function is an offset from the first line in the function. The base of
2737 the line number information for the table is stored in the symbol
2738 associated with the function.
2740 The information is copied from the external to the internal table, and
2741 each symbol which marks a function is marked by pointing its...
2743 **How does this work ?**
2748 coff_slurp_line_table(abfd, asect)
2752 LINENO *native_lineno;
2753 alent *lineno_cache;
2755 BFD_ASSERT(asect->lineno == (alent *) NULL);
2757 native_lineno = (LINENO *) buy_and_read(abfd,
2758 asect->line_filepos,
2761 asect->lineno_count));
2763 (alent *) bfd_alloc(abfd, (size_t) ((asect->lineno_count + 1) * sizeof(alent)));
2764 if (lineno_cache == NULL) {
2765 bfd_error = no_memory;
2768 unsigned int counter = 0;
2769 alent *cache_ptr = lineno_cache;
2770 LINENO *src = native_lineno;
2772 while (counter < asect->lineno_count) {
2773 struct internal_lineno dst;
2774 coff_swap_lineno_in(abfd, src, &dst);
2775 cache_ptr->line_number = dst.l_lnno;
2777 if (cache_ptr->line_number == 0) {
2778 coff_symbol_type *sym =
2779 (coff_symbol_type *) (dst.l_addr.l_symndx
2780 + obj_symbol_slew(abfd)
2781 + obj_raw_syments(abfd))->u.syment._n._n_n._n_zeroes;
2782 cache_ptr->u.sym = (asymbol *) sym;
2783 sym->lineno = cache_ptr;
2786 cache_ptr->u.offset = dst.l_addr.l_paddr
2787 - bfd_section_vma(abfd, asect);
2788 } /* If no linenumber expect a symbol index */
2794 cache_ptr->line_number = 0;
2797 asect->lineno = lineno_cache;
2798 /* FIXME, free native_lineno here, or use alloca or something. */
2800 } /* coff_slurp_line_table() */
2802 #endif /* NO_COFF_LINENOS */
2804 #ifndef NO_COFF_LINENOS
2807 DEFUN(coff_slurp_symbol_table,(abfd),
2810 combined_entry_type *native_symbols;
2811 coff_symbol_type *cached_area;
2812 unsigned int *table_ptr;
2814 unsigned int number_of_symbols = 0;
2815 if (obj_symbols(abfd))
2817 bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
2819 /* Read in the symbol table */
2820 if ((native_symbols = get_normalized_symtab(abfd)) == NULL) {
2824 /* Allocate enough room for all the symbols in cached form */
2826 (coff_symbol_type *)
2827 bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(coff_symbol_type)));
2829 if (cached_area == NULL) {
2830 bfd_error = no_memory;
2835 bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(unsigned int)));
2837 if (table_ptr == NULL) {
2838 bfd_error = no_memory;
2841 coff_symbol_type *dst = cached_area;
2842 unsigned int last_native_index = bfd_get_symcount(abfd);
2843 unsigned int this_index = 0;
2844 while (this_index < last_native_index) {
2845 combined_entry_type *src = native_symbols + this_index;
2846 table_ptr[this_index] = number_of_symbols;
2847 dst->symbol.the_bfd = abfd;
2849 dst->symbol.name = (char *)(src->u.syment._n._n_n._n_offset);
2851 We use the native name field to point to the cached field
2853 src->u.syment._n._n_n._n_zeroes = (int) dst;
2854 dst->symbol.section = section_from_bfd_index(abfd,
2855 src->u.syment.n_scnum);
2856 switch (src->u.syment.n_sclass) {
2860 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
2861 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
2862 dst->symbol.flags |= BSF_NOT_AT_END;
2864 /* Fall through to next case */
2872 if ((src->u.syment.n_scnum) == 0) {
2873 if ((src->u.syment.n_value) == 0) {
2874 dst->symbol.flags = BSF_UNDEFINED;
2875 dst->symbol.value= 0;
2878 dst->symbol.flags = BSF_FORT_COMM;
2879 dst->symbol.value = (src->u.syment.n_value);
2884 Base the value as an index from the base of the
2887 if (dst->symbol.section == (asection *) NULL) {
2888 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL | BSF_ABSOLUTE;
2889 dst->symbol.value = src->u.syment.n_value;
2892 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
2893 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
2895 if (ISFCN((src->u.syment.n_type))) {
2897 A function ext does not go at the end of a file
2899 dst->symbol.flags |= BSF_NOT_AT_END;
2904 case C_STAT: /* static */
2906 case C_LEAFSTAT: /* static leaf procedure */
2908 case C_LABEL: /* label */
2909 if (src->u.syment.n_scnum == -2)
2910 dst->symbol.flags = BSF_DEBUGGING;
2912 dst->symbol.flags = BSF_LOCAL;
2914 Base the value as an index from the base of the section, if
2917 if (dst->symbol.section)
2918 dst->symbol.value = (src->u.syment.n_value) -
2919 dst->symbol.section->vma;
2921 dst->symbol.value = (src->u.syment.n_value) ;
2924 case C_MOS: /* member of structure */
2925 case C_EOS: /* end of structure */
2926 #ifdef NOTDEF /* C_AUTOARG has the same value */
2928 case C_GLBLREG: /* A29k-specific storage class */
2931 case C_REGPARM: /* register parameter */
2932 case C_REG: /* register variable */
2934 case C_AUTOARG: /* 960-specific storage class */
2936 case C_TPDEF: /* type definition */
2938 case C_AUTO: /* automatic variable */
2939 case C_FIELD: /* bit field */
2940 case C_ENTAG: /* enumeration tag */
2941 case C_MOE: /* member of enumeration */
2942 case C_MOU: /* member of union */
2943 case C_UNTAG: /* union tag */
2944 dst->symbol.flags = BSF_DEBUGGING;
2945 dst->symbol.value = (src->u.syment.n_value);
2948 case C_FILE: /* file name */
2949 case C_STRTAG: /* structure tag */
2951 case C_BINCL: /* beginning of include file */
2952 case C_EINCL: /* ending of include file */
2965 dst->symbol.flags = BSF_DEBUGGING;
2966 dst->symbol.value = (src->u.syment.n_value);
2969 case C_BLOCK: /* ".bb" or ".eb" */
2970 case C_FCN: /* ".bf" or ".ef" */
2971 case C_EFCN: /* physical end of function */
2972 dst->symbol.flags = BSF_LOCAL;
2974 Base the value as an index from the base of the section
2976 dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
2980 case C_EXTDEF: /* external definition */
2981 case C_ULABEL: /* undefined label */
2982 case C_USTATIC: /* undefined static */
2983 case C_LINE: /* line # reformatted as symbol table entry */
2984 case C_ALIAS: /* duplicate tag */
2985 case C_HIDDEN: /* ext symbol in dmert public lib */
2988 fprintf(stderr,"Unrecognized storage class %d\n",
2989 src->u.syment.n_sclass);
2991 dst->symbol.flags = BSF_DEBUGGING;
2992 dst->symbol.value = (src->u.syment.n_value);
2996 BFD_ASSERT(dst->symbol.flags != 0);
3000 dst->symbol.udata = 0;
3001 dst->lineno = (alent *) NULL;
3002 this_index += (src->u.syment.n_numaux) + 1;
3004 number_of_symbols++;
3005 } /* walk the native symtab */
3006 } /* bfdize the native symtab */
3008 obj_symbols(abfd) = cached_area;
3009 obj_raw_syments(abfd) = native_symbols;
3011 bfd_get_symcount(abfd) = number_of_symbols;
3012 obj_convert(abfd) = table_ptr;
3013 /* Slurp the line tables for each section too */
3018 coff_slurp_line_table(abfd, p);
3023 } /* coff_slurp_symbol_table() */
3026 coff_get_symtab_upper_bound(abfd)
3029 if (!coff_slurp_symbol_table(abfd))
3032 return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
3037 coff_get_symtab(abfd, alocation)
3039 asymbol **alocation;
3041 unsigned int counter = 0;
3042 coff_symbol_type *symbase;
3043 coff_symbol_type **location = (coff_symbol_type **) (alocation);
3044 if (!coff_slurp_symbol_table(abfd))
3047 for (symbase = obj_symbols(abfd); counter++ < bfd_get_symcount(abfd);)
3048 *(location++) = symbase++;
3050 return bfd_get_symcount(abfd);
3053 #endif /* NO_COFF_SYMBOLS */
3056 coff_get_reloc_upper_bound(abfd, asect)
3060 if (bfd_get_format(abfd) != bfd_object) {
3061 bfd_error = invalid_operation;
3064 return (asect->reloc_count + 1) * sizeof(arelent *);
3068 @subsubsection Reading Relocations
3069 Coff relocations are easily transformed into the internal BFD form
3072 Reading a coff relocation table is done in the following stages:
3075 The entire coff relocation table is read into memory.
3077 Each relocation is processed in turn, first it is swapped from the
3078 external to the internal form.
3080 The symbol referenced in the relocation's symbol index is turned into
3081 a pointer into the canonical symbol table. Note that this table is the
3082 same as the one returned by a call to @code{bfd_canonicalize_symtab}.
3083 The back end will call the routine and save the result if a
3084 canonicalization hasn't been done.
3086 The reloc index is turned into a pointer to a howto structure, in a
3087 back end specific way. For instance, the 386 and 960 use the
3088 @code{r_type} to directly produce an index into a howto table vector;
3089 the 88k subtracts a number from the @code{r_type} field and creates an
3095 DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
3100 RELOC *native_relocs;
3101 arelent *reloc_cache;
3102 if (asect->relocation)
3104 if (asect->reloc_count == 0)
3106 #ifndef NO_COFF_SYMBOLS
3107 if (!coff_slurp_symbol_table(abfd))
3111 (RELOC *) buy_and_read(abfd,
3115 asect->reloc_count));
3116 reloc_cache = (arelent *)
3117 bfd_alloc(abfd, (size_t) (asect->reloc_count * sizeof(arelent)));
3119 if (reloc_cache == NULL) {
3120 bfd_error = no_memory;
3125 for (cache_ptr = reloc_cache,
3126 src = native_relocs;
3127 cache_ptr < reloc_cache + asect->reloc_count;
3130 struct internal_reloc dst;
3132 bfd_swap_reloc_in(abfd, src, &dst);
3134 dst.r_symndx += obj_symbol_slew(abfd);
3135 cache_ptr->sym_ptr_ptr = symbols + obj_convert(abfd)[dst.r_symndx];
3137 /* AMD has two relocation entries for the 'consth' instruction.
3138 * The first is R_IHIHALF (part 1), the second is R_IHCONST
3139 * (part 2). The second entry's r_symndx does not contain
3140 * an index to a symbol but rather a value (apparently).
3141 * Also, see the ifdef below for saving the r_symndx value in addend.
3143 if (dst.r_type == R_IHCONST) {
3147 ptr = *(cache_ptr->sym_ptr_ptr);
3148 cache_ptr->address = dst.r_vaddr;
3150 The symbols definitions that we have read in have been
3151 relocated as if their sections started at 0. But the offsets
3152 refering to the symbols in the raw data have not been
3153 modified, so we have to have a negative addend to compensate.
3155 Note that symbols which used to be common must be left alone */
3157 if (ptr && ptr->the_bfd == abfd
3158 && ptr->section != (asection *) NULL
3159 && ((ptr->flags & BSF_OLD_COMMON)== 0))
3162 cache_ptr->addend = -(ptr->section->vma + ptr->value);
3164 cache_ptr->addend = 0;
3169 cache_ptr->addend = 0;
3172 cache_ptr->address -= asect->vma;
3174 cache_ptr->section = (asection *) NULL;
3177 if (dst.r_type == R_IHCONST) {
3178 /* Add in the value which was stored in the symbol index */
3179 /* See above comment */
3180 cache_ptr->addend += dst.r_symndx;
3181 /* Throw away the bogus symbol pointer */
3182 cache_ptr->sym_ptr_ptr = 0;
3184 cache_ptr->howto = howto_table + dst.r_type;
3187 cache_ptr->howto = howto_table + dst.r_type;
3190 cache_ptr->howto = howto_table + dst.r_type;
3193 cache_ptr->howto = howto_table + dst.r_type - R_RELBYTE;
3196 if (dst.r_type >= R_PCR16L && dst.r_type <= R_VRT32) {
3197 cache_ptr->howto = howto_table + dst.r_type - R_PCR16L;
3198 cache_ptr->addend += dst.r_offset << 16;
3207 asect->relocation = reloc_cache;
3212 /* This is stupid. This function should be a boolean predicate */
3214 coff_canonicalize_reloc(abfd, section, relptr, symbols)
3220 arelent *tblptr = section->relocation;
3221 unsigned int count = 0;
3222 if (!(tblptr || coff_slurp_reloc_table(abfd, section, symbols)))
3224 tblptr = section->relocation;
3228 for (; count++ < section->reloc_count;)
3229 *relptr++ = tblptr++;
3233 return section->reloc_count;
3236 #ifndef NO_COFF_SYMBOLS
3239 provided a BFD, a section and an offset into the section, calculate and
3240 return the name of the source file and the line nearest to the wanted
3245 DEFUN(coff_find_nearest_line,(abfd,
3253 asection *section AND
3254 asymbol **ignore_symbols AND
3256 CONST char **filename_ptr AND
3257 CONST char **functionname_ptr AND
3258 unsigned int *line_ptr)
3260 static bfd *cache_abfd;
3261 static asection *cache_section;
3262 static bfd_vma cache_offset;
3263 static unsigned int cache_i;
3264 static alent *cache_l;
3267 coff_data_type *cof = coff_data(abfd);
3268 /* Run through the raw syments if available */
3269 combined_entry_type *p;
3271 unsigned int line_base = 0;
3275 *functionname_ptr = 0;
3278 /* Don't try and find line numbers in a non coff file */
3279 if (abfd->xvec->flavour != bfd_target_coff_flavour)
3285 p = cof->raw_syments;
3287 for (i = 0; i < cof->raw_syment_count; i++) {
3288 if (p->u.syment.n_sclass == C_FILE) {
3289 /* File name has been moved into symbol */
3290 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
3293 p += 1 + p->u.syment.n_numaux;
3295 /* Now wander though the raw linenumbers of the section */
3297 If this is the same BFD as we were previously called with and this is
3298 the same section, and the offset we want is further down then we can
3299 prime the lookup loop
3301 if (abfd == cache_abfd &&
3302 section == cache_section &&
3303 offset >= cache_offset) {
3309 l = section->lineno;
3312 for (; i < section->lineno_count; i++) {
3313 if (l->line_number == 0) {
3314 /* Get the symbol this line number points at */
3315 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
3316 *functionname_ptr = coff->symbol.name;
3318 combined_entry_type *s = coff->native;
3319 s = s + 1 + s->u.syment.n_numaux;
3321 S should now point to the .bf of the function
3323 if (s->u.syment.n_numaux) {
3325 The linenumber is stored in the auxent
3327 union internal_auxent *a = &((s + 1)->u.auxent);
3328 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
3333 if (l->u.offset > offset)
3335 *line_ptr = l->line_number + line_base + 1;
3341 cache_section = section;
3342 cache_offset = offset;
3351 coff_sym_filepos(abfd)
3354 return obj_sym_filepos(abfd);
3358 #endif /* NO_COFF_SYMBOLS */
3362 DEFUN(coff_sizeof_headers,(abfd, reloc),
3368 if (reloc == false) {
3369 size = FILHSZ + AOUTSZ;
3375 size += abfd->section_count * SCNHSZ;
3380 #define coff_core_file_failing_command _bfd_dummy_core_file_failing_command
3381 #define coff_core_file_failing_signal _bfd_dummy_core_file_failing_signal
3382 #define coff_core_file_matches_executable_p _bfd_dummy_core_file_matches_executable_p
3383 #define coff_slurp_armap bfd_slurp_coff_armap
3384 #define coff_slurp_extended_name_table _bfd_slurp_extended_name_table
3385 #define coff_truncate_arname bfd_dont_truncate_arname
3386 #define coff_openr_next_archived_file bfd_generic_openr_next_archived_file
3387 #define coff_generic_stat_arch_elt bfd_generic_stat_arch_elt
3388 #define coff_get_section_contents bfd_generic_get_section_contents
3389 #define coff_close_and_cleanup bfd_generic_close_and_cleanup
3391 #define coff_bfd_debug_info_start bfd_void
3392 #define coff_bfd_debug_info_end bfd_void
3393 #define coff_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void