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