]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/libcoff.h
Doxygenate gdbtypes.h
[thirdparty/binutils-gdb.git] / bfd / libcoff.h
CommitLineData
4eef72c7 1/* DO NOT EDIT! -*- buffer-read-only: t -*- This file is automatically
59bc061d 2 generated from "libcoff-in.h" and "coffcode.h".
4eef72c7
AM
3 Run "make headers" in your build bfd/ to regenerate. */
4
252b5132 5/* BFD COFF object file private structure.
4b95cf5c 6 Copyright (C) 1990-2014 Free Software Foundation, Inc.
252b5132
RH
7 Written by Cygnus Support.
8
7920ce38 9 This file is part of BFD, the Binary File Descriptor library.
252b5132 10
7920ce38
NC
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
cd123cb7 13 the Free Software Foundation; either version 3 of the License, or
7920ce38 14 (at your option) any later version.
252b5132 15
7920ce38
NC
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
252b5132 20
7920ce38
NC
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
cd123cb7
NC
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24 MA 02110-1301, USA. */
252b5132
RH
25
26#include "bfdlink.h"
27
7920ce38
NC
28/* Object file tdata; access macros. */
29
30#define coff_data(bfd) ((bfd)->tdata.coff_obj_data)
7920ce38
NC
31#define obj_pe(bfd) (coff_data (bfd)->pe)
32#define obj_symbols(bfd) (coff_data (bfd)->symbols)
33#define obj_sym_filepos(bfd) (coff_data (bfd)->sym_filepos)
34#define obj_relocbase(bfd) (coff_data (bfd)->relocbase)
35#define obj_raw_syments(bfd) (coff_data (bfd)->raw_syments)
36#define obj_raw_syment_count(bfd) (coff_data (bfd)->raw_syment_count)
37#define obj_convert(bfd) (coff_data (bfd)->conversion_table)
38#define obj_conv_table_size(bfd) (coff_data (bfd)->conv_table_size)
39#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms)
40#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms)
41#define obj_coff_strings(bfd) (coff_data (bfd)->strings)
42#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings)
43#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes)
d71f672e 44#define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written)
7920ce38 45#define obj_coff_local_toc_table(bfd) (coff_data (bfd)->local_toc_sym_map)
252b5132
RH
46
47/* `Tdata' information kept for COFF files. */
48
49typedef struct coff_tdata
50{
7920ce38 51 struct coff_symbol_struct *symbols; /* Symtab for input bfd. */
252b5132
RH
52 unsigned int *conversion_table;
53 int conv_table_size;
54 file_ptr sym_filepos;
55
56 struct coff_ptr_struct *raw_syments;
00692651 57 unsigned long raw_syment_count;
252b5132 58
7920ce38 59 /* These are only valid once writing has begun. */
252b5132
RH
60 long int relocbase;
61
62 /* These members communicate important constants about the symbol table
63 to GDB's symbol-reading code. These `constants' unfortunately vary
64 from coff implementation to implementation... */
65 unsigned local_n_btmask;
66 unsigned local_n_btshft;
67 unsigned local_n_tmask;
68 unsigned local_n_tshift;
69 unsigned local_symesz;
70 unsigned local_auxesz;
71 unsigned local_linesz;
72
73 /* The unswapped external symbols. May be NULL. Read by
74 _bfd_coff_get_external_symbols. */
7920ce38 75 void * external_syms;
b34976b6
AM
76 /* If this is TRUE, the external_syms may not be freed. */
77 bfd_boolean keep_syms;
252b5132
RH
78
79 /* The string table. May be NULL. Read by
80 _bfd_coff_read_string_table. */
81 char *strings;
b34976b6
AM
82 /* If this is TRUE, the strings may not be freed. */
83 bfd_boolean keep_strings;
84 /* If this is TRUE, the strings have been written out already. */
85 bfd_boolean strings_written;
252b5132 86
7920ce38 87 /* Is this a PE format coff file? */
252b5132
RH
88 int pe;
89 /* Used by the COFF backend linker. */
90 struct coff_link_hash_entry **sym_hashes;
91
7920ce38 92 /* Used by the pe linker for PowerPC. */
252b5132
RH
93 int *local_toc_sym_map;
94
95 struct bfd_link_info *link_info;
96
97 /* Used by coff_find_nearest_line. */
7920ce38 98 void * line_info;
252b5132 99
7920ce38
NC
100 /* A place to stash dwarf2 info for this bfd. */
101 void * dwarf2_find_line_info;
51db3708 102
00692651
ILT
103 /* The timestamp from the COFF file header. */
104 long timestamp;
105
252b5132
RH
106 /* Copy of some of the f_flags bits in the COFF filehdr structure,
107 used by ARM code. */
108 flagword flags;
109
9bf609ec
JK
110 /* coff-stgo32 EXE stub header after BFD tdata has been allocated. Its data
111 is kept in internal_filehdr.go32stub beforehand. */
112 char *go32stub;
252b5132
RH
113} coff_data_type;
114
7920ce38 115/* Tdata for pe image files. */
252b5132
RH
116typedef struct pe_tdata
117{
118 coff_data_type coff;
119 struct internal_extra_pe_aouthdr pe_opthdr;
120 int dll;
121 int has_reloc_section;
441f34fa 122 int dont_strip_reloc;
0cb112f7 123 bfd_boolean insert_timestamp;
7920ce38 124 bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
252b5132
RH
125 flagword real_flags;
126} pe_data_type;
127
128#define pe_data(bfd) ((bfd)->tdata.pe_obj_data)
129
130/* Tdata for XCOFF files. */
131
132struct xcoff_tdata
133{
134 /* Basic COFF information. */
135 coff_data_type coff;
136
b34976b6
AM
137 /* TRUE if this is an XCOFF64 file. */
138 bfd_boolean xcoff64;
a2fdf270 139
b34976b6
AM
140 /* TRUE if a large a.out header should be generated. */
141 bfd_boolean full_aouthdr;
252b5132
RH
142
143 /* TOC value. */
144 bfd_vma toc;
145
146 /* Index of section holding TOC. */
147 int sntoc;
148
149 /* Index of section holding entry point. */
150 int snentry;
151
152 /* .text alignment from optional header. */
153 int text_align_power;
154
155 /* .data alignment from optional header. */
156 int data_align_power;
157
158 /* modtype from optional header. */
159 short modtype;
160
161 /* cputype from optional header. */
162 short cputype;
163
164 /* maxdata from optional header. */
f34d8777 165 bfd_vma maxdata;
252b5132
RH
166
167 /* maxstack from optional header. */
f34d8777 168 bfd_vma maxstack;
252b5132
RH
169
170 /* Used by the XCOFF backend linker. */
171 asection **csects;
e450936a 172 long *debug_indices;
3df13c4a 173 unsigned int *lineno_counts;
252b5132
RH
174 unsigned int import_file_id;
175};
176
177#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data)
178
08da05b0 179/* We take the address of the first element of an asymbol to ensure that the
7920ce38 180 macro is only ever applied to an asymbol. */
252b5132
RH
181#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd)))
182
183/* The used_by_bfd field of a section may be set to a pointer to this
184 structure. */
185
186struct coff_section_tdata
187{
188 /* The relocs, swapped into COFF internal form. This may be NULL. */
189 struct internal_reloc *relocs;
b34976b6
AM
190 /* If this is TRUE, the relocs entry may not be freed. */
191 bfd_boolean keep_relocs;
252b5132
RH
192 /* The section contents. This may be NULL. */
193 bfd_byte *contents;
b34976b6
AM
194 /* If this is TRUE, the contents entry may not be freed. */
195 bfd_boolean keep_contents;
252b5132
RH
196 /* Information cached by coff_find_nearest_line. */
197 bfd_vma offset;
198 unsigned int i;
199 const char *function;
082b7297
L
200 /* Optional information about a COMDAT entry; NULL if not COMDAT. */
201 struct coff_comdat_info *comdat;
252b5132
RH
202 int line_base;
203 /* A pointer used for .stab linking optimizations. */
7920ce38 204 void * stab_info;
252b5132 205 /* Available for individual backends. */
7920ce38 206 void * tdata;
252b5132
RH
207};
208
209/* An accessor macro for the coff_section_tdata structure. */
210#define coff_section_data(abfd, sec) \
211 ((struct coff_section_tdata *) (sec)->used_by_bfd)
212
213/* Tdata for sections in XCOFF files. This is used by the linker. */
214
215struct xcoff_section_tdata
216{
217 /* Used for XCOFF csects created by the linker; points to the real
218 XCOFF section which contains this csect. */
219 asection *enclosing;
220 /* The lineno_count field for the enclosing section, because we are
221 going to clobber it there. */
222 unsigned int lineno_count;
4cc02a02 223 /* The first and last symbol indices for symbols used by this csect. */
252b5132
RH
224 unsigned long first_symndx;
225 unsigned long last_symndx;
226};
227
228/* An accessor macro the xcoff_section_tdata structure. */
229#define xcoff_section_data(abfd, sec) \
230 ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
231
8d3ad4e1 232/* Tdata for sections in PE files. */
252b5132
RH
233
234struct pei_section_tdata
235{
236 /* The virtual size of the section. */
237 bfd_size_type virt_size;
8d3ad4e1
ILT
238 /* The PE section flags. */
239 long pe_flags;
252b5132
RH
240};
241
242/* An accessor macro for the pei_section_tdata structure. */
243#define pei_section_data(abfd, sec) \
244 ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
245
246/* COFF linker hash table entries. */
247
248struct coff_link_hash_entry
249{
250 struct bfd_link_hash_entry root;
251
252 /* Symbol index in output file. Set to -1 initially. Set to -2 if
253 there is a reloc against this symbol. */
254 long indx;
255
256 /* Symbol type. */
257 unsigned short type;
258
259 /* Symbol class. */
96d56e9f 260 unsigned char symbol_class;
252b5132
RH
261
262 /* Number of auxiliary entries. */
263 char numaux;
264
265 /* BFD to take auxiliary entries from. */
266 bfd *auxbfd;
267
268 /* Pointer to array of auxiliary entries, if any. */
269 union internal_auxent *aux;
7fd9c191
ILT
270
271 /* Flag word; legal values follow. */
272 unsigned short coff_link_hash_flags;
273 /* Symbol is a PE section symbol. */
274#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01)
252b5132
RH
275};
276
277/* COFF linker hash table. */
278
279struct coff_link_hash_table
280{
281 struct bfd_link_hash_table root;
282 /* A pointer to information used to link stabs in sections. */
3722b82f 283 struct stab_info stab_info;
252b5132
RH
284};
285
286/* Look up an entry in a COFF linker hash table. */
287
288#define coff_link_hash_lookup(table, string, create, copy, follow) \
289 ((struct coff_link_hash_entry *) \
290 bfd_link_hash_lookup (&(table)->root, (string), (create), \
291 (copy), (follow)))
292
293/* Traverse a COFF linker hash table. */
294
295#define coff_link_hash_traverse(table, func, info) \
296 (bfd_link_hash_traverse \
297 (&(table)->root, \
7920ce38 298 (bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func), \
252b5132
RH
299 (info)))
300
301/* Get the COFF linker hash table from a link_info structure. */
302
303#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash))
304
305/* Functions in coffgen.c. */
dc810e39 306extern const bfd_target *coff_object_p
7920ce38 307 (bfd *);
198beae2 308extern struct bfd_section *coff_section_from_bfd_index
7920ce38 309 (bfd *, int);
dc810e39 310extern long coff_get_symtab_upper_bound
7920ce38 311 (bfd *);
6cee3f79 312extern long coff_canonicalize_symtab
7920ce38 313 (bfd *, asymbol **);
dc810e39 314extern int coff_count_linenumbers
7920ce38 315 (bfd *);
dc810e39 316extern struct coff_symbol_struct *coff_symbol_from
7920ce38 317 (bfd *, asymbol *);
b34976b6 318extern bfd_boolean coff_renumber_symbols
7920ce38 319 (bfd *, int *);
dc810e39 320extern void coff_mangle_symbols
7920ce38 321 (bfd *);
b34976b6 322extern bfd_boolean coff_write_symbols
7920ce38 323 (bfd *);
e7ebb214
JB
324extern bfd_boolean coff_write_alien_symbol
325 (bfd *, asymbol *, struct internal_syment *, bfd_vma *,
326 bfd_size_type *, asection **, bfd_size_type *);
b34976b6 327extern bfd_boolean coff_write_linenumbers
7920ce38 328 (bfd *);
dc810e39 329extern alent *coff_get_lineno
7920ce38 330 (bfd *, asymbol *);
dc810e39 331extern asymbol *coff_section_symbol
7920ce38 332 (bfd *, char *);
b34976b6 333extern bfd_boolean _bfd_coff_get_external_symbols
7920ce38 334 (bfd *);
dc810e39 335extern const char *_bfd_coff_read_string_table
7920ce38 336 (bfd *);
b34976b6 337extern bfd_boolean _bfd_coff_free_symbols
7920ce38 338 (bfd *);
dc810e39 339extern struct coff_ptr_struct *coff_get_normalized_symtab
7920ce38 340 (bfd *);
dc810e39 341extern long coff_get_reloc_upper_bound
7920ce38 342 (bfd *, sec_ptr);
dc810e39 343extern asymbol *coff_make_empty_symbol
7920ce38 344 (bfd *);
dc810e39 345extern void coff_print_symbol
7920ce38 346 (bfd *, void * filep, asymbol *, bfd_print_symbol_type);
dc810e39 347extern void coff_get_symbol_info
7920ce38 348 (bfd *, asymbol *, symbol_info *ret);
b34976b6 349extern bfd_boolean _bfd_coff_is_local_label_name
7920ce38 350 (bfd *, const char *);
dc810e39 351extern asymbol *coff_bfd_make_debug_symbol
7920ce38 352 (bfd *, void *, unsigned long);
b34976b6 353extern bfd_boolean coff_find_nearest_line
7920ce38
NC
354 (bfd *, asection *, asymbol **, bfd_vma, const char **,
355 const char **, unsigned int *);
a29a8af8
KT
356extern bfd_boolean coff_find_nearest_line_discriminator
357 (bfd *, asection *, asymbol **, bfd_vma, const char **,
358 const char **, unsigned int *, unsigned int *);
fc28f9aa
TG
359struct dwarf_debug_section;
360extern bfd_boolean coff_find_nearest_line_with_names
361 (bfd *, const struct dwarf_debug_section *, asection *, asymbol **,
362 bfd_vma, const char **, const char **, unsigned int *);
4ab527b0
FF
363extern bfd_boolean coff_find_inliner_info
364 (bfd *, const char **, const char **, unsigned int *);
dc810e39 365extern int coff_sizeof_headers
a6b96beb 366 (bfd *, struct bfd_link_info *);
b34976b6 367extern bfd_boolean bfd_coff_reloc16_relax_section
7920ce38 368 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
252b5132 369extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents
7920ce38
NC
370 (bfd *, struct bfd_link_info *, struct bfd_link_order *,
371 bfd_byte *, bfd_boolean, asymbol **);
dc810e39 372extern bfd_vma bfd_coff_reloc16_get_value
7920ce38 373 (arelent *, struct bfd_link_info *, asection *);
dc810e39 374extern void bfd_perform_slip
7920ce38 375 (bfd *, unsigned int, asection *, bfd_vma);
252b5132
RH
376
377/* Functions and types in cofflink.c. */
378
ceae3e33 379#define STRING_SIZE_SIZE 4
252b5132
RH
380
381/* We use a hash table to merge identical enum, struct, and union
382 definitions in the linker. */
383
384/* Information we keep for a single element (an enum value, a
385 structure or union field) in the debug merge hash table. */
386
387struct coff_debug_merge_element
388{
389 /* Next element. */
390 struct coff_debug_merge_element *next;
391
392 /* Name. */
393 const char *name;
394
395 /* Type. */
396 unsigned int type;
397
398 /* Symbol index for complex type. */
399 long tagndx;
400};
401
402/* A linked list of debug merge entries for a given name. */
403
404struct coff_debug_merge_type
405{
406 /* Next type with the same name. */
407 struct coff_debug_merge_type *next;
408
409 /* Class of type. */
96d56e9f 410 int type_class;
252b5132
RH
411
412 /* Symbol index where this type is defined. */
413 long indx;
414
415 /* List of elements. */
416 struct coff_debug_merge_element *elements;
417};
418
419/* Information we store in the debug merge hash table. */
420
421struct coff_debug_merge_hash_entry
422{
423 struct bfd_hash_entry root;
424
425 /* A list of types with this name. */
426 struct coff_debug_merge_type *types;
427};
428
429/* The debug merge hash table. */
430
431struct coff_debug_merge_hash_table
432{
433 struct bfd_hash_table root;
434};
435
436/* Initialize a COFF debug merge hash table. */
437
438#define coff_debug_merge_hash_table_init(table) \
66eb6687
AM
439 (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc, \
440 sizeof (struct coff_debug_merge_hash_entry)))
252b5132
RH
441
442/* Free a COFF debug merge hash table. */
443
444#define coff_debug_merge_hash_table_free(table) \
445 (bfd_hash_table_free (&(table)->root))
446
447/* Look up an entry in a COFF debug merge hash table. */
448
449#define coff_debug_merge_hash_lookup(table, string, create, copy) \
450 ((struct coff_debug_merge_hash_entry *) \
451 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
452
453/* Information we keep for each section in the output file when doing
1049f94e 454 a relocatable link. */
252b5132
RH
455
456struct coff_link_section_info
457{
458 /* The relocs to be output. */
459 struct internal_reloc *relocs;
460 /* For each reloc against a global symbol whose index was not known
461 when the reloc was handled, the global hash table entry. */
462 struct coff_link_hash_entry **rel_hashes;
463};
464
465/* Information that we pass around while doing the final link step. */
466
467struct coff_final_link_info
468{
469 /* General link information. */
470 struct bfd_link_info *info;
471 /* Output BFD. */
472 bfd *output_bfd;
473 /* Used to indicate failure in traversal routine. */
b34976b6 474 bfd_boolean failed;
252b5132
RH
475 /* If doing "task linking" set only during the time when we want the
476 global symbol writer to convert the storage class of defined global
477 symbols from global to static. */
b34976b6 478 bfd_boolean global_to_static;
252b5132
RH
479 /* Hash table for long symbol names. */
480 struct bfd_strtab_hash *strtab;
1049f94e 481 /* When doing a relocatable link, an array of information kept for
252b5132
RH
482 each output section, indexed by the target_index field. */
483 struct coff_link_section_info *section_info;
484 /* Symbol index of last C_FILE symbol (-1 if none). */
485 long last_file_index;
486 /* Contents of last C_FILE symbol. */
487 struct internal_syment last_file;
488 /* Symbol index of first aux entry of last .bf symbol with an empty
489 endndx field (-1 if none). */
490 long last_bf_index;
491 /* Contents of last_bf_index aux entry. */
492 union internal_auxent last_bf;
493 /* Hash table used to merge debug information. */
494 struct coff_debug_merge_hash_table debug_merge;
495 /* Buffer large enough to hold swapped symbols of any input file. */
496 struct internal_syment *internal_syms;
497 /* Buffer large enough to hold sections of symbols of any input file. */
498 asection **sec_ptrs;
499 /* Buffer large enough to hold output indices of symbols of any
500 input file. */
501 long *sym_indices;
502 /* Buffer large enough to hold output symbols for any input file. */
503 bfd_byte *outsyms;
504 /* Buffer large enough to hold external line numbers for any input
505 section. */
506 bfd_byte *linenos;
507 /* Buffer large enough to hold any input section. */
508 bfd_byte *contents;
509 /* Buffer large enough to hold external relocs of any input section. */
510 bfd_byte *external_relocs;
511 /* Buffer large enough to hold swapped relocs of any input section. */
512 struct internal_reloc *internal_relocs;
513};
514
5dccc1dd
ILT
515/* Most COFF variants have no way to record the alignment of a
516 section. This struct is used to set a specific alignment based on
517 the name of the section. */
518
519struct coff_section_alignment_entry
520{
521 /* The section name. */
522 const char *name;
523
524 /* This is either (unsigned int) -1, indicating that the section
525 name must match exactly, or it is the number of letters which
526 must match at the start of the name. */
527 unsigned int comparison_length;
528
529 /* These macros may be used to fill in the first two fields in a
530 structure initialization. */
531#define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1)
532#define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1)
533
534 /* Only use this entry if the default section alignment for this
535 target is at least that much (as a power of two). If this field
536 is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
537 unsigned int default_alignment_min;
538
539 /* Only use this entry if the default section alignment for this
540 target is no greater than this (as a power of two). If this
541 field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
542 unsigned int default_alignment_max;
543
544#define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1)
545
546 /* The desired alignment for this section (as a power of two). */
547 unsigned int alignment_power;
548};
549
252b5132 550extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc
7920ce38 551 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
b34976b6 552extern bfd_boolean _bfd_coff_link_hash_table_init
7920ce38
NC
553 (struct coff_link_hash_table *, bfd *,
554 struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
555 struct bfd_hash_table *,
66eb6687
AM
556 const char *),
557 unsigned int);
252b5132 558extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create
7920ce38 559 (bfd *);
252b5132 560extern const char *_bfd_coff_internal_syment_name
7920ce38 561 (bfd *, const struct internal_syment *, char *);
c77ec726
AM
562extern bfd_boolean _bfd_coff_section_already_linked
563 (bfd *, asection *, struct bfd_link_info *);
b34976b6 564extern bfd_boolean _bfd_coff_link_add_symbols
7920ce38 565 (bfd *, struct bfd_link_info *);
b34976b6 566extern bfd_boolean _bfd_coff_final_link
7920ce38 567 (bfd *, struct bfd_link_info *);
252b5132 568extern struct internal_reloc *_bfd_coff_read_internal_relocs
7920ce38
NC
569 (bfd *, asection *, bfd_boolean, bfd_byte *, bfd_boolean,
570 struct internal_reloc *);
b34976b6 571extern bfd_boolean _bfd_coff_generic_relocate_section
7920ce38
NC
572 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
573 struct internal_reloc *, struct internal_syment *, asection **);
252b5132 574extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc
7920ce38 575 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
b34976b6 576extern bfd_boolean _bfd_coff_write_global_sym
7686d77d 577 (struct bfd_hash_entry *, void *);
b34976b6 578extern bfd_boolean _bfd_coff_write_task_globals
7920ce38 579 (struct coff_link_hash_entry *, void *);
b34976b6 580extern bfd_boolean _bfd_coff_link_input_bfd
7920ce38 581 (struct coff_final_link_info *, bfd *);
b34976b6 582extern bfd_boolean _bfd_coff_reloc_link_order
7920ce38
NC
583 (bfd *, struct coff_final_link_info *, asection *,
584 struct bfd_link_order *);
252b5132
RH
585
586
587#define coff_get_section_contents_in_window \
588 _bfd_generic_get_section_contents_in_window
589
f34d8777
L
590/* Functions in xcofflink.c. */
591
dc810e39 592extern long _bfd_xcoff_get_dynamic_symtab_upper_bound
7920ce38 593 (bfd *);
f34d8777 594extern long _bfd_xcoff_canonicalize_dynamic_symtab
7920ce38 595 (bfd *, asymbol **);
dc810e39 596extern long _bfd_xcoff_get_dynamic_reloc_upper_bound
7920ce38 597 (bfd *);
f34d8777 598extern long _bfd_xcoff_canonicalize_dynamic_reloc
7920ce38 599 (bfd *, arelent **, asymbol **);
f34d8777 600extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create
7920ce38 601 (bfd *);
e2d34d7d 602extern void _bfd_xcoff_bfd_link_hash_table_free
7920ce38 603 (struct bfd_link_hash_table *);
b34976b6 604extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols
7920ce38 605 (bfd *, struct bfd_link_info *);
b34976b6 606extern bfd_boolean _bfd_xcoff_bfd_final_link
7920ce38 607 (bfd *, struct bfd_link_info *);
3023e3f6
RS
608extern bfd_boolean _bfd_xcoff_define_common_symbol
609 (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *);
b34976b6 610extern bfd_boolean _bfd_ppc_xcoff_relocate_section
7920ce38
NC
611 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
612 struct internal_reloc *, struct internal_syment *, asection **);
f34d8777 613
88183869 614/* Functions in coff-ppc.c. FIXME: These are called by pe.em in the
252b5132
RH
615 linker, and so should start with bfd and be declared in bfd.h. */
616
b34976b6 617extern bfd_boolean ppc_allocate_toc_section
7920ce38 618 (struct bfd_link_info *);
b34976b6 619extern bfd_boolean ppc_process_before_allocation
7920ce38 620 (bfd *, struct bfd_link_info *);
e61463e1 621/* Extracted from coffcode.h. */
252b5132
RH
622typedef struct coff_ptr_struct
623{
dc810e39
AM
624 /* Remembers the offset from the first symbol in the file for
625 this symbol. Generated by coff_renumber_symbols. */
626 unsigned int offset;
627
628 /* Should the value of this symbol be renumbered. Used for
629 XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
630 unsigned int fix_value : 1;
631
632 /* Should the tag field of this symbol be renumbered.
633 Created by coff_pointerize_aux. */
634 unsigned int fix_tag : 1;
635
636 /* Should the endidx field of this symbol be renumbered.
637 Created by coff_pointerize_aux. */
638 unsigned int fix_end : 1;
639
640 /* Should the x_csect.x_scnlen field be renumbered.
641 Created by coff_pointerize_aux. */
642 unsigned int fix_scnlen : 1;
643
644 /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
645 index into the line number entries. Set by coff_slurp_symbol_table. */
646 unsigned int fix_line : 1;
647
648 /* The container for the symbol structure as read and translated
649 from the file. */
650 union
651 {
652 union internal_auxent auxent;
653 struct internal_syment syment;
654 } u;
252b5132
RH
655} combined_entry_type;
656
657
52b219b5 658/* Each canonical asymbol really looks like this: */
252b5132
RH
659
660typedef struct coff_symbol_struct
661{
dc810e39
AM
662 /* The actual symbol which the rest of BFD works with */
663 asymbol symbol;
252b5132 664
dc810e39
AM
665 /* A pointer to the hidden information for this symbol */
666 combined_entry_type *native;
252b5132 667
dc810e39
AM
668 /* A pointer to the linenumber information for this symbol */
669 struct lineno_cache_entry *lineno;
252b5132 670
dc810e39 671 /* Have the line numbers been relocated yet ? */
b34976b6 672 bfd_boolean done_lineno;
252b5132 673} coff_symbol_type;
52b219b5 674/* COFF symbol classifications. */
5d54c628
ILT
675
676enum coff_symbol_classification
677{
52b219b5 678 /* Global symbol. */
5d54c628 679 COFF_SYMBOL_GLOBAL,
52b219b5 680 /* Common symbol. */
5d54c628 681 COFF_SYMBOL_COMMON,
52b219b5 682 /* Undefined symbol. */
5d54c628 683 COFF_SYMBOL_UNDEFINED,
52b219b5 684 /* Local symbol. */
5d54c628 685 COFF_SYMBOL_LOCAL,
52b219b5 686 /* PE section symbol. */
5d54c628
ILT
687 COFF_SYMBOL_PE_SECTION
688};
689
252b5132
RH
690typedef struct
691{
dc810e39 692 void (*_bfd_coff_swap_aux_in)
7920ce38 693 (bfd *, void *, int, int, int, int, void *);
dc810e39
AM
694
695 void (*_bfd_coff_swap_sym_in)
7920ce38 696 (bfd *, void *, void *);
dc810e39
AM
697
698 void (*_bfd_coff_swap_lineno_in)
7920ce38 699 (bfd *, void *, void *);
dc810e39
AM
700
701 unsigned int (*_bfd_coff_swap_aux_out)
7920ce38 702 (bfd *, void *, int, int, int, int, void *);
dc810e39
AM
703
704 unsigned int (*_bfd_coff_swap_sym_out)
7920ce38 705 (bfd *, void *, void *);
dc810e39
AM
706
707 unsigned int (*_bfd_coff_swap_lineno_out)
7920ce38 708 (bfd *, void *, void *);
dc810e39
AM
709
710 unsigned int (*_bfd_coff_swap_reloc_out)
7920ce38 711 (bfd *, void *, void *);
dc810e39
AM
712
713 unsigned int (*_bfd_coff_swap_filehdr_out)
7920ce38 714 (bfd *, void *, void *);
dc810e39
AM
715
716 unsigned int (*_bfd_coff_swap_aouthdr_out)
7920ce38 717 (bfd *, void *, void *);
dc810e39
AM
718
719 unsigned int (*_bfd_coff_swap_scnhdr_out)
7920ce38 720 (bfd *, void *, void *);
dc810e39
AM
721
722 unsigned int _bfd_filhsz;
723 unsigned int _bfd_aoutsz;
724 unsigned int _bfd_scnhsz;
725 unsigned int _bfd_symesz;
726 unsigned int _bfd_auxesz;
727 unsigned int _bfd_relsz;
728 unsigned int _bfd_linesz;
729 unsigned int _bfd_filnmlen;
b34976b6 730 bfd_boolean _bfd_coff_long_filenames;
88183869 731
b34976b6 732 bfd_boolean _bfd_coff_long_section_names;
88183869
DK
733 bfd_boolean (*_bfd_coff_set_long_section_names)
734 (bfd *, int);
68ffbac6 735
dc810e39 736 unsigned int _bfd_coff_default_section_alignment_power;
b34976b6 737 bfd_boolean _bfd_coff_force_symnames_in_strings;
dc810e39
AM
738 unsigned int _bfd_coff_debug_string_prefix_length;
739
740 void (*_bfd_coff_swap_filehdr_in)
7920ce38 741 (bfd *, void *, void *);
dc810e39
AM
742
743 void (*_bfd_coff_swap_aouthdr_in)
7920ce38 744 (bfd *, void *, void *);
dc810e39
AM
745
746 void (*_bfd_coff_swap_scnhdr_in)
7920ce38 747 (bfd *, void *, void *);
dc810e39
AM
748
749 void (*_bfd_coff_swap_reloc_in)
7920ce38 750 (bfd *abfd, void *, void *);
dc810e39 751
b34976b6 752 bfd_boolean (*_bfd_coff_bad_format_hook)
7920ce38 753 (bfd *, void *);
dc810e39 754
b34976b6 755 bfd_boolean (*_bfd_coff_set_arch_mach_hook)
7920ce38 756 (bfd *, void *);
dc810e39 757
7920ce38
NC
758 void * (*_bfd_coff_mkobject_hook)
759 (bfd *, void *, void *);
dc810e39 760
b34976b6 761 bfd_boolean (*_bfd_styp_to_sec_flags_hook)
7920ce38 762 (bfd *, void *, const char *, asection *, flagword *);
dc810e39
AM
763
764 void (*_bfd_set_alignment_hook)
7920ce38 765 (bfd *, asection *, void *);
dc810e39 766
b34976b6 767 bfd_boolean (*_bfd_coff_slurp_symbol_table)
7920ce38 768 (bfd *);
dc810e39 769
b34976b6 770 bfd_boolean (*_bfd_coff_symname_in_debug)
7920ce38 771 (bfd *, struct internal_syment *);
dc810e39 772
b34976b6 773 bfd_boolean (*_bfd_coff_pointerize_aux_hook)
7920ce38
NC
774 (bfd *, combined_entry_type *, combined_entry_type *,
775 unsigned int, combined_entry_type *);
dc810e39 776
b34976b6 777 bfd_boolean (*_bfd_coff_print_aux)
7920ce38
NC
778 (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
779 combined_entry_type *, unsigned int);
dc810e39
AM
780
781 void (*_bfd_coff_reloc16_extra_cases)
7920ce38
NC
782 (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
783 bfd_byte *, unsigned int *, unsigned int *);
dc810e39
AM
784
785 int (*_bfd_coff_reloc16_estimate)
7920ce38
NC
786 (bfd *, asection *, arelent *, unsigned int,
787 struct bfd_link_info *);
dc810e39
AM
788
789 enum coff_symbol_classification (*_bfd_coff_classify_symbol)
7920ce38 790 (bfd *, struct internal_syment *);
dc810e39 791
b34976b6 792 bfd_boolean (*_bfd_coff_compute_section_file_positions)
7920ce38 793 (bfd *);
dc810e39 794
b34976b6 795 bfd_boolean (*_bfd_coff_start_final_link)
7920ce38 796 (bfd *, struct bfd_link_info *);
dc810e39 797
b34976b6 798 bfd_boolean (*_bfd_coff_relocate_section)
7920ce38
NC
799 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
800 struct internal_reloc *, struct internal_syment *, asection **);
dc810e39
AM
801
802 reloc_howto_type *(*_bfd_coff_rtype_to_howto)
7920ce38 803 (bfd *, asection *, struct internal_reloc *,
dc810e39 804 struct coff_link_hash_entry *, struct internal_syment *,
7920ce38 805 bfd_vma *);
dc810e39 806
b34976b6 807 bfd_boolean (*_bfd_coff_adjust_symndx)
7920ce38
NC
808 (bfd *, struct bfd_link_info *, bfd *, asection *,
809 struct internal_reloc *, bfd_boolean *);
dc810e39 810
b34976b6 811 bfd_boolean (*_bfd_coff_link_add_one_symbol)
7920ce38 812 (struct bfd_link_info *, bfd *, const char *, flagword,
b34976b6 813 asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
7920ce38 814 struct bfd_link_hash_entry **);
dc810e39 815
b34976b6 816 bfd_boolean (*_bfd_coff_link_output_has_begun)
7920ce38 817 (bfd *, struct coff_final_link_info *);
dc810e39 818
b34976b6 819 bfd_boolean (*_bfd_coff_final_link_postscript)
7920ce38 820 (bfd *, struct coff_final_link_info *);
252b5132 821
2b5c217d
NC
822 bfd_boolean (*_bfd_coff_print_pdata)
823 (bfd *, void *);
824
252b5132
RH
825} bfd_coff_backend_data;
826
dc810e39
AM
827#define coff_backend_info(abfd) \
828 ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
252b5132
RH
829
830#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
dc810e39 831 ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
252b5132
RH
832
833#define bfd_coff_swap_sym_in(a,e,i) \
dc810e39 834 ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
252b5132
RH
835
836#define bfd_coff_swap_lineno_in(a,e,i) \
dc810e39 837 ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
252b5132
RH
838
839#define bfd_coff_swap_reloc_out(abfd, i, o) \
dc810e39 840 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
252b5132
RH
841
842#define bfd_coff_swap_lineno_out(abfd, i, o) \
dc810e39 843 ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
252b5132
RH
844
845#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
dc810e39 846 ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
252b5132
RH
847
848#define bfd_coff_swap_sym_out(abfd, i,o) \
dc810e39 849 ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
252b5132
RH
850
851#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
dc810e39 852 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
252b5132
RH
853
854#define bfd_coff_swap_filehdr_out(abfd, i,o) \
dc810e39 855 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
252b5132
RH
856
857#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
dc810e39 858 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
252b5132
RH
859
860#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
861#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
862#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
863#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
864#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
865#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
866#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
692b7d62 867#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
dc810e39
AM
868#define bfd_coff_long_filenames(abfd) \
869 (coff_backend_info (abfd)->_bfd_coff_long_filenames)
252b5132 870#define bfd_coff_long_section_names(abfd) \
dc810e39 871 (coff_backend_info (abfd)->_bfd_coff_long_section_names)
88183869
DK
872#define bfd_coff_set_long_section_names(abfd, enable) \
873 ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
252b5132 874#define bfd_coff_default_section_alignment_power(abfd) \
dc810e39 875 (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
252b5132 876#define bfd_coff_swap_filehdr_in(abfd, i,o) \
dc810e39 877 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
252b5132
RH
878
879#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
dc810e39 880 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
252b5132
RH
881
882#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
dc810e39 883 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
252b5132
RH
884
885#define bfd_coff_swap_reloc_in(abfd, i, o) \
dc810e39 886 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
252b5132
RH
887
888#define bfd_coff_bad_format_hook(abfd, filehdr) \
dc810e39 889 ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
252b5132
RH
890
891#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
dc810e39 892 ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
252b5132 893#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
ed781d5d
NC
894 ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
895 (abfd, filehdr, aouthdr))
252b5132 896
7c8ca0e4 897#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
dc810e39
AM
898 ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
899 (abfd, scnhdr, name, section, flags_ptr))
252b5132
RH
900
901#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
dc810e39 902 ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
252b5132
RH
903
904#define bfd_coff_slurp_symbol_table(abfd)\
dc810e39 905 ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
252b5132
RH
906
907#define bfd_coff_symname_in_debug(abfd, sym)\
dc810e39 908 ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
252b5132 909
7f6d05e8 910#define bfd_coff_force_symnames_in_strings(abfd)\
dc810e39 911 (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
7f6d05e8
CP
912
913#define bfd_coff_debug_string_prefix_length(abfd)\
dc810e39 914 (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
7f6d05e8 915
252b5132 916#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
dc810e39
AM
917 ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
918 (abfd, file, base, symbol, aux, indaux))
252b5132 919
ed781d5d
NC
920#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
921 reloc, data, src_ptr, dst_ptr)\
dc810e39
AM
922 ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
923 (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
252b5132
RH
924
925#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
dc810e39
AM
926 ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
927 (abfd, section, reloc, shrink, link_info))
252b5132 928
5d54c628 929#define bfd_coff_classify_symbol(abfd, sym)\
dc810e39
AM
930 ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
931 (abfd, sym))
252b5132
RH
932
933#define bfd_coff_compute_section_file_positions(abfd)\
dc810e39
AM
934 ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
935 (abfd))
252b5132
RH
936
937#define bfd_coff_start_final_link(obfd, info)\
dc810e39
AM
938 ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
939 (obfd, info))
252b5132 940#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
dc810e39
AM
941 ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
942 (obfd, info, ibfd, o, con, rel, isyms, secs))
252b5132 943#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
dc810e39
AM
944 ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
945 (abfd, sec, rel, h, sym, addendp))
252b5132 946#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
dc810e39
AM
947 ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
948 (obfd, info, ibfd, sec, rel, adjustedp))
ed781d5d
NC
949#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
950 value, string, cp, coll, hashp)\
dc810e39
AM
951 ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
952 (info, abfd, name, flags, section, value, string, cp, coll, hashp))
252b5132
RH
953
954#define bfd_coff_link_output_has_begun(a,p) \
7920ce38 955 ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
252b5132 956#define bfd_coff_final_link_postscript(a,p) \
7920ce38 957 ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
252b5132 958
2b5c217d
NC
959#define bfd_coff_have_print_pdata(a) \
960 (coff_backend_info (a)->_bfd_coff_print_pdata)
961#define bfd_coff_print_pdata(a,p) \
962 ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
963
92dd4511
L
964/* Macro: Returns true if the bfd is a PE executable as opposed to a
965 PE object file. */
966#define bfd_pei_p(abfd) \
967 (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))