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