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