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