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