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