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