source: branches/libc-0.6/src/binutils/bfd/libcoff-in.h

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 19.2 KB
Line 
1/* BFD COFF object file private structure.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
6
7This file is part of BFD, the Binary File Descriptor library.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22
23#include "bfdlink.h"
24
25/* Object file tdata; access macros */
26
27#define coff_data(bfd) ((bfd)->tdata.coff_obj_data)
28#define exec_hdr(bfd) (coff_data(bfd)->hdr)
29#define obj_pe(bfd) (coff_data(bfd)->pe)
30#define obj_symbols(bfd) (coff_data(bfd)->symbols)
31#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos)
32
33#define obj_relocbase(bfd) (coff_data(bfd)->relocbase)
34#define obj_raw_syments(bfd) (coff_data(bfd)->raw_syments)
35#define obj_raw_syment_count(bfd) (coff_data(bfd)->raw_syment_count)
36#define obj_convert(bfd) (coff_data(bfd)->conversion_table)
37#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size)
38
39#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms)
40#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms)
41#define obj_coff_strings(bfd) (coff_data (bfd)->strings)
42#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings)
43#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes)
44#define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written)
45
46#define obj_coff_local_toc_table(bfd) (coff_data(bfd)->local_toc_sym_map)
47
48/* `Tdata' information kept for COFF files. */
49
50typedef struct coff_tdata
51{
52 struct coff_symbol_struct *symbols; /* symtab for input bfd */
53 unsigned int *conversion_table;
54 int conv_table_size;
55 file_ptr sym_filepos;
56
57 struct coff_ptr_struct *raw_syments;
58 unsigned long raw_syment_count;
59
60 /* These are only valid once writing has begun */
61 long int relocbase;
62
63 /* These members communicate important constants about the symbol table
64 to GDB's symbol-reading code. These `constants' unfortunately vary
65 from coff implementation to implementation... */
66 unsigned local_n_btmask;
67 unsigned local_n_btshft;
68 unsigned local_n_tmask;
69 unsigned local_n_tshift;
70 unsigned local_symesz;
71 unsigned local_auxesz;
72 unsigned local_linesz;
73
74 /* The unswapped external symbols. May be NULL. Read by
75 _bfd_coff_get_external_symbols. */
76 PTR external_syms;
77 /* If this is TRUE, the external_syms may not be freed. */
78 bfd_boolean keep_syms;
79
80 /* The string table. May be NULL. Read by
81 _bfd_coff_read_string_table. */
82 char *strings;
83 /* If this is TRUE, the strings may not be freed. */
84 bfd_boolean keep_strings;
85 /* If this is TRUE, the strings have been written out already. */
86 bfd_boolean strings_written;
87
88 /* is this a PE format coff file */
89 int pe;
90 /* Used by the COFF backend linker. */
91 struct coff_link_hash_entry **sym_hashes;
92
93 /* used by the pe linker for PowerPC */
94 int *local_toc_sym_map;
95
96 struct bfd_link_info *link_info;
97
98 /* Used by coff_find_nearest_line. */
99 PTR line_info;
100
101 /* A place to stash dwarf2 info for this bfd. */
102 PTR dwarf2_find_line_info;
103
104 /* The timestamp from the COFF file header. */
105 long timestamp;
106
107 /* Copy of some of the f_flags bits in the COFF filehdr structure,
108 used by ARM code. */
109 flagword flags;
110
111} coff_data_type;
112
113/* Tdata for pe image files. */
114typedef struct pe_tdata
115{
116 coff_data_type coff;
117 struct internal_extra_pe_aouthdr pe_opthdr;
118 int dll;
119 int has_reloc_section;
120 bfd_boolean (*in_reloc_p) PARAMS((bfd *, reloc_howto_type *));
121 flagword real_flags;
122 int target_subsystem;
123 bfd_boolean force_minimum_alignment;
124} pe_data_type;
125
126#define pe_data(bfd) ((bfd)->tdata.pe_obj_data)
127
128/* Tdata for XCOFF files. */
129
130struct xcoff_tdata
131{
132 /* Basic COFF information. */
133 coff_data_type coff;
134
135 /* TRUE if this is an XCOFF64 file. */
136 bfd_boolean xcoff64;
137
138 /* TRUE if a large a.out header should be generated. */
139 bfd_boolean full_aouthdr;
140
141 /* TOC value. */
142 bfd_vma toc;
143
144 /* Index of section holding TOC. */
145 int sntoc;
146
147 /* Index of section holding entry point. */
148 int snentry;
149
150 /* .text alignment from optional header. */
151 int text_align_power;
152
153 /* .data alignment from optional header. */
154 int data_align_power;
155
156 /* modtype from optional header. */
157 short modtype;
158
159 /* cputype from optional header. */
160 short cputype;
161
162 /* maxdata from optional header. */
163 bfd_vma maxdata;
164
165 /* maxstack from optional header. */
166 bfd_vma maxstack;
167
168 /* Used by the XCOFF backend linker. */
169 asection **csects;
170 unsigned long *debug_indices;
171 unsigned int import_file_id;
172};
173
174#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data)
175
176/* We take the address of the first element of an asymbol to ensure that the
177 * macro is only ever applied to an asymbol. */
178#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd)))
179
180/* The used_by_bfd field of a section may be set to a pointer to this
181 structure. */
182
183struct coff_section_tdata
184{
185 /* The relocs, swapped into COFF internal form. This may be NULL. */
186 struct internal_reloc *relocs;
187 /* If this is TRUE, the relocs entry may not be freed. */
188 bfd_boolean keep_relocs;
189 /* The section contents. This may be NULL. */
190 bfd_byte *contents;
191 /* If this is TRUE, the contents entry may not be freed. */
192 bfd_boolean keep_contents;
193 /* Information cached by coff_find_nearest_line. */
194 bfd_vma offset;
195 unsigned int i;
196 const char *function;
197 int line_base;
198 /* A pointer used for .stab linking optimizations. */
199 PTR stab_info;
200 /* Available for individual backends. */
201 PTR tdata;
202};
203
204/* An accessor macro for the coff_section_tdata structure. */
205#define coff_section_data(abfd, sec) \
206 ((struct coff_section_tdata *) (sec)->used_by_bfd)
207
208/* Tdata for sections in XCOFF files. This is used by the linker. */
209
210struct xcoff_section_tdata
211{
212 /* Used for XCOFF csects created by the linker; points to the real
213 XCOFF section which contains this csect. */
214 asection *enclosing;
215 /* The lineno_count field for the enclosing section, because we are
216 going to clobber it there. */
217 unsigned int lineno_count;
218 /* The first and one past the last symbol indices for symbols used
219 by this csect. */
220 unsigned long first_symndx;
221 unsigned long last_symndx;
222};
223
224/* An accessor macro the xcoff_section_tdata structure. */
225#define xcoff_section_data(abfd, sec) \
226 ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
227
228/* Tdata for sections in PE files. */
229
230struct pei_section_tdata
231{
232 /* The virtual size of the section. */
233 bfd_size_type virt_size;
234 /* The PE section flags. */
235 long pe_flags;
236};
237
238/* An accessor macro for the pei_section_tdata structure. */
239#define pei_section_data(abfd, sec) \
240 ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
241
242/* COFF linker hash table entries. */
243
244struct coff_link_hash_entry
245{
246 struct bfd_link_hash_entry root;
247
248 /* Symbol index in output file. Set to -1 initially. Set to -2 if
249 there is a reloc against this symbol. */
250 long indx;
251
252 /* Symbol type. */
253 unsigned short type;
254
255 /* Symbol class. */
256 unsigned char class;
257
258 /* Number of auxiliary entries. */
259 char numaux;
260
261 /* BFD to take auxiliary entries from. */
262 bfd *auxbfd;
263
264 /* Pointer to array of auxiliary entries, if any. */
265 union internal_auxent *aux;
266
267 /* Flag word; legal values follow. */
268 unsigned short coff_link_hash_flags;
269 /* Symbol is a PE section symbol. */
270#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01)
271};
272
273/* COFF linker hash table. */
274
275struct coff_link_hash_table
276{
277 struct bfd_link_hash_table root;
278 /* A pointer to information used to link stabs in sections. */
279 PTR stab_info;
280};
281
282/* Look up an entry in a COFF linker hash table. */
283
284#define coff_link_hash_lookup(table, string, create, copy, follow) \
285 ((struct coff_link_hash_entry *) \
286 bfd_link_hash_lookup (&(table)->root, (string), (create), \
287 (copy), (follow)))
288
289/* Traverse a COFF linker hash table. */
290
291#define coff_link_hash_traverse(table, func, info) \
292 (bfd_link_hash_traverse \
293 (&(table)->root, \
294 (bfd_boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
295 (info)))
296
297/* Get the COFF linker hash table from a link_info structure. */
298
299#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash))
300
301/* Functions in coffgen.c. */
302extern const bfd_target *coff_object_p
303 PARAMS ((bfd *));
304extern struct sec *coff_section_from_bfd_index
305 PARAMS ((bfd *, int));
306extern long coff_get_symtab_upper_bound
307 PARAMS ((bfd *));
308extern long coff_get_symtab
309 PARAMS ((bfd *, asymbol **));
310extern int coff_count_linenumbers
311 PARAMS ((bfd *));
312extern struct coff_symbol_struct *coff_symbol_from
313 PARAMS ((bfd *, asymbol *));
314extern bfd_boolean coff_renumber_symbols
315 PARAMS ((bfd *, int *));
316extern void coff_mangle_symbols
317 PARAMS ((bfd *));
318extern bfd_boolean coff_write_symbols
319 PARAMS ((bfd *));
320extern bfd_boolean coff_write_linenumbers
321 PARAMS ((bfd *));
322extern alent *coff_get_lineno
323 PARAMS ((bfd *, asymbol *));
324extern asymbol *coff_section_symbol
325 PARAMS ((bfd *, char *));
326extern bfd_boolean _bfd_coff_get_external_symbols
327 PARAMS ((bfd *));
328extern const char *_bfd_coff_read_string_table
329 PARAMS ((bfd *));
330extern bfd_boolean _bfd_coff_free_symbols
331 PARAMS ((bfd *));
332extern struct coff_ptr_struct *coff_get_normalized_symtab
333 PARAMS ((bfd *));
334extern long coff_get_reloc_upper_bound
335 PARAMS ((bfd *, sec_ptr));
336extern asymbol *coff_make_empty_symbol
337 PARAMS ((bfd *));
338extern void coff_print_symbol
339 PARAMS ((bfd *, PTR filep, asymbol *, bfd_print_symbol_type));
340extern void coff_get_symbol_info
341 PARAMS ((bfd *, asymbol *, symbol_info *ret));
342extern bfd_boolean _bfd_coff_is_local_label_name
343 PARAMS ((bfd *, const char *));
344extern asymbol *coff_bfd_make_debug_symbol
345 PARAMS ((bfd *, PTR, unsigned long));
346extern bfd_boolean coff_find_nearest_line
347 PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
348 const char **, unsigned int *));
349extern int coff_sizeof_headers
350 PARAMS ((bfd *, bfd_boolean));
351extern bfd_boolean bfd_coff_reloc16_relax_section
352 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
353extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents
354 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
355 bfd_byte *, bfd_boolean, asymbol **));
356extern bfd_vma bfd_coff_reloc16_get_value
357 PARAMS ((arelent *, struct bfd_link_info *, asection *));
358extern void bfd_perform_slip
359 PARAMS ((bfd *, unsigned int, asection *, bfd_vma));
360
361/* Functions and types in cofflink.c. */
362
363#define STRING_SIZE_SIZE (4)
364
365/* We use a hash table to merge identical enum, struct, and union
366 definitions in the linker. */
367
368/* Information we keep for a single element (an enum value, a
369 structure or union field) in the debug merge hash table. */
370
371struct coff_debug_merge_element
372{
373 /* Next element. */
374 struct coff_debug_merge_element *next;
375
376 /* Name. */
377 const char *name;
378
379 /* Type. */
380 unsigned int type;
381
382 /* Symbol index for complex type. */
383 long tagndx;
384};
385
386/* A linked list of debug merge entries for a given name. */
387
388struct coff_debug_merge_type
389{
390 /* Next type with the same name. */
391 struct coff_debug_merge_type *next;
392
393 /* Class of type. */
394 int class;
395
396 /* Symbol index where this type is defined. */
397 long indx;
398
399 /* List of elements. */
400 struct coff_debug_merge_element *elements;
401};
402
403/* Information we store in the debug merge hash table. */
404
405struct coff_debug_merge_hash_entry
406{
407 struct bfd_hash_entry root;
408
409 /* A list of types with this name. */
410 struct coff_debug_merge_type *types;
411};
412
413/* The debug merge hash table. */
414
415struct coff_debug_merge_hash_table
416{
417 struct bfd_hash_table root;
418};
419
420/* Initialize a COFF debug merge hash table. */
421
422#define coff_debug_merge_hash_table_init(table) \
423 (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc))
424
425/* Free a COFF debug merge hash table. */
426
427#define coff_debug_merge_hash_table_free(table) \
428 (bfd_hash_table_free (&(table)->root))
429
430/* Look up an entry in a COFF debug merge hash table. */
431
432#define coff_debug_merge_hash_lookup(table, string, create, copy) \
433 ((struct coff_debug_merge_hash_entry *) \
434 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
435
436/* Information we keep for each section in the output file when doing
437 a relocateable link. */
438
439struct coff_link_section_info
440{
441 /* The relocs to be output. */
442 struct internal_reloc *relocs;
443 /* For each reloc against a global symbol whose index was not known
444 when the reloc was handled, the global hash table entry. */
445 struct coff_link_hash_entry **rel_hashes;
446};
447
448/* Information that we pass around while doing the final link step. */
449
450struct coff_final_link_info
451{
452 /* General link information. */
453 struct bfd_link_info *info;
454 /* Output BFD. */
455 bfd *output_bfd;
456 /* Used to indicate failure in traversal routine. */
457 bfd_boolean failed;
458 /* If doing "task linking" set only during the time when we want the
459 global symbol writer to convert the storage class of defined global
460 symbols from global to static. */
461 bfd_boolean global_to_static;
462 /* Hash table for long symbol names. */
463 struct bfd_strtab_hash *strtab;
464 /* When doing a relocateable link, an array of information kept for
465 each output section, indexed by the target_index field. */
466 struct coff_link_section_info *section_info;
467 /* Symbol index of last C_FILE symbol (-1 if none). */
468 long last_file_index;
469 /* Contents of last C_FILE symbol. */
470 struct internal_syment last_file;
471 /* Symbol index of first aux entry of last .bf symbol with an empty
472 endndx field (-1 if none). */
473 long last_bf_index;
474 /* Contents of last_bf_index aux entry. */
475 union internal_auxent last_bf;
476 /* Hash table used to merge debug information. */
477 struct coff_debug_merge_hash_table debug_merge;
478 /* Buffer large enough to hold swapped symbols of any input file. */
479 struct internal_syment *internal_syms;
480 /* Buffer large enough to hold sections of symbols of any input file. */
481 asection **sec_ptrs;
482 /* Buffer large enough to hold output indices of symbols of any
483 input file. */
484 long *sym_indices;
485 /* Buffer large enough to hold output symbols for any input file. */
486 bfd_byte *outsyms;
487 /* Buffer large enough to hold external line numbers for any input
488 section. */
489 bfd_byte *linenos;
490 /* Buffer large enough to hold any input section. */
491 bfd_byte *contents;
492 /* Buffer large enough to hold external relocs of any input section. */
493 bfd_byte *external_relocs;
494 /* Buffer large enough to hold swapped relocs of any input section. */
495 struct internal_reloc *internal_relocs;
496};
497
498/* Most COFF variants have no way to record the alignment of a
499 section. This struct is used to set a specific alignment based on
500 the name of the section. */
501
502struct coff_section_alignment_entry
503{
504 /* The section name. */
505 const char *name;
506
507 /* This is either (unsigned int) -1, indicating that the section
508 name must match exactly, or it is the number of letters which
509 must match at the start of the name. */
510 unsigned int comparison_length;
511
512 /* These macros may be used to fill in the first two fields in a
513 structure initialization. */
514#define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1)
515#define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1)
516
517 /* Only use this entry if the default section alignment for this
518 target is at least that much (as a power of two). If this field
519 is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
520 unsigned int default_alignment_min;
521
522 /* Only use this entry if the default section alignment for this
523 target is no greater than this (as a power of two). If this
524 field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
525 unsigned int default_alignment_max;
526
527#define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1)
528
529 /* The desired alignment for this section (as a power of two). */
530 unsigned int alignment_power;
531};
532
533extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc
534 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
535extern bfd_boolean _bfd_coff_link_hash_table_init
536 PARAMS ((struct coff_link_hash_table *, bfd *,
537 struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
538 struct bfd_hash_table *,
539 const char *)));
540extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create
541 PARAMS ((bfd *));
542extern const char *_bfd_coff_internal_syment_name
543 PARAMS ((bfd *, const struct internal_syment *, char *));
544extern bfd_boolean _bfd_coff_link_add_symbols
545 PARAMS ((bfd *, struct bfd_link_info *));
546extern bfd_boolean _bfd_coff_final_link
547 PARAMS ((bfd *, struct bfd_link_info *));
548extern struct internal_reloc *_bfd_coff_read_internal_relocs
549 PARAMS ((bfd *, asection *, bfd_boolean, bfd_byte *, bfd_boolean,
550 struct internal_reloc *));
551extern bfd_boolean _bfd_coff_generic_relocate_section
552 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
553 struct internal_reloc *, struct internal_syment *, asection **));
554
555extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc
556 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
557extern bfd_boolean _bfd_coff_write_global_sym
558 PARAMS ((struct coff_link_hash_entry *, PTR));
559extern bfd_boolean _bfd_coff_write_task_globals
560 PARAMS ((struct coff_link_hash_entry *, PTR));
561extern bfd_boolean _bfd_coff_link_input_bfd
562 PARAMS ((struct coff_final_link_info *, bfd *));
563extern bfd_boolean _bfd_coff_reloc_link_order
564 PARAMS ((bfd *, struct coff_final_link_info *, asection *,
565 struct bfd_link_order *));
566
567
568#define coff_get_section_contents_in_window \
569 _bfd_generic_get_section_contents_in_window
570
571/* Functions in xcofflink.c. */
572
573extern long _bfd_xcoff_get_dynamic_symtab_upper_bound
574 PARAMS ((bfd *));
575extern long _bfd_xcoff_canonicalize_dynamic_symtab
576 PARAMS ((bfd *, asymbol **));
577extern long _bfd_xcoff_get_dynamic_reloc_upper_bound
578 PARAMS ((bfd *));
579extern long _bfd_xcoff_canonicalize_dynamic_reloc
580 PARAMS ((bfd *, arelent **, asymbol **));
581extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create
582 PARAMS ((bfd *));
583extern void _bfd_xcoff_bfd_link_hash_table_free
584 PARAMS ((struct bfd_link_hash_table *));
585extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols
586 PARAMS ((bfd *, struct bfd_link_info *));
587extern bfd_boolean _bfd_xcoff_bfd_final_link
588 PARAMS ((bfd *, struct bfd_link_info *));
589extern bfd_boolean _bfd_ppc_xcoff_relocate_section
590 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
591 struct internal_reloc *, struct internal_syment *, asection **));
592
593/* Functions in coff-ppc.c. FIXME: These are called be pe.em in the
594 linker, and so should start with bfd and be declared in bfd.h. */
595
596extern bfd_boolean ppc_allocate_toc_section
597 PARAMS ((struct bfd_link_info *));
598extern bfd_boolean ppc_process_before_allocation
599 PARAMS ((bfd *, struct bfd_link_info *));
600
Note: See TracBrowser for help on using the repository browser.