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