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