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