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 bfd_boolean is_sym; 294@} combined_entry_type; 295 296 297/* Each canonical asymbol really looks like this: */ 298 299typedef struct coff_symbol_struct 300@{ 301 /* The actual symbol which the rest of BFD works with */ 302 asymbol symbol; 303 304 /* A pointer to the hidden information for this symbol */ 305 combined_entry_type *native; 306 307 /* A pointer to the linenumber information for this symbol */ 308 struct lineno_cache_entry *lineno; 309 310 /* Have the line numbers been relocated yet ? */ 311 bfd_boolean done_lineno; 312@} coff_symbol_type; 313@end example 314@findex bfd_coff_backend_data 315@subsubsection @code{bfd_coff_backend_data} 316 317@example 318/* COFF symbol classifications. */ 319 320enum coff_symbol_classification 321@{ 322 /* Global symbol. */ 323 COFF_SYMBOL_GLOBAL, 324 /* Common symbol. */ 325 COFF_SYMBOL_COMMON, 326 /* Undefined symbol. */ 327 COFF_SYMBOL_UNDEFINED, 328 /* Local symbol. */ 329 COFF_SYMBOL_LOCAL, 330 /* PE section symbol. */ 331 COFF_SYMBOL_PE_SECTION 332@}; 333 334typedef asection * (*coff_gc_mark_hook_fn) 335 (asection *, struct bfd_link_info *, struct internal_reloc *, 336 struct coff_link_hash_entry *, struct internal_syment *); 337 338@end example 339Special entry points for gdb to swap in coff symbol table parts: 340@example 341typedef struct 342@{ 343 void (*_bfd_coff_swap_aux_in) 344 (bfd *, void *, int, int, int, int, void *); 345 346 void (*_bfd_coff_swap_sym_in) 347 (bfd *, void *, void *); 348 349 void (*_bfd_coff_swap_lineno_in) 350 (bfd *, void *, void *); 351 352 unsigned int (*_bfd_coff_swap_aux_out) 353 (bfd *, void *, int, int, int, int, void *); 354 355 unsigned int (*_bfd_coff_swap_sym_out) 356 (bfd *, void *, void *); 357 358 unsigned int (*_bfd_coff_swap_lineno_out) 359 (bfd *, void *, void *); 360 361 unsigned int (*_bfd_coff_swap_reloc_out) 362 (bfd *, void *, void *); 363 364 unsigned int (*_bfd_coff_swap_filehdr_out) 365 (bfd *, void *, void *); 366 367 unsigned int (*_bfd_coff_swap_aouthdr_out) 368 (bfd *, void *, void *); 369 370 unsigned int (*_bfd_coff_swap_scnhdr_out) 371 (bfd *, void *, void *); 372 373 unsigned int _bfd_filhsz; 374 unsigned int _bfd_aoutsz; 375 unsigned int _bfd_scnhsz; 376 unsigned int _bfd_symesz; 377 unsigned int _bfd_auxesz; 378 unsigned int _bfd_relsz; 379 unsigned int _bfd_linesz; 380 unsigned int _bfd_filnmlen; 381 bfd_boolean _bfd_coff_long_filenames; 382 383 bfd_boolean _bfd_coff_long_section_names; 384 bfd_boolean (*_bfd_coff_set_long_section_names) 385 (bfd *, int); 386 387 unsigned int _bfd_coff_default_section_alignment_power; 388 bfd_boolean _bfd_coff_force_symnames_in_strings; 389 unsigned int _bfd_coff_debug_string_prefix_length; 390 unsigned int _bfd_coff_max_nscns; 391 392 void (*_bfd_coff_swap_filehdr_in) 393 (bfd *, void *, void *); 394 395 void (*_bfd_coff_swap_aouthdr_in) 396 (bfd *, void *, void *); 397 398 void (*_bfd_coff_swap_scnhdr_in) 399 (bfd *, void *, void *); 400 401 void (*_bfd_coff_swap_reloc_in) 402 (bfd *abfd, void *, void *); 403 404 bfd_boolean (*_bfd_coff_bad_format_hook) 405 (bfd *, void *); 406 407 bfd_boolean (*_bfd_coff_set_arch_mach_hook) 408 (bfd *, void *); 409 410 void * (*_bfd_coff_mkobject_hook) 411 (bfd *, void *, void *); 412 413 bfd_boolean (*_bfd_styp_to_sec_flags_hook) 414 (bfd *, void *, const char *, asection *, flagword *); 415 416 void (*_bfd_set_alignment_hook) 417 (bfd *, asection *, void *); 418 419 bfd_boolean (*_bfd_coff_slurp_symbol_table) 420 (bfd *); 421 422 bfd_boolean (*_bfd_coff_symname_in_debug) 423 (bfd *, struct internal_syment *); 424 425 bfd_boolean (*_bfd_coff_pointerize_aux_hook) 426 (bfd *, combined_entry_type *, combined_entry_type *, 427 unsigned int, combined_entry_type *); 428 429 bfd_boolean (*_bfd_coff_print_aux) 430 (bfd *, FILE *, combined_entry_type *, combined_entry_type *, 431 combined_entry_type *, unsigned int); 432 433 void (*_bfd_coff_reloc16_extra_cases) 434 (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *, 435 bfd_byte *, unsigned int *, unsigned int *); 436 437 int (*_bfd_coff_reloc16_estimate) 438 (bfd *, asection *, arelent *, unsigned int, 439 struct bfd_link_info *); 440 441 enum coff_symbol_classification (*_bfd_coff_classify_symbol) 442 (bfd *, struct internal_syment *); 443 444 bfd_boolean (*_bfd_coff_compute_section_file_positions) 445 (bfd *); 446 447 bfd_boolean (*_bfd_coff_start_final_link) 448 (bfd *, struct bfd_link_info *); 449 450 bfd_boolean (*_bfd_coff_relocate_section) 451 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 452 struct internal_reloc *, struct internal_syment *, asection **); 453 454 reloc_howto_type *(*_bfd_coff_rtype_to_howto) 455 (bfd *, asection *, struct internal_reloc *, 456 struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *); 457 458 bfd_boolean (*_bfd_coff_adjust_symndx) 459 (bfd *, struct bfd_link_info *, bfd *, asection *, 460 struct internal_reloc *, bfd_boolean *); 461 462 bfd_boolean (*_bfd_coff_link_add_one_symbol) 463 (struct bfd_link_info *, bfd *, const char *, flagword, 464 asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean, 465 struct bfd_link_hash_entry **); 466 467 bfd_boolean (*_bfd_coff_link_output_has_begun) 468 (bfd *, struct coff_final_link_info *); 469 470 bfd_boolean (*_bfd_coff_final_link_postscript) 471 (bfd *, struct coff_final_link_info *); 472 473 bfd_boolean (*_bfd_coff_print_pdata) 474 (bfd *, void *); 475 476@} bfd_coff_backend_data; 477 478#define coff_backend_info(abfd) \ 479 ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) 480 481#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ 482 ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) 483 484#define bfd_coff_swap_sym_in(a,e,i) \ 485 ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) 486 487#define bfd_coff_swap_lineno_in(a,e,i) \ 488 ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) 489 490#define bfd_coff_swap_reloc_out(abfd, i, o) \ 491 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) 492 493#define bfd_coff_swap_lineno_out(abfd, i, o) \ 494 ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) 495 496#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ 497 ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) 498 499#define bfd_coff_swap_sym_out(abfd, i,o) \ 500 ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) 501 502#define bfd_coff_swap_scnhdr_out(abfd, i,o) \ 503 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o)) 504 505#define bfd_coff_swap_filehdr_out(abfd, i,o) \ 506 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) 507 508#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ 509 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) 510 511#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) 512#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) 513#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) 514#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) 515#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) 516#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) 517#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) 518#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen) 519#define bfd_coff_long_filenames(abfd) \ 520 (coff_backend_info (abfd)->_bfd_coff_long_filenames) 521#define bfd_coff_long_section_names(abfd) \ 522 (coff_backend_info (abfd)->_bfd_coff_long_section_names) 523#define bfd_coff_set_long_section_names(abfd, enable) \ 524 ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) 525#define bfd_coff_default_section_alignment_power(abfd) \ 526 (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) 527#define bfd_coff_max_nscns(abfd) \ 528 (coff_backend_info (abfd)->_bfd_coff_max_nscns) 529 530#define bfd_coff_swap_filehdr_in(abfd, i,o) \ 531 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) 532 533#define bfd_coff_swap_aouthdr_in(abfd, i,o) \ 534 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) 535 536#define bfd_coff_swap_scnhdr_in(abfd, i,o) \ 537 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) 538 539#define bfd_coff_swap_reloc_in(abfd, i, o) \ 540 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) 541 542#define bfd_coff_bad_format_hook(abfd, filehdr) \ 543 ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) 544 545#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ 546 ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) 547#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ 548 ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\ 549 (abfd, filehdr, aouthdr)) 550 551#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\ 552 ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ 553 (abfd, scnhdr, name, section, flags_ptr)) 554 555#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ 556 ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) 557 558#define bfd_coff_slurp_symbol_table(abfd)\ 559 ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) 560 561#define bfd_coff_symname_in_debug(abfd, sym)\ 562 ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) 563 564#define bfd_coff_force_symnames_in_strings(abfd)\ 565 (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings) 566 567#define bfd_coff_debug_string_prefix_length(abfd)\ 568 (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length) 569 570#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ 571 ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ 572 (abfd, file, base, symbol, aux, indaux)) 573 574#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\ 575 reloc, data, src_ptr, dst_ptr)\ 576 ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ 577 (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) 578 579#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ 580 ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ 581 (abfd, section, reloc, shrink, link_info)) 582 583#define bfd_coff_classify_symbol(abfd, sym)\ 584 ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\ 585 (abfd, sym)) 586 587#define bfd_coff_compute_section_file_positions(abfd)\ 588 ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ 589 (abfd)) 590 591#define bfd_coff_start_final_link(obfd, info)\ 592 ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ 593 (obfd, info)) 594#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ 595 ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ 596 (obfd, info, ibfd, o, con, rel, isyms, secs)) 597#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ 598 ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ 599 (abfd, sec, rel, h, sym, addendp)) 600#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ 601 ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ 602 (obfd, info, ibfd, sec, rel, adjustedp)) 603#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\ 604 value, string, cp, coll, hashp)\ 605 ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ 606 (info, abfd, name, flags, section, value, string, cp, coll, hashp)) 607 608#define bfd_coff_link_output_has_begun(a,p) \ 609 ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p)) 610#define bfd_coff_final_link_postscript(a,p) \ 611 ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p)) 612 613#define bfd_coff_have_print_pdata(a) \ 614 (coff_backend_info (a)->_bfd_coff_print_pdata) 615#define bfd_coff_print_pdata(a,p) \ 616 ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p)) 617 618/* Macro: Returns true if the bfd is a PE executable as opposed to a 619 PE object file. */ 620#define bfd_pei_p(abfd) \ 621 (CONST_STRNEQ ((abfd)->xvec->name, "pei-")) 622@end example 623@subsubsection Writing relocations 624To write relocations, the back end steps though the 625canonical relocation table and create an 626@code{internal_reloc}. The symbol index to use is removed from 627the @code{offset} field in the symbol table supplied. The 628address comes directly from the sum of the section base 629address and the relocation offset; the type is dug directly 630from the howto field. Then the @code{internal_reloc} is 631swapped into the shape of an @code{external_reloc} and written 632out to disk. 633 634@subsubsection Reading linenumbers 635Creating the linenumber table is done by reading in the entire 636coff linenumber table, and creating another table for internal use. 637 638A coff linenumber table is structured so that each function 639is marked as having a line number of 0. Each line within the 640function is an offset from the first line in the function. The 641base of the line number information for the table is stored in 642the symbol associated with the function. 643 644Note: The PE format uses line number 0 for a flag indicating a 645new source file. 646 647The information is copied from the external to the internal 648table, and each symbol which marks a function is marked by 649pointing its... 650 651How does this work ? 652 653@subsubsection Reading relocations 654Coff relocations are easily transformed into the internal BFD form 655(@code{arelent}). 656 657Reading a coff relocation table is done in the following stages: 658 659@itemize @bullet 660 661@item 662Read the entire coff relocation table into memory. 663 664@item 665Process each relocation in turn; first swap it from the 666external to the internal form. 667 668@item 669Turn the symbol referenced in the relocation's symbol index 670into a pointer into the canonical symbol table. 671This table is the same as the one returned by a call to 672@code{bfd_canonicalize_symtab}. The back end will call that 673routine and save the result if a canonicalization hasn't been done. 674 675@item 676The reloc index is turned into a pointer to a howto 677structure, in a back end specific way. For instance, the 386 678uses the @code{r_type} to directly produce an index 679into a howto table vector. 680@end itemize 681 682