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