Fix typo in f7f2534e
[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. */
bad1a9f7 60 unsigned long int relocbase;
252b5132
RH
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 126
e30d16e9 127 /* Build-id info. */
61e2488c
JT
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 *);
b34976b6 610extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols
7920ce38 611 (bfd *, struct bfd_link_info *);
b34976b6 612extern bfd_boolean _bfd_xcoff_bfd_final_link
7920ce38 613 (bfd *, struct bfd_link_info *);
3023e3f6
RS
614extern bfd_boolean _bfd_xcoff_define_common_symbol
615 (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *);
b34976b6 616extern bfd_boolean _bfd_ppc_xcoff_relocate_section
7920ce38
NC
617 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
618 struct internal_reloc *, struct internal_syment *, asection **);
f34d8777 619
88183869 620/* Functions in coff-ppc.c. FIXME: These are called by pe.em in the
252b5132
RH
621 linker, and so should start with bfd and be declared in bfd.h. */
622
b34976b6 623extern bfd_boolean ppc_allocate_toc_section
7920ce38 624 (struct bfd_link_info *);
b34976b6 625extern bfd_boolean ppc_process_before_allocation
7920ce38 626 (bfd *, struct bfd_link_info *);
e61463e1 627/* Extracted from coffcode.h. */
aaffae57 628
252b5132
RH
629typedef struct coff_ptr_struct
630{
dc810e39
AM
631 /* Remembers the offset from the first symbol in the file for
632 this symbol. Generated by coff_renumber_symbols. */
633 unsigned int offset;
634
635 /* Should the value of this symbol be renumbered. Used for
636 XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
637 unsigned int fix_value : 1;
638
639 /* Should the tag field of this symbol be renumbered.
640 Created by coff_pointerize_aux. */
641 unsigned int fix_tag : 1;
642
643 /* Should the endidx field of this symbol be renumbered.
644 Created by coff_pointerize_aux. */
645 unsigned int fix_end : 1;
646
647 /* Should the x_csect.x_scnlen field be renumbered.
648 Created by coff_pointerize_aux. */
649 unsigned int fix_scnlen : 1;
650
651 /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
652 index into the line number entries. Set by coff_slurp_symbol_table. */
653 unsigned int fix_line : 1;
654
655 /* The container for the symbol structure as read and translated
656 from the file. */
657 union
658 {
659 union internal_auxent auxent;
660 struct internal_syment syment;
661 } u;
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
252b5132
RH
697typedef struct
698{
dc810e39 699 void (*_bfd_coff_swap_aux_in)
7920ce38 700 (bfd *, void *, int, int, int, int, void *);
dc810e39
AM
701
702 void (*_bfd_coff_swap_sym_in)
7920ce38 703 (bfd *, void *, void *);
dc810e39
AM
704
705 void (*_bfd_coff_swap_lineno_in)
7920ce38 706 (bfd *, void *, void *);
dc810e39
AM
707
708 unsigned int (*_bfd_coff_swap_aux_out)
7920ce38 709 (bfd *, void *, int, int, int, int, void *);
dc810e39
AM
710
711 unsigned int (*_bfd_coff_swap_sym_out)
7920ce38 712 (bfd *, void *, void *);
dc810e39
AM
713
714 unsigned int (*_bfd_coff_swap_lineno_out)
7920ce38 715 (bfd *, void *, void *);
dc810e39
AM
716
717 unsigned int (*_bfd_coff_swap_reloc_out)
7920ce38 718 (bfd *, void *, void *);
dc810e39
AM
719
720 unsigned int (*_bfd_coff_swap_filehdr_out)
7920ce38 721 (bfd *, void *, void *);
dc810e39
AM
722
723 unsigned int (*_bfd_coff_swap_aouthdr_out)
7920ce38 724 (bfd *, void *, void *);
dc810e39
AM
725
726 unsigned int (*_bfd_coff_swap_scnhdr_out)
7920ce38 727 (bfd *, void *, void *);
dc810e39
AM
728
729 unsigned int _bfd_filhsz;
730 unsigned int _bfd_aoutsz;
731 unsigned int _bfd_scnhsz;
732 unsigned int _bfd_symesz;
733 unsigned int _bfd_auxesz;
734 unsigned int _bfd_relsz;
735 unsigned int _bfd_linesz;
736 unsigned int _bfd_filnmlen;
b34976b6 737 bfd_boolean _bfd_coff_long_filenames;
88183869 738
b34976b6 739 bfd_boolean _bfd_coff_long_section_names;
88183869
DK
740 bfd_boolean (*_bfd_coff_set_long_section_names)
741 (bfd *, int);
68ffbac6 742
dc810e39 743 unsigned int _bfd_coff_default_section_alignment_power;
b34976b6 744 bfd_boolean _bfd_coff_force_symnames_in_strings;
dc810e39 745 unsigned int _bfd_coff_debug_string_prefix_length;
167ad85b 746 unsigned int _bfd_coff_max_nscns;
dc810e39
AM
747
748 void (*_bfd_coff_swap_filehdr_in)
7920ce38 749 (bfd *, void *, void *);
dc810e39
AM
750
751 void (*_bfd_coff_swap_aouthdr_in)
7920ce38 752 (bfd *, void *, void *);
dc810e39
AM
753
754 void (*_bfd_coff_swap_scnhdr_in)
7920ce38 755 (bfd *, void *, void *);
dc810e39
AM
756
757 void (*_bfd_coff_swap_reloc_in)
7920ce38 758 (bfd *abfd, void *, void *);
dc810e39 759
b34976b6 760 bfd_boolean (*_bfd_coff_bad_format_hook)
7920ce38 761 (bfd *, void *);
dc810e39 762
b34976b6 763 bfd_boolean (*_bfd_coff_set_arch_mach_hook)
7920ce38 764 (bfd *, void *);
dc810e39 765
7920ce38
NC
766 void * (*_bfd_coff_mkobject_hook)
767 (bfd *, void *, void *);
dc810e39 768
b34976b6 769 bfd_boolean (*_bfd_styp_to_sec_flags_hook)
7920ce38 770 (bfd *, void *, const char *, asection *, flagword *);
dc810e39
AM
771
772 void (*_bfd_set_alignment_hook)
7920ce38 773 (bfd *, asection *, void *);
dc810e39 774
b34976b6 775 bfd_boolean (*_bfd_coff_slurp_symbol_table)
7920ce38 776 (bfd *);
dc810e39 777
b34976b6 778 bfd_boolean (*_bfd_coff_symname_in_debug)
7920ce38 779 (bfd *, struct internal_syment *);
dc810e39 780
b34976b6 781 bfd_boolean (*_bfd_coff_pointerize_aux_hook)
7920ce38
NC
782 (bfd *, combined_entry_type *, combined_entry_type *,
783 unsigned int, combined_entry_type *);
dc810e39 784
b34976b6 785 bfd_boolean (*_bfd_coff_print_aux)
7920ce38
NC
786 (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
787 combined_entry_type *, unsigned int);
dc810e39
AM
788
789 void (*_bfd_coff_reloc16_extra_cases)
7920ce38
NC
790 (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
791 bfd_byte *, unsigned int *, unsigned int *);
dc810e39
AM
792
793 int (*_bfd_coff_reloc16_estimate)
7920ce38
NC
794 (bfd *, asection *, arelent *, unsigned int,
795 struct bfd_link_info *);
dc810e39
AM
796
797 enum coff_symbol_classification (*_bfd_coff_classify_symbol)
7920ce38 798 (bfd *, struct internal_syment *);
dc810e39 799
b34976b6 800 bfd_boolean (*_bfd_coff_compute_section_file_positions)
7920ce38 801 (bfd *);
dc810e39 802
b34976b6 803 bfd_boolean (*_bfd_coff_start_final_link)
7920ce38 804 (bfd *, struct bfd_link_info *);
dc810e39 805
b34976b6 806 bfd_boolean (*_bfd_coff_relocate_section)
7920ce38
NC
807 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
808 struct internal_reloc *, struct internal_syment *, asection **);
dc810e39
AM
809
810 reloc_howto_type *(*_bfd_coff_rtype_to_howto)
7920ce38 811 (bfd *, asection *, struct internal_reloc *,
dc810e39 812 struct coff_link_hash_entry *, struct internal_syment *,
7920ce38 813 bfd_vma *);
dc810e39 814
b34976b6 815 bfd_boolean (*_bfd_coff_adjust_symndx)
7920ce38
NC
816 (bfd *, struct bfd_link_info *, bfd *, asection *,
817 struct internal_reloc *, bfd_boolean *);
dc810e39 818
b34976b6 819 bfd_boolean (*_bfd_coff_link_add_one_symbol)
7920ce38 820 (struct bfd_link_info *, bfd *, const char *, flagword,
b34976b6 821 asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
7920ce38 822 struct bfd_link_hash_entry **);
dc810e39 823
b34976b6 824 bfd_boolean (*_bfd_coff_link_output_has_begun)
7920ce38 825 (bfd *, struct coff_final_link_info *);
dc810e39 826
b34976b6 827 bfd_boolean (*_bfd_coff_final_link_postscript)
7920ce38 828 (bfd *, struct coff_final_link_info *);
252b5132 829
2b5c217d
NC
830 bfd_boolean (*_bfd_coff_print_pdata)
831 (bfd *, void *);
832
252b5132
RH
833} bfd_coff_backend_data;
834
dc810e39
AM
835#define coff_backend_info(abfd) \
836 ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
252b5132
RH
837
838#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
dc810e39 839 ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
252b5132
RH
840
841#define bfd_coff_swap_sym_in(a,e,i) \
dc810e39 842 ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
252b5132
RH
843
844#define bfd_coff_swap_lineno_in(a,e,i) \
dc810e39 845 ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
252b5132
RH
846
847#define bfd_coff_swap_reloc_out(abfd, i, o) \
dc810e39 848 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
252b5132
RH
849
850#define bfd_coff_swap_lineno_out(abfd, i, o) \
dc810e39 851 ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
252b5132
RH
852
853#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
dc810e39 854 ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
252b5132
RH
855
856#define bfd_coff_swap_sym_out(abfd, i,o) \
dc810e39 857 ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
252b5132
RH
858
859#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
dc810e39 860 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
252b5132
RH
861
862#define bfd_coff_swap_filehdr_out(abfd, i,o) \
dc810e39 863 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
252b5132
RH
864
865#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
dc810e39 866 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
252b5132
RH
867
868#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
869#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
870#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
871#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
872#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
873#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
874#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
692b7d62 875#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
dc810e39
AM
876#define bfd_coff_long_filenames(abfd) \
877 (coff_backend_info (abfd)->_bfd_coff_long_filenames)
252b5132 878#define bfd_coff_long_section_names(abfd) \
dc810e39 879 (coff_backend_info (abfd)->_bfd_coff_long_section_names)
88183869
DK
880#define bfd_coff_set_long_section_names(abfd, enable) \
881 ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
252b5132 882#define bfd_coff_default_section_alignment_power(abfd) \
dc810e39 883 (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
167ad85b
TG
884#define bfd_coff_max_nscns(abfd) \
885 (coff_backend_info (abfd)->_bfd_coff_max_nscns)
886
252b5132 887#define bfd_coff_swap_filehdr_in(abfd, i,o) \
dc810e39 888 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
252b5132
RH
889
890#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
dc810e39 891 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
252b5132
RH
892
893#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
dc810e39 894 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
252b5132
RH
895
896#define bfd_coff_swap_reloc_in(abfd, i, o) \
dc810e39 897 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
252b5132
RH
898
899#define bfd_coff_bad_format_hook(abfd, filehdr) \
dc810e39 900 ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
252b5132
RH
901
902#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
dc810e39 903 ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
252b5132 904#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
ed781d5d
NC
905 ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
906 (abfd, filehdr, aouthdr))
252b5132 907
7c8ca0e4 908#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
dc810e39
AM
909 ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
910 (abfd, scnhdr, name, section, flags_ptr))
252b5132
RH
911
912#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
dc810e39 913 ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
252b5132
RH
914
915#define bfd_coff_slurp_symbol_table(abfd)\
dc810e39 916 ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
252b5132
RH
917
918#define bfd_coff_symname_in_debug(abfd, sym)\
dc810e39 919 ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
252b5132 920
7f6d05e8 921#define bfd_coff_force_symnames_in_strings(abfd)\
dc810e39 922 (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
7f6d05e8
CP
923
924#define bfd_coff_debug_string_prefix_length(abfd)\
dc810e39 925 (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
7f6d05e8 926
252b5132 927#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
dc810e39
AM
928 ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
929 (abfd, file, base, symbol, aux, indaux))
252b5132 930
ed781d5d
NC
931#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
932 reloc, data, src_ptr, dst_ptr)\
dc810e39
AM
933 ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
934 (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
252b5132
RH
935
936#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
dc810e39
AM
937 ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
938 (abfd, section, reloc, shrink, link_info))
252b5132 939
5d54c628 940#define bfd_coff_classify_symbol(abfd, sym)\
dc810e39
AM
941 ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
942 (abfd, sym))
252b5132
RH
943
944#define bfd_coff_compute_section_file_positions(abfd)\
dc810e39
AM
945 ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
946 (abfd))
252b5132
RH
947
948#define bfd_coff_start_final_link(obfd, info)\
dc810e39
AM
949 ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
950 (obfd, info))
252b5132 951#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
dc810e39
AM
952 ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
953 (obfd, info, ibfd, o, con, rel, isyms, secs))
252b5132 954#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
dc810e39
AM
955 ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
956 (abfd, sec, rel, h, sym, addendp))
252b5132 957#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
dc810e39
AM
958 ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
959 (obfd, info, ibfd, sec, rel, adjustedp))
ed781d5d
NC
960#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
961 value, string, cp, coll, hashp)\
dc810e39
AM
962 ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
963 (info, abfd, name, flags, section, value, string, cp, coll, hashp))
252b5132
RH
964
965#define bfd_coff_link_output_has_begun(a,p) \
7920ce38 966 ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
252b5132 967#define bfd_coff_final_link_postscript(a,p) \
7920ce38 968 ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
252b5132 969
2b5c217d
NC
970#define bfd_coff_have_print_pdata(a) \
971 (coff_backend_info (a)->_bfd_coff_print_pdata)
972#define bfd_coff_print_pdata(a,p) \
973 ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
974
92dd4511
L
975/* Macro: Returns true if the bfd is a PE executable as opposed to a
976 PE object file. */
977#define bfd_pei_p(abfd) \
978 (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))
This page took 0.889346 seconds and 4 git commands to generate.