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