1@section coff backends
2BFD supports a number of different flavours of coff format.
3The major differences between formats are the sizes and
4alignments of fields in structures on disk, and the occasional
5extra field.
6
7Coff in all its varieties is implemented with a few common
8files and a number of implementation specific files. For
9example, the i386 coff format is implemented in the file
10@file{coff-i386.c}.  This file @code{#include}s
11@file{coff/i386.h} which defines the external structure of the
12coff format for the i386, and @file{coff/internal.h} which
13defines the internal structure. @file{coff-i386.c} also
14defines the relocations used by the i386 coff format
15@xref{Relocations}.
16
17@subsection Porting to a new version of coff
18The recommended method is to select from the existing
19implementations the version of coff which is most like the one
20you want to use.  For example, we'll say that i386 coff is
21the one you select, and that your coff flavour is called foo.
22Copy @file{i386coff.c} to @file{foocoff.c}, copy
23@file{../include/coff/i386.h} to @file{../include/coff/foo.h},
24and add the lines to @file{targets.c} and @file{Makefile.in}
25so that your new back end is used. Alter the shapes of the
26structures in @file{../include/coff/foo.h} so that they match
27what you need. You will probably also have to add
28@code{#ifdef}s to the code in @file{coff/internal.h} and
29@file{coffcode.h} if your version of coff is too wild.
30
31You can verify that your new BFD backend works quite simply by
32building @file{objdump} from the @file{binutils} directory,
33and making sure that its version of what's going on and your
34host system's idea (assuming it has the pretty standard coff
35dump utility, usually called @code{att-dump} or just
36@code{dump}) are the same.  Then clean up your code, and send
37what you've done to Cygnus. Then your stuff will be in the
38next release, and you won't have to keep integrating it.
39
40@subsection How the coff backend works
41
42
43@subsubsection File layout
44The Coff backend is split into generic routines that are
45applicable to any Coff target and routines that are specific
46to a particular target.  The target-specific routines are
47further split into ones which are basically the same for all
48Coff targets except that they use the external symbol format
49or use different values for certain constants.
50
51The generic routines are in @file{coffgen.c}.  These routines
52work for any Coff target.  They use some hooks into the target
53specific code; the hooks are in a @code{bfd_coff_backend_data}
54structure, one of which exists for each target.
55
56The essentially similar target-specific routines are in
57@file{coffcode.h}.  This header file includes executable C code.
58The various Coff targets first include the appropriate Coff
59header file, make any special defines that are needed, and
60then include @file{coffcode.h}.
61
62Some of the Coff targets then also have additional routines in
63the target source file itself.
64
65@subsubsection Coff long section names
66In the standard Coff object format, section names are limited to
67the eight bytes available in the @code{s_name} field of the
68@code{SCNHDR} section header structure.  The format requires the
69field to be NUL-padded, but not necessarily NUL-terminated, so
70the longest section names permitted are a full eight characters.
71
72The Microsoft PE variants of the Coff object file format add
73an extension to support the use of long section names.  This
74extension is defined in section 4 of the Microsoft PE/COFF
75specification (rev 8.1).  If a section name is too long to fit
76into the section header's @code{s_name} field, it is instead
77placed into the string table, and the @code{s_name} field is
78filled with a slash ("/") followed by the ASCII decimal
79representation of the offset of the full name relative to the
80string table base.
81
82Note that this implies that the extension can only be used in object
83files, as executables do not contain a string table.  The standard
84specifies that long section names from objects emitted into executable
85images are to be truncated.
86
87However, as a GNU extension, BFD can generate executable images
88that contain a string table and long section names.  This
89would appear to be technically valid, as the standard only says
90that Coff debugging information is deprecated, not forbidden,
91and in practice it works, although some tools that parse PE files
92expecting the MS standard format may become confused; @file{PEview} is
93one known example.
94
95The functionality is supported in BFD by code implemented under
96the control of the macro @code{COFF_LONG_SECTION_NAMES}.  If not
97defined, the format does not support long section names in any way.
98If defined, it is used to initialise a flag,
99@code{_bfd_coff_long_section_names}, and a hook function pointer,
100@code{_bfd_coff_set_long_section_names}, in the Coff backend data
101structure.  The flag controls the generation of long section names
102in output BFDs at runtime; if it is false, as it will be by default
103when generating an executable image, long section names are truncated;
104if true, the long section names extension is employed.  The hook
105points to a function that allows the value of the flag to be altered
106at runtime, on formats that support long section names at all; on
107other formats it points to a stub that returns an error indication.
108
109With input BFDs, the flag is set according to whether any long section
110names are detected while reading the section headers.  For a completely
111new BFD, the flag is set to the default for the target format.  This
112information can be used by a client of the BFD library when deciding
113what output format to generate, and means that a BFD that is opened
114for read and subsequently converted to a writeable BFD and modified
115in-place will retain whatever format it had on input.
116
117If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is
118defined to the value "1", then long section names are enabled by
119default; if it is defined to the value zero, they are disabled by
120default (but still accepted in input BFDs).  The header @file{coffcode.h}
121defines a macro, @code{COFF_DEFAULT_LONG_SECTION_NAMES}, which is
122used in the backends to initialise the backend data structure fields
123appropriately; see the comments for further detail.
124
125@subsubsection Bit twiddling
126Each flavour of coff supported in BFD has its own header file
127describing the external layout of the structures. There is also
128an internal description of the coff layout, in
129@file{coff/internal.h}. A major function of the
130coff backend is swapping the bytes and twiddling the bits to
131translate the external form of the structures into the normal
132internal form. This is all performed in the
133@code{bfd_swap}_@i{thing}_@i{direction} routines. Some
134elements are different sizes between different versions of
135coff; it is the duty of the coff version specific include file
136to override the definitions of various packing routines in
137@file{coffcode.h}. E.g., the size of line number entry in coff is
138sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
139@code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
140correct one. No doubt, some day someone will find a version of
141coff which has a varying field size not catered to at the
142moment. To port BFD, that person will have to add more @code{#defines}.
143Three of the bit twiddling routines are exported to
144@code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
145and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
146table on its own, but uses BFD to fix things up.  More of the
147bit twiddlers are exported for @code{gas};
148@code{coff_swap_aux_out}, @code{coff_swap_sym_out},
149@code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
150@code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
151@code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
152of all the symbol table and reloc drudgery itself, thereby
153saving the internal BFD overhead, but uses BFD to swap things
154on the way out, making cross ports much safer.  Doing so also
155allows BFD (and thus the linker) to use the same header files
156as @code{gas}, which makes one avenue to disaster disappear.
157
158@subsubsection Symbol reading
159The simple canonical form for symbols used by BFD is not rich
160enough to keep all the information available in a coff symbol
161table. The back end gets around this problem by keeping the original
162symbol table around, "behind the scenes".
163
164When a symbol table is requested (through a call to
165@code{bfd_canonicalize_symtab}), a request gets through to
166@code{coff_get_normalized_symtab}. This reads the symbol table from
167the coff file and swaps all the structures inside into the
168internal form. It also fixes up all the pointers in the table
169(represented in the file by offsets from the first symbol in
170the table) into physical pointers to elements in the new
171internal table. This involves some work since the meanings of
172fields change depending upon context: a field that is a
173pointer to another structure in the symbol table at one moment
174may be the size in bytes of a structure at the next.  Another
175pass is made over the table. All symbols which mark file names
176(@code{C_FILE} symbols) are modified so that the internal
177string points to the value in the auxent (the real filename)
178rather than the normal text associated with the symbol
179(@code{".file"}).
180
181At this time the symbol names are moved around. Coff stores
182all symbols less than nine characters long physically
183within the symbol table; longer strings are kept at the end of
184the file in the string table. This pass moves all strings
185into memory and replaces them with pointers to the strings.
186
187The symbol table is massaged once again, this time to create
188the canonical table used by the BFD application. Each symbol
189is inspected in turn, and a decision made (using the
190@code{sclass} field) about the various flags to set in the
191@code{asymbol}.  @xref{Symbols}. The generated canonical table
192shares strings with the hidden internal symbol table.
193
194Any linenumbers are read from the coff file too, and attached
195to the symbols which own the functions the linenumbers belong to.
196
197@subsubsection Symbol writing
198Writing a symbol to a coff file which didn't come from a coff
199file will lose any debugging information. The @code{asymbol}
200structure remembers the BFD from which the symbol was taken, and on
201output the back end makes sure that the same destination target as
202source target is present.
203
204When the symbols have come from a coff file then all the
205debugging information is preserved.
206
207Symbol tables are provided for writing to the back end in a
208vector of pointers to pointers. This allows applications like
209the linker to accumulate and output large symbol tables
210without having to do too much byte copying.
211
212This function runs through the provided symbol table and
213patches each symbol marked as a file place holder
214(@code{C_FILE}) to point to the next file place holder in the
215list. It also marks each @code{offset} field in the list with
216the offset from the first symbol of the current symbol.
217
218Another function of this procedure is to turn the canonical
219value form of BFD into the form used by coff. Internally, BFD
220expects symbol values to be offsets from a section base; so a
221symbol physically at 0x120, but in a section starting at
2220x100, would have the value 0x20. Coff expects symbols to
223contain their final value, so symbols have their values
224changed at this point to reflect their sum with their owning
225section.  This transformation uses the
226@code{output_section} field of the @code{asymbol}'s
227@code{asection} @xref{Sections}.
228
229@itemize @bullet
230
231@item
232@code{coff_mangle_symbols}
233@end itemize
234This routine runs though the provided symbol table and uses
235the offsets generated by the previous pass and the pointers
236generated when the symbol table was read in to create the
237structured hierarchy required by coff. It changes each pointer
238to a symbol into the index into the symbol table of the asymbol.
239
240@itemize @bullet
241
242@item
243@code{coff_write_symbols}
244@end itemize
245This routine runs through the symbol table and patches up the
246symbols from their internal form into the coff way, calls the
247bit twiddlers, and writes out the table to the file.
248
249@findex coff_symbol_type
250@subsubsection @code{coff_symbol_type}
251@strong{Description}@*
252The hidden information for an @code{asymbol} is described in a
253@code{combined_entry_type}:
254
255
256@example
257
258typedef struct coff_ptr_struct
259@{
260  /* Remembers the offset from the first symbol in the file for
261     this symbol. Generated by coff_renumber_symbols.  */
262  unsigned int offset;
263
264  /* Should the value of this symbol be renumbered.  Used for
265     XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  */
266  unsigned int fix_value : 1;
267
268  /* Should the tag field of this symbol be renumbered.
269     Created by coff_pointerize_aux.  */
270  unsigned int fix_tag : 1;
271
272  /* Should the endidx field of this symbol be renumbered.
273     Created by coff_pointerize_aux.  */
274  unsigned int fix_end : 1;
275
276  /* Should the x_csect.x_scnlen field be renumbered.
277     Created by coff_pointerize_aux.  */
278  unsigned int fix_scnlen : 1;
279
280  /* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
281     index into the line number entries.  Set by coff_slurp_symbol_table.  */
282  unsigned int fix_line : 1;
283
284  /* The container for the symbol structure as read and translated
285     from the file.  */
286  union
287  @{
288    union internal_auxent auxent;
289    struct internal_syment syment;
290  @} u;
291
292 /* Selector for the union above.  */
293 bool is_sym;
294
295 /* An extra pointer which can used by format based on COFF (like XCOFF)
296    to provide extra information to their backend.  */
297 void *extrap;
298@} combined_entry_type;
299
300
301/* Each canonical asymbol really looks like this: */
302
303typedef struct coff_symbol_struct
304@{
305  /* The actual symbol which the rest of BFD works with */
306  asymbol symbol;
307
308  /* A pointer to the hidden information for this symbol */
309  combined_entry_type *native;
310
311  /* A pointer to the linenumber information for this symbol */
312  struct lineno_cache_entry *lineno;
313
314  /* Have the line numbers been relocated yet ? */
315  bool done_lineno;
316@} coff_symbol_type;
317@end example
318@findex bfd_coff_backend_data
319@subsubsection @code{bfd_coff_backend_data}
320
321@example
322/* COFF symbol classifications.  */
323
324enum coff_symbol_classification
325@{
326  /* Global symbol.  */
327  COFF_SYMBOL_GLOBAL,
328  /* Common symbol.  */
329  COFF_SYMBOL_COMMON,
330  /* Undefined symbol.  */
331  COFF_SYMBOL_UNDEFINED,
332  /* Local symbol.  */
333  COFF_SYMBOL_LOCAL,
334  /* PE section symbol.  */
335  COFF_SYMBOL_PE_SECTION
336@};
337
338typedef asection * (*coff_gc_mark_hook_fn)
339  (asection *, struct bfd_link_info *, struct internal_reloc *,
340   struct coff_link_hash_entry *, struct internal_syment *);
341
342@end example
343Special entry points for gdb to swap in coff symbol table parts:
344@example
345typedef struct
346@{
347  void (*_bfd_coff_swap_aux_in)
348    (bfd *, void *, int, int, int, int, void *);
349
350  void (*_bfd_coff_swap_sym_in)
351    (bfd *, void *, void *);
352
353  void (*_bfd_coff_swap_lineno_in)
354    (bfd *, void *, void *);
355
356  unsigned int (*_bfd_coff_swap_aux_out)
357    (bfd *, void *, int, int, int, int, void *);
358
359  unsigned int (*_bfd_coff_swap_sym_out)
360    (bfd *, void *, void *);
361
362  unsigned int (*_bfd_coff_swap_lineno_out)
363    (bfd *, void *, void *);
364
365  unsigned int (*_bfd_coff_swap_reloc_out)
366    (bfd *, void *, void *);
367
368  unsigned int (*_bfd_coff_swap_filehdr_out)
369    (bfd *, void *, void *);
370
371  unsigned int (*_bfd_coff_swap_aouthdr_out)
372    (bfd *, void *, void *);
373
374  unsigned int (*_bfd_coff_swap_scnhdr_out)
375    (bfd *, void *, void *);
376
377  unsigned int _bfd_filhsz;
378  unsigned int _bfd_aoutsz;
379  unsigned int _bfd_scnhsz;
380  unsigned int _bfd_symesz;
381  unsigned int _bfd_auxesz;
382  unsigned int _bfd_relsz;
383  unsigned int _bfd_linesz;
384  unsigned int _bfd_filnmlen;
385  bool _bfd_coff_long_filenames;
386
387  bool _bfd_coff_long_section_names;
388  bool (*_bfd_coff_set_long_section_names)
389    (bfd *, int);
390
391  unsigned int _bfd_coff_default_section_alignment_power;
392  bool _bfd_coff_force_symnames_in_strings;
393  unsigned int _bfd_coff_debug_string_prefix_length;
394  unsigned int _bfd_coff_max_nscns;
395
396  void (*_bfd_coff_swap_filehdr_in)
397    (bfd *, void *, void *);
398
399  void (*_bfd_coff_swap_aouthdr_in)
400    (bfd *, void *, void *);
401
402  void (*_bfd_coff_swap_scnhdr_in)
403    (bfd *, void *, void *);
404
405  void (*_bfd_coff_swap_reloc_in)
406    (bfd *abfd, void *, void *);
407
408  bool (*_bfd_coff_bad_format_hook)
409    (bfd *, void *);
410
411  bool (*_bfd_coff_set_arch_mach_hook)
412    (bfd *, void *);
413
414  void * (*_bfd_coff_mkobject_hook)
415    (bfd *, void *, void *);
416
417  bool (*_bfd_styp_to_sec_flags_hook)
418    (bfd *, void *, const char *, asection *, flagword *);
419
420  void (*_bfd_set_alignment_hook)
421    (bfd *, asection *, void *);
422
423  bool (*_bfd_coff_slurp_symbol_table)
424    (bfd *);
425
426  bool (*_bfd_coff_symname_in_debug)
427    (bfd *, struct internal_syment *);
428
429  bool (*_bfd_coff_pointerize_aux_hook)
430    (bfd *, combined_entry_type *, combined_entry_type *,
431     unsigned int, combined_entry_type *);
432
433  bool (*_bfd_coff_print_aux)
434    (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
435     combined_entry_type *, unsigned int);
436
437  void (*_bfd_coff_reloc16_extra_cases)
438    (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
439     bfd_byte *, unsigned int *, unsigned int *);
440
441  int (*_bfd_coff_reloc16_estimate)
442    (bfd *, asection *, arelent *, unsigned int,
443     struct bfd_link_info *);
444
445  enum coff_symbol_classification (*_bfd_coff_classify_symbol)
446    (bfd *, struct internal_syment *);
447
448  bool (*_bfd_coff_compute_section_file_positions)
449    (bfd *);
450
451  bool (*_bfd_coff_start_final_link)
452    (bfd *, struct bfd_link_info *);
453
454  bool (*_bfd_coff_relocate_section)
455    (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
456     struct internal_reloc *, struct internal_syment *, asection **);
457
458  reloc_howto_type *(*_bfd_coff_rtype_to_howto)
459    (bfd *, asection *, struct internal_reloc *,
460     struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *);
461
462  bool (*_bfd_coff_adjust_symndx)
463    (bfd *, struct bfd_link_info *, bfd *, asection *,
464     struct internal_reloc *, bool *);
465
466  bool (*_bfd_coff_link_add_one_symbol)
467    (struct bfd_link_info *, bfd *, const char *, flagword,
468     asection *, bfd_vma, const char *, bool, bool,
469     struct bfd_link_hash_entry **);
470
471  bool (*_bfd_coff_link_output_has_begun)
472    (bfd *, struct coff_final_link_info *);
473
474  bool (*_bfd_coff_final_link_postscript)
475    (bfd *, struct coff_final_link_info *);
476
477  bool (*_bfd_coff_print_pdata)
478    (bfd *, void *);
479
480@} bfd_coff_backend_data;
481
482#define coff_backend_info(abfd) \
483  ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
484
485#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
486  ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
487
488#define bfd_coff_swap_sym_in(a,e,i) \
489  ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
490
491#define bfd_coff_swap_lineno_in(a,e,i) \
492  ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
493
494#define bfd_coff_swap_reloc_out(abfd, i, o) \
495  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
496
497#define bfd_coff_swap_lineno_out(abfd, i, o) \
498  ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
499
500#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
501  ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
502
503#define bfd_coff_swap_sym_out(abfd, i,o) \
504  ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
505
506#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
507  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
508
509#define bfd_coff_swap_filehdr_out(abfd, i,o) \
510  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
511
512#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
513  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
514
515#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
516#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
517#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
518#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
519#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
520#define bfd_coff_relsz(abfd)  (coff_backend_info (abfd)->_bfd_relsz)
521#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
522#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
523#define bfd_coff_long_filenames(abfd) \
524  (coff_backend_info (abfd)->_bfd_coff_long_filenames)
525#define bfd_coff_long_section_names(abfd) \
526  (coff_backend_info (abfd)->_bfd_coff_long_section_names)
527#define bfd_coff_set_long_section_names(abfd, enable) \
528  ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
529#define bfd_coff_default_section_alignment_power(abfd) \
530  (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
531#define bfd_coff_max_nscns(abfd) \
532  (coff_backend_info (abfd)->_bfd_coff_max_nscns)
533
534#define bfd_coff_swap_filehdr_in(abfd, i,o) \
535  ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
536
537#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
538  ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
539
540#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
541  ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
542
543#define bfd_coff_swap_reloc_in(abfd, i, o) \
544  ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
545
546#define bfd_coff_bad_format_hook(abfd, filehdr) \
547  ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
548
549#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
550  ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
551#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
552  ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
553   (abfd, filehdr, aouthdr))
554
555#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
556  ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
557   (abfd, scnhdr, name, section, flags_ptr))
558
559#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
560  ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
561
562#define bfd_coff_slurp_symbol_table(abfd)\
563  ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
564
565#define bfd_coff_symname_in_debug(abfd, sym)\
566  ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
567
568#define bfd_coff_force_symnames_in_strings(abfd)\
569  (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
570
571#define bfd_coff_debug_string_prefix_length(abfd)\
572  (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
573
574#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
575  ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
576   (abfd, file, base, symbol, aux, indaux))
577
578#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
579                                     reloc, data, src_ptr, dst_ptr)\
580  ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
581   (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
582
583#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
584  ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
585   (abfd, section, reloc, shrink, link_info))
586
587#define bfd_coff_classify_symbol(abfd, sym)\
588  ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
589   (abfd, sym))
590
591#define bfd_coff_compute_section_file_positions(abfd)\
592  ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
593   (abfd))
594
595#define bfd_coff_start_final_link(obfd, info)\
596  ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
597   (obfd, info))
598#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
599  ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
600   (obfd, info, ibfd, o, con, rel, isyms, secs))
601#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
602  ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
603   (abfd, sec, rel, h, sym, addendp))
604#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
605  ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
606   (obfd, info, ibfd, sec, rel, adjustedp))
607#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
608                                     value, string, cp, coll, hashp)\
609  ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
610   (info, abfd, name, flags, section, value, string, cp, coll, hashp))
611
612#define bfd_coff_link_output_has_begun(a,p) \
613  ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
614#define bfd_coff_final_link_postscript(a,p) \
615  ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
616
617#define bfd_coff_have_print_pdata(a) \
618  (coff_backend_info (a)->_bfd_coff_print_pdata)
619#define bfd_coff_print_pdata(a,p) \
620  ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
621
622/* Macro: Returns true if the bfd is a PE executable as opposed to a
623   PE object file.  */
624#define bfd_pei_p(abfd) \
625  (startswith ((abfd)->xvec->name, "pei-"))
626@end example
627@subsubsection Writing relocations
628To write relocations, the back end steps though the
629canonical relocation table and create an
630@code{internal_reloc}. The symbol index to use is removed from
631the @code{offset} field in the symbol table supplied.  The
632address comes directly from the sum of the section base
633address and the relocation offset; the type is dug directly
634from the howto field.  Then the @code{internal_reloc} is
635swapped into the shape of an @code{external_reloc} and written
636out to disk.
637
638@subsubsection Reading linenumbers
639Creating the linenumber table is done by reading in the entire
640coff linenumber table, and creating another table for internal use.
641
642A coff linenumber table is structured so that each function
643is marked as having a line number of 0. Each line within the
644function is an offset from the first line in the function. The
645base of the line number information for the table is stored in
646the symbol associated with the function.
647
648Note: The PE format uses line number 0 for a flag indicating a
649new source file.
650
651The information is copied from the external to the internal
652table, and each symbol which marks a function is marked by
653pointing its...
654
655How does this work ?
656
657@subsubsection Reading relocations
658Coff relocations are easily transformed into the internal BFD form
659(@code{arelent}).
660
661Reading a coff relocation table is done in the following stages:
662
663@itemize @bullet
664
665@item
666Read the entire coff relocation table into memory.
667
668@item
669Process each relocation in turn; first swap it from the
670external to the internal form.
671
672@item
673Turn the symbol referenced in the relocation's symbol index
674into a pointer into the canonical symbol table.
675This table is the same as the one returned by a call to
676@code{bfd_canonicalize_symtab}. The back end will call that
677routine and save the result if a canonicalization hasn't been done.
678
679@item
680The reloc index is turned into a pointer to a howto
681structure, in a back end specific way. For instance, the 386
682uses the @code{r_type} to directly produce an index
683into a howto table vector.
684@end itemize
685
686