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