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