coffgen.c revision 1.7 1 1.1 christos /* Support for the generic parts of COFF, for BFD.
2 1.7 christos Copyright (C) 1990-2020 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 christos /* Most of this hacked by Steve Chamberlain, sac (at) cygnus.com.
23 1.1 christos Split out of coffcode.h by Ian Taylor, ian (at) cygnus.com. */
24 1.1 christos
25 1.1 christos /* This file contains COFF code that is not dependent on any
26 1.1 christos particular COFF target. There is only one version of this file in
27 1.1 christos libbfd.a, so no target specific code may be put in here. Or, to
28 1.1 christos put it another way,
29 1.1 christos
30 1.1 christos ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
31 1.1 christos
32 1.1 christos If you need to add some target specific behaviour, add a new hook
33 1.1 christos function to bfd_coff_backend_data.
34 1.1 christos
35 1.1 christos Some of these functions are also called by the ECOFF routines.
36 1.1 christos Those functions may not use any COFF specific information, such as
37 1.1 christos coff_data (abfd). */
38 1.1 christos
39 1.1 christos #include "sysdep.h"
40 1.7 christos #include <limits.h>
41 1.1 christos #include "bfd.h"
42 1.1 christos #include "libbfd.h"
43 1.1 christos #include "coff/internal.h"
44 1.1 christos #include "libcoff.h"
45 1.1 christos
46 1.1 christos /* Take a section header read from a coff file (in HOST byte order),
47 1.1 christos and make a BFD "section" out of it. This is used by ECOFF. */
48 1.1 christos
49 1.1 christos static bfd_boolean
50 1.1 christos make_a_section_from_file (bfd *abfd,
51 1.1 christos struct internal_scnhdr *hdr,
52 1.1 christos unsigned int target_index)
53 1.1 christos {
54 1.1 christos asection *return_section;
55 1.1 christos char *name;
56 1.1 christos bfd_boolean result = TRUE;
57 1.1 christos flagword flags;
58 1.1 christos
59 1.1 christos name = NULL;
60 1.1 christos
61 1.1 christos /* Handle long section names as in PE. On reading, we want to
62 1.1 christos accept long names if the format permits them at all, regardless
63 1.1 christos of the current state of the flag that dictates if we would generate
64 1.1 christos them in outputs; this construct checks if that is the case by
65 1.1 christos attempting to set the flag, without changing its state; the call
66 1.1 christos will fail for formats that do not support long names at all. */
67 1.1 christos if (bfd_coff_set_long_section_names (abfd, bfd_coff_long_section_names (abfd))
68 1.1 christos && hdr->s_name[0] == '/')
69 1.1 christos {
70 1.1 christos char buf[SCNNMLEN];
71 1.1 christos long strindex;
72 1.1 christos char *p;
73 1.1 christos const char *strings;
74 1.1 christos
75 1.1 christos /* Flag that this BFD uses long names, even though the format might
76 1.6 christos expect them to be off by default. This won't directly affect the
77 1.6 christos format of any output BFD created from this one, but the information
78 1.6 christos can be used to decide what to do. */
79 1.1 christos bfd_coff_set_long_section_names (abfd, TRUE);
80 1.1 christos memcpy (buf, hdr->s_name + 1, SCNNMLEN - 1);
81 1.1 christos buf[SCNNMLEN - 1] = '\0';
82 1.1 christos strindex = strtol (buf, &p, 10);
83 1.1 christos if (*p == '\0' && strindex >= 0)
84 1.1 christos {
85 1.1 christos strings = _bfd_coff_read_string_table (abfd);
86 1.1 christos if (strings == NULL)
87 1.1 christos return FALSE;
88 1.3 christos if ((bfd_size_type)(strindex + 2) >= obj_coff_strings_len (abfd))
89 1.3 christos return FALSE;
90 1.1 christos strings += strindex;
91 1.1 christos name = (char *) bfd_alloc (abfd,
92 1.6 christos (bfd_size_type) strlen (strings) + 1 + 1);
93 1.1 christos if (name == NULL)
94 1.1 christos return FALSE;
95 1.1 christos strcpy (name, strings);
96 1.1 christos }
97 1.1 christos }
98 1.1 christos
99 1.1 christos if (name == NULL)
100 1.1 christos {
101 1.1 christos /* Assorted wastage to null-terminate the name, thanks AT&T! */
102 1.1 christos name = (char *) bfd_alloc (abfd,
103 1.6 christos (bfd_size_type) sizeof (hdr->s_name) + 1 + 1);
104 1.1 christos if (name == NULL)
105 1.1 christos return FALSE;
106 1.1 christos strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
107 1.1 christos name[sizeof (hdr->s_name)] = 0;
108 1.1 christos }
109 1.1 christos
110 1.1 christos return_section = bfd_make_section_anyway (abfd, name);
111 1.1 christos if (return_section == NULL)
112 1.1 christos return FALSE;
113 1.1 christos
114 1.1 christos return_section->vma = hdr->s_vaddr;
115 1.1 christos return_section->lma = hdr->s_paddr;
116 1.1 christos return_section->size = hdr->s_size;
117 1.1 christos return_section->filepos = hdr->s_scnptr;
118 1.1 christos return_section->rel_filepos = hdr->s_relptr;
119 1.1 christos return_section->reloc_count = hdr->s_nreloc;
120 1.1 christos
121 1.1 christos bfd_coff_set_alignment_hook (abfd, return_section, hdr);
122 1.1 christos
123 1.1 christos return_section->line_filepos = hdr->s_lnnoptr;
124 1.1 christos
125 1.1 christos return_section->lineno_count = hdr->s_nlnno;
126 1.1 christos return_section->userdata = NULL;
127 1.1 christos return_section->next = NULL;
128 1.1 christos return_section->target_index = target_index;
129 1.1 christos
130 1.1 christos if (! bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name, return_section,
131 1.1 christos & flags))
132 1.1 christos result = FALSE;
133 1.1 christos
134 1.1 christos return_section->flags = flags;
135 1.1 christos
136 1.1 christos /* At least on i386-coff, the line number count for a shared library
137 1.1 christos section must be ignored. */
138 1.1 christos if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
139 1.1 christos return_section->lineno_count = 0;
140 1.1 christos
141 1.1 christos if (hdr->s_nreloc != 0)
142 1.1 christos return_section->flags |= SEC_RELOC;
143 1.1 christos /* FIXME: should this check 'hdr->s_size > 0'. */
144 1.1 christos if (hdr->s_scnptr != 0)
145 1.1 christos return_section->flags |= SEC_HAS_CONTENTS;
146 1.1 christos
147 1.3 christos /* Compress/decompress DWARF debug sections with names: .debug_* and
148 1.3 christos .zdebug_*, after the section flags is set. */
149 1.3 christos if ((flags & SEC_DEBUGGING)
150 1.3 christos && strlen (name) > 7
151 1.3 christos && ((name[1] == 'd' && name[6] == '_')
152 1.3 christos || (strlen (name) > 8 && name[1] == 'z' && name[7] == '_')))
153 1.3 christos {
154 1.3 christos enum { nothing, compress, decompress } action = nothing;
155 1.3 christos char *new_name = NULL;
156 1.3 christos
157 1.3 christos if (bfd_is_section_compressed (abfd, return_section))
158 1.3 christos {
159 1.3 christos /* Compressed section. Check if we should decompress. */
160 1.3 christos if ((abfd->flags & BFD_DECOMPRESS))
161 1.3 christos action = decompress;
162 1.3 christos }
163 1.3 christos else if (!bfd_is_section_compressed (abfd, return_section))
164 1.3 christos {
165 1.3 christos /* Normal section. Check if we should compress. */
166 1.3 christos if ((abfd->flags & BFD_COMPRESS) && return_section->size != 0)
167 1.3 christos action = compress;
168 1.3 christos }
169 1.3 christos
170 1.3 christos switch (action)
171 1.3 christos {
172 1.3 christos case nothing:
173 1.3 christos break;
174 1.3 christos case compress:
175 1.3 christos if (!bfd_init_section_compress_status (abfd, return_section))
176 1.3 christos {
177 1.6 christos _bfd_error_handler
178 1.6 christos /* xgettext: c-format */
179 1.6 christos (_("%pB: unable to initialize compress status for section %s"),
180 1.3 christos abfd, name);
181 1.3 christos return FALSE;
182 1.3 christos }
183 1.3 christos if (return_section->compress_status == COMPRESS_SECTION_DONE)
184 1.3 christos {
185 1.3 christos if (name[1] != 'z')
186 1.3 christos {
187 1.3 christos unsigned int len = strlen (name);
188 1.3 christos
189 1.3 christos new_name = bfd_alloc (abfd, len + 2);
190 1.3 christos if (new_name == NULL)
191 1.3 christos return FALSE;
192 1.3 christos new_name[0] = '.';
193 1.3 christos new_name[1] = 'z';
194 1.3 christos memcpy (new_name + 2, name + 1, len);
195 1.3 christos }
196 1.3 christos }
197 1.6 christos break;
198 1.3 christos case decompress:
199 1.3 christos if (!bfd_init_section_decompress_status (abfd, return_section))
200 1.3 christos {
201 1.6 christos _bfd_error_handler
202 1.6 christos /* xgettext: c-format */
203 1.6 christos (_("%pB: unable to initialize decompress status for section %s"),
204 1.3 christos abfd, name);
205 1.3 christos return FALSE;
206 1.3 christos }
207 1.3 christos if (name[1] == 'z')
208 1.3 christos {
209 1.3 christos unsigned int len = strlen (name);
210 1.3 christos
211 1.3 christos new_name = bfd_alloc (abfd, len);
212 1.3 christos if (new_name == NULL)
213 1.3 christos return FALSE;
214 1.3 christos new_name[0] = '.';
215 1.3 christos memcpy (new_name + 1, name + 2, len - 1);
216 1.3 christos }
217 1.3 christos break;
218 1.3 christos }
219 1.3 christos if (new_name != NULL)
220 1.7 christos bfd_rename_section (return_section, new_name);
221 1.3 christos }
222 1.3 christos
223 1.1 christos return result;
224 1.1 christos }
225 1.1 christos
226 1.1 christos /* Read in a COFF object and make it into a BFD. This is used by
227 1.1 christos ECOFF as well. */
228 1.3 christos const bfd_target *
229 1.3 christos coff_real_object_p (bfd *,
230 1.6 christos unsigned,
231 1.6 christos struct internal_filehdr *,
232 1.6 christos struct internal_aouthdr *);
233 1.3 christos const bfd_target *
234 1.1 christos coff_real_object_p (bfd *abfd,
235 1.1 christos unsigned nscns,
236 1.1 christos struct internal_filehdr *internal_f,
237 1.1 christos struct internal_aouthdr *internal_a)
238 1.1 christos {
239 1.1 christos flagword oflags = abfd->flags;
240 1.1 christos bfd_vma ostart = bfd_get_start_address (abfd);
241 1.1 christos void * tdata;
242 1.1 christos void * tdata_save;
243 1.1 christos bfd_size_type readsize; /* Length of file_info. */
244 1.1 christos unsigned int scnhsz;
245 1.1 christos char *external_sections;
246 1.1 christos
247 1.1 christos if (!(internal_f->f_flags & F_RELFLG))
248 1.1 christos abfd->flags |= HAS_RELOC;
249 1.1 christos if ((internal_f->f_flags & F_EXEC))
250 1.1 christos abfd->flags |= EXEC_P;
251 1.1 christos if (!(internal_f->f_flags & F_LNNO))
252 1.1 christos abfd->flags |= HAS_LINENO;
253 1.1 christos if (!(internal_f->f_flags & F_LSYMS))
254 1.1 christos abfd->flags |= HAS_LOCALS;
255 1.1 christos
256 1.1 christos /* FIXME: How can we set D_PAGED correctly? */
257 1.1 christos if ((internal_f->f_flags & F_EXEC) != 0)
258 1.1 christos abfd->flags |= D_PAGED;
259 1.1 christos
260 1.7 christos abfd->symcount = internal_f->f_nsyms;
261 1.1 christos if (internal_f->f_nsyms)
262 1.1 christos abfd->flags |= HAS_SYMS;
263 1.1 christos
264 1.1 christos if (internal_a != (struct internal_aouthdr *) NULL)
265 1.7 christos abfd->start_address = internal_a->entry;
266 1.1 christos else
267 1.7 christos abfd->start_address = 0;
268 1.1 christos
269 1.1 christos /* Set up the tdata area. ECOFF uses its own routine, and overrides
270 1.1 christos abfd->flags. */
271 1.1 christos tdata_save = abfd->tdata.any;
272 1.1 christos tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
273 1.1 christos if (tdata == NULL)
274 1.1 christos goto fail2;
275 1.1 christos
276 1.1 christos scnhsz = bfd_coff_scnhsz (abfd);
277 1.1 christos readsize = (bfd_size_type) nscns * scnhsz;
278 1.1 christos external_sections = (char *) bfd_alloc (abfd, readsize);
279 1.1 christos if (!external_sections)
280 1.1 christos goto fail;
281 1.1 christos
282 1.1 christos if (bfd_bread ((void *) external_sections, readsize, abfd) != readsize)
283 1.1 christos goto fail;
284 1.1 christos
285 1.1 christos /* Set the arch/mach *before* swapping in sections; section header swapping
286 1.1 christos may depend on arch/mach info. */
287 1.1 christos if (! bfd_coff_set_arch_mach_hook (abfd, (void *) internal_f))
288 1.1 christos goto fail;
289 1.1 christos
290 1.1 christos /* Now copy data as required; construct all asections etc. */
291 1.1 christos if (nscns != 0)
292 1.1 christos {
293 1.1 christos unsigned int i;
294 1.1 christos for (i = 0; i < nscns; i++)
295 1.1 christos {
296 1.1 christos struct internal_scnhdr tmp;
297 1.1 christos bfd_coff_swap_scnhdr_in (abfd,
298 1.1 christos (void *) (external_sections + i * scnhsz),
299 1.1 christos (void *) & tmp);
300 1.1 christos if (! make_a_section_from_file (abfd, &tmp, i + 1))
301 1.1 christos goto fail;
302 1.1 christos }
303 1.1 christos }
304 1.1 christos
305 1.7 christos obj_coff_keep_syms (abfd) = FALSE;
306 1.7 christos obj_coff_keep_strings (abfd) = FALSE;
307 1.7 christos _bfd_coff_free_symbols (abfd);
308 1.1 christos return abfd->xvec;
309 1.1 christos
310 1.1 christos fail:
311 1.7 christos obj_coff_keep_syms (abfd) = FALSE;
312 1.7 christos obj_coff_keep_strings (abfd) = FALSE;
313 1.7 christos _bfd_coff_free_symbols (abfd);
314 1.1 christos bfd_release (abfd, tdata);
315 1.1 christos fail2:
316 1.1 christos abfd->tdata.any = tdata_save;
317 1.1 christos abfd->flags = oflags;
318 1.7 christos abfd->start_address = ostart;
319 1.1 christos return (const bfd_target *) NULL;
320 1.1 christos }
321 1.1 christos
322 1.1 christos /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
323 1.1 christos not a COFF file. This is also used by ECOFF. */
324 1.1 christos
325 1.1 christos const bfd_target *
326 1.1 christos coff_object_p (bfd *abfd)
327 1.1 christos {
328 1.1 christos bfd_size_type filhsz;
329 1.1 christos bfd_size_type aoutsz;
330 1.1 christos unsigned int nscns;
331 1.1 christos void * filehdr;
332 1.1 christos struct internal_filehdr internal_f;
333 1.1 christos struct internal_aouthdr internal_a;
334 1.1 christos
335 1.1 christos /* Figure out how much to read. */
336 1.1 christos filhsz = bfd_coff_filhsz (abfd);
337 1.1 christos aoutsz = bfd_coff_aoutsz (abfd);
338 1.1 christos
339 1.1 christos filehdr = bfd_alloc (abfd, filhsz);
340 1.1 christos if (filehdr == NULL)
341 1.1 christos return NULL;
342 1.1 christos if (bfd_bread (filehdr, filhsz, abfd) != filhsz)
343 1.1 christos {
344 1.1 christos if (bfd_get_error () != bfd_error_system_call)
345 1.1 christos bfd_set_error (bfd_error_wrong_format);
346 1.1 christos bfd_release (abfd, filehdr);
347 1.1 christos return NULL;
348 1.1 christos }
349 1.1 christos bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
350 1.1 christos bfd_release (abfd, filehdr);
351 1.1 christos
352 1.1 christos /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
353 1.1 christos (less than aoutsz) used in object files and AOUTSZ (equal to
354 1.1 christos aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
355 1.1 christos expects this header to be aoutsz bytes in length, so we use that
356 1.1 christos value in the call to bfd_alloc below. But we must be careful to
357 1.1 christos only read in f_opthdr bytes in the call to bfd_bread. We should
358 1.1 christos also attempt to catch corrupt or non-COFF binaries with a strange
359 1.1 christos value for f_opthdr. */
360 1.1 christos if (! bfd_coff_bad_format_hook (abfd, &internal_f)
361 1.1 christos || internal_f.f_opthdr > aoutsz)
362 1.1 christos {
363 1.1 christos bfd_set_error (bfd_error_wrong_format);
364 1.1 christos return NULL;
365 1.1 christos }
366 1.1 christos nscns = internal_f.f_nscns;
367 1.1 christos
368 1.1 christos if (internal_f.f_opthdr)
369 1.1 christos {
370 1.1 christos void * opthdr;
371 1.1 christos
372 1.1 christos opthdr = bfd_alloc (abfd, aoutsz);
373 1.1 christos if (opthdr == NULL)
374 1.1 christos return NULL;
375 1.1 christos if (bfd_bread (opthdr, (bfd_size_type) internal_f.f_opthdr, abfd)
376 1.1 christos != internal_f.f_opthdr)
377 1.1 christos {
378 1.1 christos bfd_release (abfd, opthdr);
379 1.1 christos return NULL;
380 1.1 christos }
381 1.3 christos /* PR 17512: file: 11056-1136-0.004. */
382 1.3 christos if (internal_f.f_opthdr < aoutsz)
383 1.3 christos memset (((char *) opthdr) + internal_f.f_opthdr, 0, aoutsz - internal_f.f_opthdr);
384 1.3 christos
385 1.1 christos bfd_coff_swap_aouthdr_in (abfd, opthdr, (void *) &internal_a);
386 1.1 christos bfd_release (abfd, opthdr);
387 1.1 christos }
388 1.1 christos
389 1.1 christos return coff_real_object_p (abfd, nscns, &internal_f,
390 1.1 christos (internal_f.f_opthdr != 0
391 1.1 christos ? &internal_a
392 1.1 christos : (struct internal_aouthdr *) NULL));
393 1.1 christos }
394 1.1 christos
395 1.1 christos /* Get the BFD section from a COFF symbol section number. */
396 1.1 christos
397 1.1 christos asection *
398 1.1 christos coff_section_from_bfd_index (bfd *abfd, int section_index)
399 1.1 christos {
400 1.1 christos struct bfd_section *answer = abfd->sections;
401 1.1 christos
402 1.1 christos if (section_index == N_ABS)
403 1.1 christos return bfd_abs_section_ptr;
404 1.1 christos if (section_index == N_UNDEF)
405 1.1 christos return bfd_und_section_ptr;
406 1.1 christos if (section_index == N_DEBUG)
407 1.1 christos return bfd_abs_section_ptr;
408 1.1 christos
409 1.1 christos while (answer)
410 1.1 christos {
411 1.1 christos if (answer->target_index == section_index)
412 1.1 christos return answer;
413 1.1 christos answer = answer->next;
414 1.1 christos }
415 1.1 christos
416 1.1 christos /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
417 1.1 christos has a bad symbol table in biglitpow.o. */
418 1.1 christos return bfd_und_section_ptr;
419 1.1 christos }
420 1.1 christos
421 1.1 christos /* Get the upper bound of a COFF symbol table. */
422 1.1 christos
423 1.1 christos long
424 1.1 christos coff_get_symtab_upper_bound (bfd *abfd)
425 1.1 christos {
426 1.1 christos if (!bfd_coff_slurp_symbol_table (abfd))
427 1.1 christos return -1;
428 1.1 christos
429 1.1 christos return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
430 1.1 christos }
431 1.1 christos
432 1.1 christos /* Canonicalize a COFF symbol table. */
433 1.1 christos
434 1.1 christos long
435 1.1 christos coff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
436 1.1 christos {
437 1.1 christos unsigned int counter;
438 1.1 christos coff_symbol_type *symbase;
439 1.1 christos coff_symbol_type **location = (coff_symbol_type **) alocation;
440 1.1 christos
441 1.1 christos if (!bfd_coff_slurp_symbol_table (abfd))
442 1.1 christos return -1;
443 1.1 christos
444 1.1 christos symbase = obj_symbols (abfd);
445 1.1 christos counter = bfd_get_symcount (abfd);
446 1.1 christos while (counter-- > 0)
447 1.1 christos *location++ = symbase++;
448 1.1 christos
449 1.1 christos *location = NULL;
450 1.1 christos
451 1.1 christos return bfd_get_symcount (abfd);
452 1.1 christos }
453 1.1 christos
454 1.1 christos /* Get the name of a symbol. The caller must pass in a buffer of size
455 1.1 christos >= SYMNMLEN + 1. */
456 1.1 christos
457 1.1 christos const char *
458 1.1 christos _bfd_coff_internal_syment_name (bfd *abfd,
459 1.1 christos const struct internal_syment *sym,
460 1.1 christos char *buf)
461 1.1 christos {
462 1.1 christos /* FIXME: It's not clear this will work correctly if sizeof
463 1.1 christos (_n_zeroes) != 4. */
464 1.1 christos if (sym->_n._n_n._n_zeroes != 0
465 1.1 christos || sym->_n._n_n._n_offset == 0)
466 1.1 christos {
467 1.1 christos memcpy (buf, sym->_n._n_name, SYMNMLEN);
468 1.1 christos buf[SYMNMLEN] = '\0';
469 1.1 christos return buf;
470 1.1 christos }
471 1.1 christos else
472 1.1 christos {
473 1.1 christos const char *strings;
474 1.1 christos
475 1.1 christos BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
476 1.1 christos strings = obj_coff_strings (abfd);
477 1.1 christos if (strings == NULL)
478 1.1 christos {
479 1.1 christos strings = _bfd_coff_read_string_table (abfd);
480 1.1 christos if (strings == NULL)
481 1.1 christos return NULL;
482 1.1 christos }
483 1.3 christos /* PR 17910: Only check for string overflow if the length has been set.
484 1.3 christos Some DLLs, eg those produced by Visual Studio, may not set the length field. */
485 1.3 christos if (obj_coff_strings_len (abfd) > 0
486 1.3 christos && sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
487 1.3 christos return NULL;
488 1.1 christos return strings + sym->_n._n_n._n_offset;
489 1.1 christos }
490 1.1 christos }
491 1.1 christos
492 1.1 christos /* Read in and swap the relocs. This returns a buffer holding the
493 1.1 christos relocs for section SEC in file ABFD. If CACHE is TRUE and
494 1.1 christos INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
495 1.1 christos the function is called again. If EXTERNAL_RELOCS is not NULL, it
496 1.1 christos is a buffer large enough to hold the unswapped relocs. If
497 1.1 christos INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
498 1.1 christos the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
499 1.1 christos value must be INTERNAL_RELOCS. The function returns NULL on error. */
500 1.1 christos
501 1.1 christos struct internal_reloc *
502 1.1 christos _bfd_coff_read_internal_relocs (bfd *abfd,
503 1.1 christos asection *sec,
504 1.1 christos bfd_boolean cache,
505 1.1 christos bfd_byte *external_relocs,
506 1.1 christos bfd_boolean require_internal,
507 1.1 christos struct internal_reloc *internal_relocs)
508 1.1 christos {
509 1.1 christos bfd_size_type relsz;
510 1.1 christos bfd_byte *free_external = NULL;
511 1.1 christos struct internal_reloc *free_internal = NULL;
512 1.1 christos bfd_byte *erel;
513 1.1 christos bfd_byte *erel_end;
514 1.1 christos struct internal_reloc *irel;
515 1.1 christos bfd_size_type amt;
516 1.1 christos
517 1.1 christos if (sec->reloc_count == 0)
518 1.1 christos return internal_relocs; /* Nothing to do. */
519 1.1 christos
520 1.1 christos if (coff_section_data (abfd, sec) != NULL
521 1.1 christos && coff_section_data (abfd, sec)->relocs != NULL)
522 1.1 christos {
523 1.1 christos if (! require_internal)
524 1.1 christos return coff_section_data (abfd, sec)->relocs;
525 1.1 christos memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
526 1.1 christos sec->reloc_count * sizeof (struct internal_reloc));
527 1.1 christos return internal_relocs;
528 1.1 christos }
529 1.1 christos
530 1.1 christos relsz = bfd_coff_relsz (abfd);
531 1.1 christos
532 1.1 christos amt = sec->reloc_count * relsz;
533 1.1 christos if (external_relocs == NULL)
534 1.1 christos {
535 1.1 christos free_external = (bfd_byte *) bfd_malloc (amt);
536 1.1 christos if (free_external == NULL)
537 1.1 christos goto error_return;
538 1.1 christos external_relocs = free_external;
539 1.1 christos }
540 1.1 christos
541 1.1 christos if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
542 1.1 christos || bfd_bread (external_relocs, amt, abfd) != amt)
543 1.1 christos goto error_return;
544 1.1 christos
545 1.1 christos if (internal_relocs == NULL)
546 1.1 christos {
547 1.1 christos amt = sec->reloc_count;
548 1.1 christos amt *= sizeof (struct internal_reloc);
549 1.1 christos free_internal = (struct internal_reloc *) bfd_malloc (amt);
550 1.1 christos if (free_internal == NULL)
551 1.1 christos goto error_return;
552 1.1 christos internal_relocs = free_internal;
553 1.1 christos }
554 1.1 christos
555 1.1 christos /* Swap in the relocs. */
556 1.1 christos erel = external_relocs;
557 1.1 christos erel_end = erel + relsz * sec->reloc_count;
558 1.1 christos irel = internal_relocs;
559 1.1 christos for (; erel < erel_end; erel += relsz, irel++)
560 1.1 christos bfd_coff_swap_reloc_in (abfd, (void *) erel, (void *) irel);
561 1.1 christos
562 1.1 christos if (free_external != NULL)
563 1.1 christos {
564 1.1 christos free (free_external);
565 1.1 christos free_external = NULL;
566 1.1 christos }
567 1.1 christos
568 1.1 christos if (cache && free_internal != NULL)
569 1.1 christos {
570 1.1 christos if (coff_section_data (abfd, sec) == NULL)
571 1.1 christos {
572 1.1 christos amt = sizeof (struct coff_section_tdata);
573 1.1 christos sec->used_by_bfd = bfd_zalloc (abfd, amt);
574 1.1 christos if (sec->used_by_bfd == NULL)
575 1.1 christos goto error_return;
576 1.1 christos coff_section_data (abfd, sec)->contents = NULL;
577 1.1 christos }
578 1.1 christos coff_section_data (abfd, sec)->relocs = free_internal;
579 1.1 christos }
580 1.1 christos
581 1.1 christos return internal_relocs;
582 1.1 christos
583 1.1 christos error_return:
584 1.1 christos if (free_external != NULL)
585 1.1 christos free (free_external);
586 1.1 christos if (free_internal != NULL)
587 1.1 christos free (free_internal);
588 1.1 christos return NULL;
589 1.1 christos }
590 1.1 christos
591 1.1 christos /* Set lineno_count for the output sections of a COFF file. */
592 1.1 christos
593 1.1 christos int
594 1.1 christos coff_count_linenumbers (bfd *abfd)
595 1.1 christos {
596 1.1 christos unsigned int limit = bfd_get_symcount (abfd);
597 1.1 christos unsigned int i;
598 1.1 christos int total = 0;
599 1.1 christos asymbol **p;
600 1.1 christos asection *s;
601 1.1 christos
602 1.1 christos if (limit == 0)
603 1.1 christos {
604 1.1 christos /* This may be from the backend linker, in which case the
605 1.6 christos lineno_count in the sections is correct. */
606 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
607 1.1 christos total += s->lineno_count;
608 1.1 christos return total;
609 1.1 christos }
610 1.1 christos
611 1.1 christos for (s = abfd->sections; s != NULL; s = s->next)
612 1.1 christos BFD_ASSERT (s->lineno_count == 0);
613 1.1 christos
614 1.1 christos for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
615 1.1 christos {
616 1.1 christos asymbol *q_maybe = *p;
617 1.1 christos
618 1.1 christos if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
619 1.1 christos {
620 1.1 christos coff_symbol_type *q = coffsymbol (q_maybe);
621 1.1 christos
622 1.1 christos /* The AIX 4.1 compiler can sometimes generate line numbers
623 1.6 christos attached to debugging symbols. We try to simply ignore
624 1.6 christos those here. */
625 1.1 christos if (q->lineno != NULL
626 1.1 christos && q->symbol.section->owner != NULL)
627 1.1 christos {
628 1.1 christos /* This symbol has line numbers. Increment the owning
629 1.6 christos section's linenumber count. */
630 1.1 christos alent *l = q->lineno;
631 1.1 christos
632 1.1 christos do
633 1.1 christos {
634 1.1 christos asection * sec = q->symbol.section->output_section;
635 1.1 christos
636 1.1 christos /* Do not try to update fields in read-only sections. */
637 1.1 christos if (! bfd_is_const_section (sec))
638 1.1 christos sec->lineno_count ++;
639 1.1 christos
640 1.1 christos ++total;
641 1.1 christos ++l;
642 1.1 christos }
643 1.1 christos while (l->line_number != 0);
644 1.1 christos }
645 1.1 christos }
646 1.1 christos }
647 1.1 christos
648 1.1 christos return total;
649 1.1 christos }
650 1.1 christos
651 1.1 christos static void
652 1.1 christos fixup_symbol_value (bfd *abfd,
653 1.1 christos coff_symbol_type *coff_symbol_ptr,
654 1.1 christos struct internal_syment *syment)
655 1.1 christos {
656 1.1 christos /* Normalize the symbol flags. */
657 1.3 christos if (coff_symbol_ptr->symbol.section
658 1.1 christos && bfd_is_com_section (coff_symbol_ptr->symbol.section))
659 1.1 christos {
660 1.1 christos /* A common symbol is undefined with a value. */
661 1.1 christos syment->n_scnum = N_UNDEF;
662 1.1 christos syment->n_value = coff_symbol_ptr->symbol.value;
663 1.1 christos }
664 1.1 christos else if ((coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) != 0
665 1.1 christos && (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING_RELOC) == 0)
666 1.1 christos {
667 1.1 christos syment->n_value = coff_symbol_ptr->symbol.value;
668 1.1 christos }
669 1.1 christos else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
670 1.1 christos {
671 1.1 christos syment->n_scnum = N_UNDEF;
672 1.1 christos syment->n_value = 0;
673 1.1 christos }
674 1.1 christos /* FIXME: Do we need to handle the absolute section here? */
675 1.1 christos else
676 1.1 christos {
677 1.1 christos if (coff_symbol_ptr->symbol.section)
678 1.1 christos {
679 1.1 christos syment->n_scnum =
680 1.1 christos coff_symbol_ptr->symbol.section->output_section->target_index;
681 1.1 christos
682 1.1 christos syment->n_value = (coff_symbol_ptr->symbol.value
683 1.1 christos + coff_symbol_ptr->symbol.section->output_offset);
684 1.1 christos if (! obj_pe (abfd))
685 1.6 christos {
686 1.6 christos syment->n_value += (syment->n_sclass == C_STATLAB)
687 1.6 christos ? coff_symbol_ptr->symbol.section->output_section->lma
688 1.6 christos : coff_symbol_ptr->symbol.section->output_section->vma;
689 1.6 christos }
690 1.1 christos }
691 1.1 christos else
692 1.1 christos {
693 1.1 christos BFD_ASSERT (0);
694 1.1 christos /* This can happen, but I don't know why yet (steve (at) cygnus.com) */
695 1.1 christos syment->n_scnum = N_ABS;
696 1.1 christos syment->n_value = coff_symbol_ptr->symbol.value;
697 1.1 christos }
698 1.1 christos }
699 1.1 christos }
700 1.1 christos
701 1.1 christos /* Run through all the symbols in the symbol table and work out what
702 1.1 christos their indexes into the symbol table will be when output.
703 1.1 christos
704 1.1 christos Coff requires that each C_FILE symbol points to the next one in the
705 1.1 christos chain, and that the last one points to the first external symbol. We
706 1.1 christos do that here too. */
707 1.1 christos
708 1.1 christos bfd_boolean
709 1.1 christos coff_renumber_symbols (bfd *bfd_ptr, int *first_undef)
710 1.1 christos {
711 1.1 christos unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
712 1.1 christos asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
713 1.1 christos unsigned int native_index = 0;
714 1.1 christos struct internal_syment *last_file = NULL;
715 1.1 christos unsigned int symbol_index;
716 1.1 christos
717 1.1 christos /* COFF demands that undefined symbols come after all other symbols.
718 1.1 christos Since we don't need to impose this extra knowledge on all our
719 1.1 christos client programs, deal with that here. Sort the symbol table;
720 1.1 christos just move the undefined symbols to the end, leaving the rest
721 1.1 christos alone. The O'Reilly book says that defined global symbols come
722 1.1 christos at the end before the undefined symbols, so we do that here as
723 1.1 christos well. */
724 1.1 christos /* @@ Do we have some condition we could test for, so we don't always
725 1.1 christos have to do this? I don't think relocatability is quite right, but
726 1.1 christos I'm not certain. [raeburn:19920508.1711EST] */
727 1.1 christos {
728 1.1 christos asymbol **newsyms;
729 1.1 christos unsigned int i;
730 1.1 christos bfd_size_type amt;
731 1.1 christos
732 1.1 christos amt = sizeof (asymbol *) * ((bfd_size_type) symbol_count + 1);
733 1.1 christos newsyms = (asymbol **) bfd_alloc (bfd_ptr, amt);
734 1.1 christos if (!newsyms)
735 1.1 christos return FALSE;
736 1.1 christos bfd_ptr->outsymbols = newsyms;
737 1.1 christos for (i = 0; i < symbol_count; i++)
738 1.1 christos if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
739 1.1 christos || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
740 1.1 christos && !bfd_is_com_section (symbol_ptr_ptr[i]->section)
741 1.1 christos && ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) != 0
742 1.1 christos || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
743 1.1 christos == 0))))
744 1.1 christos *newsyms++ = symbol_ptr_ptr[i];
745 1.1 christos
746 1.1 christos for (i = 0; i < symbol_count; i++)
747 1.1 christos if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
748 1.1 christos && !bfd_is_und_section (symbol_ptr_ptr[i]->section)
749 1.1 christos && (bfd_is_com_section (symbol_ptr_ptr[i]->section)
750 1.1 christos || ((symbol_ptr_ptr[i]->flags & BSF_FUNCTION) == 0
751 1.1 christos && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_WEAK))
752 1.1 christos != 0))))
753 1.1 christos *newsyms++ = symbol_ptr_ptr[i];
754 1.1 christos
755 1.1 christos *first_undef = newsyms - bfd_ptr->outsymbols;
756 1.1 christos
757 1.1 christos for (i = 0; i < symbol_count; i++)
758 1.1 christos if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
759 1.1 christos && bfd_is_und_section (symbol_ptr_ptr[i]->section))
760 1.1 christos *newsyms++ = symbol_ptr_ptr[i];
761 1.1 christos *newsyms = (asymbol *) NULL;
762 1.1 christos symbol_ptr_ptr = bfd_ptr->outsymbols;
763 1.1 christos }
764 1.1 christos
765 1.1 christos for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
766 1.1 christos {
767 1.3 christos coff_symbol_type *coff_symbol_ptr;
768 1.3 christos
769 1.3 christos coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
770 1.1 christos symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
771 1.1 christos if (coff_symbol_ptr && coff_symbol_ptr->native)
772 1.1 christos {
773 1.1 christos combined_entry_type *s = coff_symbol_ptr->native;
774 1.1 christos int i;
775 1.1 christos
776 1.3 christos BFD_ASSERT (s->is_sym);
777 1.1 christos if (s->u.syment.n_sclass == C_FILE)
778 1.1 christos {
779 1.1 christos if (last_file != NULL)
780 1.1 christos last_file->n_value = native_index;
781 1.1 christos last_file = &(s->u.syment);
782 1.1 christos }
783 1.1 christos else
784 1.1 christos /* Modify the symbol values according to their section and
785 1.1 christos type. */
786 1.1 christos fixup_symbol_value (bfd_ptr, coff_symbol_ptr, &(s->u.syment));
787 1.1 christos
788 1.1 christos for (i = 0; i < s->u.syment.n_numaux + 1; i++)
789 1.1 christos s[i].offset = native_index++;
790 1.1 christos }
791 1.1 christos else
792 1.1 christos native_index++;
793 1.1 christos }
794 1.1 christos
795 1.1 christos obj_conv_table_size (bfd_ptr) = native_index;
796 1.1 christos
797 1.1 christos return TRUE;
798 1.1 christos }
799 1.1 christos
800 1.1 christos /* Run thorough the symbol table again, and fix it so that all
801 1.1 christos pointers to entries are changed to the entries' index in the output
802 1.1 christos symbol table. */
803 1.1 christos
804 1.1 christos void
805 1.1 christos coff_mangle_symbols (bfd *bfd_ptr)
806 1.1 christos {
807 1.1 christos unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
808 1.1 christos asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
809 1.1 christos unsigned int symbol_index;
810 1.1 christos
811 1.1 christos for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
812 1.1 christos {
813 1.3 christos coff_symbol_type *coff_symbol_ptr;
814 1.1 christos
815 1.3 christos coff_symbol_ptr = coff_symbol_from (symbol_ptr_ptr[symbol_index]);
816 1.1 christos if (coff_symbol_ptr && coff_symbol_ptr->native)
817 1.1 christos {
818 1.1 christos int i;
819 1.1 christos combined_entry_type *s = coff_symbol_ptr->native;
820 1.1 christos
821 1.3 christos BFD_ASSERT (s->is_sym);
822 1.1 christos if (s->fix_value)
823 1.1 christos {
824 1.1 christos /* FIXME: We should use a union here. */
825 1.1 christos s->u.syment.n_value =
826 1.1 christos (bfd_hostptr_t) ((combined_entry_type *)
827 1.1 christos ((bfd_hostptr_t) s->u.syment.n_value))->offset;
828 1.1 christos s->fix_value = 0;
829 1.1 christos }
830 1.1 christos if (s->fix_line)
831 1.1 christos {
832 1.1 christos /* The value is the offset into the line number entries
833 1.6 christos for the symbol's section. On output, the symbol's
834 1.6 christos section should be N_DEBUG. */
835 1.1 christos s->u.syment.n_value =
836 1.1 christos (coff_symbol_ptr->symbol.section->output_section->line_filepos
837 1.1 christos + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
838 1.1 christos coff_symbol_ptr->symbol.section =
839 1.1 christos coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
840 1.1 christos BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
841 1.1 christos }
842 1.1 christos for (i = 0; i < s->u.syment.n_numaux; i++)
843 1.1 christos {
844 1.1 christos combined_entry_type *a = s + i + 1;
845 1.7 christos
846 1.3 christos BFD_ASSERT (! a->is_sym);
847 1.1 christos if (a->fix_tag)
848 1.1 christos {
849 1.1 christos a->u.auxent.x_sym.x_tagndx.l =
850 1.1 christos a->u.auxent.x_sym.x_tagndx.p->offset;
851 1.1 christos a->fix_tag = 0;
852 1.1 christos }
853 1.1 christos if (a->fix_end)
854 1.1 christos {
855 1.1 christos a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
856 1.1 christos a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
857 1.1 christos a->fix_end = 0;
858 1.1 christos }
859 1.1 christos if (a->fix_scnlen)
860 1.1 christos {
861 1.1 christos a->u.auxent.x_csect.x_scnlen.l =
862 1.1 christos a->u.auxent.x_csect.x_scnlen.p->offset;
863 1.1 christos a->fix_scnlen = 0;
864 1.1 christos }
865 1.1 christos }
866 1.1 christos }
867 1.1 christos }
868 1.1 christos }
869 1.1 christos
870 1.1 christos static void
871 1.1 christos coff_fix_symbol_name (bfd *abfd,
872 1.1 christos asymbol *symbol,
873 1.1 christos combined_entry_type *native,
874 1.1 christos bfd_size_type *string_size_p,
875 1.1 christos asection **debug_string_section_p,
876 1.1 christos bfd_size_type *debug_string_size_p)
877 1.1 christos {
878 1.1 christos unsigned int name_length;
879 1.1 christos union internal_auxent *auxent;
880 1.1 christos char *name = (char *) (symbol->name);
881 1.1 christos
882 1.1 christos if (name == NULL)
883 1.1 christos {
884 1.1 christos /* COFF symbols always have names, so we'll make one up. */
885 1.1 christos symbol->name = "strange";
886 1.1 christos name = (char *) symbol->name;
887 1.1 christos }
888 1.1 christos name_length = strlen (name);
889 1.1 christos
890 1.3 christos BFD_ASSERT (native->is_sym);
891 1.1 christos if (native->u.syment.n_sclass == C_FILE
892 1.1 christos && native->u.syment.n_numaux > 0)
893 1.1 christos {
894 1.1 christos unsigned int filnmlen;
895 1.1 christos
896 1.1 christos if (bfd_coff_force_symnames_in_strings (abfd))
897 1.1 christos {
898 1.6 christos native->u.syment._n._n_n._n_offset =
899 1.1 christos (*string_size_p + STRING_SIZE_SIZE);
900 1.1 christos native->u.syment._n._n_n._n_zeroes = 0;
901 1.1 christos *string_size_p += 6; /* strlen(".file") + 1 */
902 1.1 christos }
903 1.1 christos else
904 1.6 christos strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
905 1.1 christos
906 1.3 christos BFD_ASSERT (! (native + 1)->is_sym);
907 1.1 christos auxent = &(native + 1)->u.auxent;
908 1.1 christos
909 1.1 christos filnmlen = bfd_coff_filnmlen (abfd);
910 1.1 christos
911 1.1 christos if (bfd_coff_long_filenames (abfd))
912 1.1 christos {
913 1.1 christos if (name_length <= filnmlen)
914 1.1 christos strncpy (auxent->x_file.x_fname, name, filnmlen);
915 1.1 christos else
916 1.1 christos {
917 1.1 christos auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
918 1.1 christos auxent->x_file.x_n.x_zeroes = 0;
919 1.1 christos *string_size_p += name_length + 1;
920 1.1 christos }
921 1.1 christos }
922 1.1 christos else
923 1.1 christos {
924 1.1 christos strncpy (auxent->x_file.x_fname, name, filnmlen);
925 1.1 christos if (name_length > filnmlen)
926 1.1 christos name[filnmlen] = '\0';
927 1.1 christos }
928 1.1 christos }
929 1.1 christos else
930 1.1 christos {
931 1.1 christos if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
932 1.1 christos /* This name will fit into the symbol neatly. */
933 1.1 christos strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
934 1.1 christos
935 1.1 christos else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
936 1.1 christos {
937 1.1 christos native->u.syment._n._n_n._n_offset = (*string_size_p
938 1.1 christos + STRING_SIZE_SIZE);
939 1.1 christos native->u.syment._n._n_n._n_zeroes = 0;
940 1.1 christos *string_size_p += name_length + 1;
941 1.1 christos }
942 1.1 christos else
943 1.1 christos {
944 1.1 christos file_ptr filepos;
945 1.1 christos bfd_byte buf[4];
946 1.1 christos int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
947 1.1 christos
948 1.1 christos /* This name should be written into the .debug section. For
949 1.1 christos some reason each name is preceded by a two byte length
950 1.1 christos and also followed by a null byte. FIXME: We assume that
951 1.1 christos the .debug section has already been created, and that it
952 1.1 christos is large enough. */
953 1.1 christos if (*debug_string_section_p == (asection *) NULL)
954 1.1 christos *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
955 1.1 christos filepos = bfd_tell (abfd);
956 1.1 christos if (prefix_len == 4)
957 1.1 christos bfd_put_32 (abfd, (bfd_vma) (name_length + 1), buf);
958 1.1 christos else
959 1.1 christos bfd_put_16 (abfd, (bfd_vma) (name_length + 1), buf);
960 1.1 christos
961 1.1 christos if (!bfd_set_section_contents (abfd,
962 1.1 christos *debug_string_section_p,
963 1.1 christos (void *) buf,
964 1.1 christos (file_ptr) *debug_string_size_p,
965 1.1 christos (bfd_size_type) prefix_len)
966 1.1 christos || !bfd_set_section_contents (abfd,
967 1.1 christos *debug_string_section_p,
968 1.1 christos (void *) symbol->name,
969 1.1 christos (file_ptr) (*debug_string_size_p
970 1.1 christos + prefix_len),
971 1.1 christos (bfd_size_type) name_length + 1))
972 1.1 christos abort ();
973 1.1 christos if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
974 1.1 christos abort ();
975 1.1 christos native->u.syment._n._n_n._n_offset =
976 1.1 christos *debug_string_size_p + prefix_len;
977 1.1 christos native->u.syment._n._n_n._n_zeroes = 0;
978 1.1 christos *debug_string_size_p += name_length + 1 + prefix_len;
979 1.1 christos }
980 1.1 christos }
981 1.1 christos }
982 1.1 christos
983 1.1 christos /* We need to keep track of the symbol index so that when we write out
984 1.1 christos the relocs we can get the index for a symbol. This method is a
985 1.1 christos hack. FIXME. */
986 1.1 christos
987 1.1 christos #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
988 1.1 christos
989 1.1 christos /* Write a symbol out to a COFF file. */
990 1.1 christos
991 1.1 christos static bfd_boolean
992 1.1 christos coff_write_symbol (bfd *abfd,
993 1.1 christos asymbol *symbol,
994 1.1 christos combined_entry_type *native,
995 1.1 christos bfd_vma *written,
996 1.1 christos bfd_size_type *string_size_p,
997 1.1 christos asection **debug_string_section_p,
998 1.1 christos bfd_size_type *debug_string_size_p)
999 1.1 christos {
1000 1.1 christos unsigned int numaux = native->u.syment.n_numaux;
1001 1.1 christos int type = native->u.syment.n_type;
1002 1.1 christos int n_sclass = (int) native->u.syment.n_sclass;
1003 1.1 christos asection *output_section = symbol->section->output_section
1004 1.1 christos ? symbol->section->output_section
1005 1.1 christos : symbol->section;
1006 1.1 christos void * buf;
1007 1.1 christos bfd_size_type symesz;
1008 1.1 christos
1009 1.3 christos BFD_ASSERT (native->is_sym);
1010 1.3 christos
1011 1.1 christos if (native->u.syment.n_sclass == C_FILE)
1012 1.1 christos symbol->flags |= BSF_DEBUGGING;
1013 1.1 christos
1014 1.1 christos if (symbol->flags & BSF_DEBUGGING
1015 1.1 christos && bfd_is_abs_section (symbol->section))
1016 1.1 christos native->u.syment.n_scnum = N_DEBUG;
1017 1.1 christos
1018 1.1 christos else if (bfd_is_abs_section (symbol->section))
1019 1.1 christos native->u.syment.n_scnum = N_ABS;
1020 1.1 christos
1021 1.1 christos else if (bfd_is_und_section (symbol->section))
1022 1.1 christos native->u.syment.n_scnum = N_UNDEF;
1023 1.1 christos
1024 1.1 christos else
1025 1.1 christos native->u.syment.n_scnum =
1026 1.1 christos output_section->target_index;
1027 1.1 christos
1028 1.1 christos coff_fix_symbol_name (abfd, symbol, native, string_size_p,
1029 1.1 christos debug_string_section_p, debug_string_size_p);
1030 1.1 christos
1031 1.1 christos symesz = bfd_coff_symesz (abfd);
1032 1.1 christos buf = bfd_alloc (abfd, symesz);
1033 1.1 christos if (!buf)
1034 1.1 christos return FALSE;
1035 1.1 christos bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
1036 1.1 christos if (bfd_bwrite (buf, symesz, abfd) != symesz)
1037 1.1 christos return FALSE;
1038 1.1 christos bfd_release (abfd, buf);
1039 1.1 christos
1040 1.1 christos if (native->u.syment.n_numaux > 0)
1041 1.1 christos {
1042 1.1 christos bfd_size_type auxesz;
1043 1.1 christos unsigned int j;
1044 1.1 christos
1045 1.1 christos auxesz = bfd_coff_auxesz (abfd);
1046 1.1 christos buf = bfd_alloc (abfd, auxesz);
1047 1.1 christos if (!buf)
1048 1.1 christos return FALSE;
1049 1.1 christos for (j = 0; j < native->u.syment.n_numaux; j++)
1050 1.1 christos {
1051 1.3 christos BFD_ASSERT (! (native + j + 1)->is_sym);
1052 1.1 christos bfd_coff_swap_aux_out (abfd,
1053 1.1 christos &((native + j + 1)->u.auxent),
1054 1.1 christos type, n_sclass, (int) j,
1055 1.1 christos native->u.syment.n_numaux,
1056 1.1 christos buf);
1057 1.1 christos if (bfd_bwrite (buf, auxesz, abfd) != auxesz)
1058 1.1 christos return FALSE;
1059 1.1 christos }
1060 1.1 christos bfd_release (abfd, buf);
1061 1.1 christos }
1062 1.1 christos
1063 1.1 christos /* Store the index for use when we write out the relocs. */
1064 1.1 christos set_index (symbol, *written);
1065 1.1 christos
1066 1.1 christos *written += numaux + 1;
1067 1.1 christos return TRUE;
1068 1.1 christos }
1069 1.1 christos
1070 1.1 christos /* Write out a symbol to a COFF file that does not come from a COFF
1071 1.1 christos file originally. This symbol may have been created by the linker,
1072 1.1 christos or we may be linking a non COFF file to a COFF file. */
1073 1.1 christos
1074 1.1 christos bfd_boolean
1075 1.1 christos coff_write_alien_symbol (bfd *abfd,
1076 1.1 christos asymbol *symbol,
1077 1.1 christos struct internal_syment *isym,
1078 1.5 christos union internal_auxent *iaux,
1079 1.1 christos bfd_vma *written,
1080 1.1 christos bfd_size_type *string_size_p,
1081 1.1 christos asection **debug_string_section_p,
1082 1.1 christos bfd_size_type *debug_string_size_p)
1083 1.1 christos {
1084 1.1 christos combined_entry_type *native;
1085 1.1 christos combined_entry_type dummy[2];
1086 1.1 christos asection *output_section = symbol->section->output_section
1087 1.1 christos ? symbol->section->output_section
1088 1.1 christos : symbol->section;
1089 1.1 christos struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1090 1.1 christos bfd_boolean ret;
1091 1.1 christos
1092 1.1 christos if ((!link_info || link_info->strip_discarded)
1093 1.1 christos && !bfd_is_abs_section (symbol->section)
1094 1.1 christos && symbol->section->output_section == bfd_abs_section_ptr)
1095 1.1 christos {
1096 1.1 christos symbol->name = "";
1097 1.1 christos if (isym != NULL)
1098 1.6 christos memset (isym, 0, sizeof (*isym));
1099 1.1 christos return TRUE;
1100 1.1 christos }
1101 1.1 christos native = dummy;
1102 1.3 christos native->is_sym = TRUE;
1103 1.3 christos native[1].is_sym = FALSE;
1104 1.1 christos native->u.syment.n_type = T_NULL;
1105 1.1 christos native->u.syment.n_flags = 0;
1106 1.1 christos native->u.syment.n_numaux = 0;
1107 1.1 christos if (bfd_is_und_section (symbol->section))
1108 1.1 christos {
1109 1.1 christos native->u.syment.n_scnum = N_UNDEF;
1110 1.1 christos native->u.syment.n_value = symbol->value;
1111 1.1 christos }
1112 1.1 christos else if (bfd_is_com_section (symbol->section))
1113 1.1 christos {
1114 1.1 christos native->u.syment.n_scnum = N_UNDEF;
1115 1.1 christos native->u.syment.n_value = symbol->value;
1116 1.1 christos }
1117 1.1 christos else if (symbol->flags & BSF_FILE)
1118 1.1 christos {
1119 1.1 christos native->u.syment.n_scnum = N_DEBUG;
1120 1.1 christos native->u.syment.n_numaux = 1;
1121 1.1 christos }
1122 1.1 christos else if (symbol->flags & BSF_DEBUGGING)
1123 1.1 christos {
1124 1.1 christos /* There isn't much point to writing out a debugging symbol
1125 1.6 christos unless we are prepared to convert it into COFF debugging
1126 1.6 christos format. So, we just ignore them. We must clobber the symbol
1127 1.6 christos name to keep it from being put in the string table. */
1128 1.1 christos symbol->name = "";
1129 1.1 christos if (isym != NULL)
1130 1.6 christos memset (isym, 0, sizeof (*isym));
1131 1.1 christos return TRUE;
1132 1.1 christos }
1133 1.1 christos else
1134 1.1 christos {
1135 1.1 christos native->u.syment.n_scnum = output_section->target_index;
1136 1.1 christos native->u.syment.n_value = (symbol->value
1137 1.1 christos + symbol->section->output_offset);
1138 1.1 christos if (! obj_pe (abfd))
1139 1.1 christos native->u.syment.n_value += output_section->vma;
1140 1.1 christos
1141 1.1 christos /* Copy the any flags from the file header into the symbol.
1142 1.6 christos FIXME: Why? */
1143 1.1 christos {
1144 1.3 christos coff_symbol_type *c = coff_symbol_from (symbol);
1145 1.1 christos if (c != (coff_symbol_type *) NULL)
1146 1.1 christos native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
1147 1.1 christos }
1148 1.1 christos }
1149 1.1 christos
1150 1.1 christos native->u.syment.n_type = 0;
1151 1.1 christos if (symbol->flags & BSF_FILE)
1152 1.1 christos native->u.syment.n_sclass = C_FILE;
1153 1.1 christos else if (symbol->flags & BSF_LOCAL)
1154 1.1 christos native->u.syment.n_sclass = C_STAT;
1155 1.1 christos else if (symbol->flags & BSF_WEAK)
1156 1.1 christos native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1157 1.1 christos else
1158 1.1 christos native->u.syment.n_sclass = C_EXT;
1159 1.1 christos
1160 1.1 christos ret = coff_write_symbol (abfd, symbol, native, written, string_size_p,
1161 1.1 christos debug_string_section_p, debug_string_size_p);
1162 1.1 christos if (isym != NULL)
1163 1.1 christos *isym = native->u.syment;
1164 1.5 christos if (iaux != NULL && native->u.syment.n_numaux)
1165 1.5 christos *iaux = native[1].u.auxent;
1166 1.1 christos return ret;
1167 1.1 christos }
1168 1.1 christos
1169 1.1 christos /* Write a native symbol to a COFF file. */
1170 1.1 christos
1171 1.1 christos static bfd_boolean
1172 1.1 christos coff_write_native_symbol (bfd *abfd,
1173 1.1 christos coff_symbol_type *symbol,
1174 1.1 christos bfd_vma *written,
1175 1.1 christos bfd_size_type *string_size_p,
1176 1.1 christos asection **debug_string_section_p,
1177 1.1 christos bfd_size_type *debug_string_size_p)
1178 1.1 christos {
1179 1.1 christos combined_entry_type *native = symbol->native;
1180 1.1 christos alent *lineno = symbol->lineno;
1181 1.1 christos struct bfd_link_info *link_info = coff_data (abfd)->link_info;
1182 1.1 christos
1183 1.1 christos if ((!link_info || link_info->strip_discarded)
1184 1.1 christos && !bfd_is_abs_section (symbol->symbol.section)
1185 1.1 christos && symbol->symbol.section->output_section == bfd_abs_section_ptr)
1186 1.1 christos {
1187 1.1 christos symbol->symbol.name = "";
1188 1.1 christos return TRUE;
1189 1.1 christos }
1190 1.1 christos
1191 1.3 christos BFD_ASSERT (native->is_sym);
1192 1.1 christos /* If this symbol has an associated line number, we must store the
1193 1.1 christos symbol index in the line number field. We also tag the auxent to
1194 1.1 christos point to the right place in the lineno table. */
1195 1.1 christos if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL)
1196 1.1 christos {
1197 1.1 christos unsigned int count = 0;
1198 1.1 christos
1199 1.1 christos lineno[count].u.offset = *written;
1200 1.1 christos if (native->u.syment.n_numaux)
1201 1.1 christos {
1202 1.1 christos union internal_auxent *a = &((native + 1)->u.auxent);
1203 1.1 christos
1204 1.1 christos a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1205 1.1 christos symbol->symbol.section->output_section->moving_line_filepos;
1206 1.1 christos }
1207 1.1 christos
1208 1.1 christos /* Count and relocate all other linenumbers. */
1209 1.1 christos count++;
1210 1.1 christos while (lineno[count].line_number != 0)
1211 1.1 christos {
1212 1.1 christos lineno[count].u.offset +=
1213 1.1 christos (symbol->symbol.section->output_section->vma
1214 1.1 christos + symbol->symbol.section->output_offset);
1215 1.1 christos count++;
1216 1.1 christos }
1217 1.1 christos symbol->done_lineno = TRUE;
1218 1.1 christos
1219 1.1 christos if (! bfd_is_const_section (symbol->symbol.section->output_section))
1220 1.1 christos symbol->symbol.section->output_section->moving_line_filepos +=
1221 1.1 christos count * bfd_coff_linesz (abfd);
1222 1.1 christos }
1223 1.1 christos
1224 1.1 christos return coff_write_symbol (abfd, &(symbol->symbol), native, written,
1225 1.1 christos string_size_p, debug_string_section_p,
1226 1.1 christos debug_string_size_p);
1227 1.1 christos }
1228 1.1 christos
1229 1.1 christos static void
1230 1.6 christos null_error_handler (const char *fmt ATTRIBUTE_UNUSED,
1231 1.6 christos va_list ap ATTRIBUTE_UNUSED)
1232 1.1 christos {
1233 1.1 christos }
1234 1.1 christos
1235 1.1 christos /* Write out the COFF symbols. */
1236 1.1 christos
1237 1.1 christos bfd_boolean
1238 1.1 christos coff_write_symbols (bfd *abfd)
1239 1.1 christos {
1240 1.1 christos bfd_size_type string_size;
1241 1.1 christos asection *debug_string_section;
1242 1.1 christos bfd_size_type debug_string_size;
1243 1.1 christos unsigned int i;
1244 1.1 christos unsigned int limit = bfd_get_symcount (abfd);
1245 1.1 christos bfd_vma written = 0;
1246 1.1 christos asymbol **p;
1247 1.1 christos
1248 1.1 christos string_size = 0;
1249 1.1 christos debug_string_section = NULL;
1250 1.1 christos debug_string_size = 0;
1251 1.1 christos
1252 1.1 christos /* If this target supports long section names, they must be put into
1253 1.1 christos the string table. This is supported by PE. This code must
1254 1.1 christos handle section names just as they are handled in
1255 1.1 christos coff_write_object_contents. */
1256 1.1 christos if (bfd_coff_long_section_names (abfd))
1257 1.1 christos {
1258 1.1 christos asection *o;
1259 1.1 christos
1260 1.1 christos for (o = abfd->sections; o != NULL; o = o->next)
1261 1.1 christos {
1262 1.1 christos size_t len;
1263 1.1 christos
1264 1.1 christos len = strlen (o->name);
1265 1.1 christos if (len > SCNNMLEN)
1266 1.1 christos string_size += len + 1;
1267 1.1 christos }
1268 1.1 christos }
1269 1.1 christos
1270 1.1 christos /* Seek to the right place. */
1271 1.1 christos if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
1272 1.1 christos return FALSE;
1273 1.1 christos
1274 1.1 christos /* Output all the symbols we have. */
1275 1.1 christos written = 0;
1276 1.1 christos for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1277 1.1 christos {
1278 1.1 christos asymbol *symbol = *p;
1279 1.3 christos coff_symbol_type *c_symbol = coff_symbol_from (symbol);
1280 1.1 christos
1281 1.1 christos if (c_symbol == (coff_symbol_type *) NULL
1282 1.1 christos || c_symbol->native == (combined_entry_type *) NULL)
1283 1.1 christos {
1284 1.5 christos if (!coff_write_alien_symbol (abfd, symbol, NULL, NULL, &written,
1285 1.1 christos &string_size, &debug_string_section,
1286 1.1 christos &debug_string_size))
1287 1.1 christos return FALSE;
1288 1.1 christos }
1289 1.1 christos else
1290 1.1 christos {
1291 1.1 christos if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL)
1292 1.1 christos {
1293 1.1 christos bfd_error_handler_type current_error_handler;
1294 1.1 christos enum coff_symbol_classification sym_class;
1295 1.1 christos unsigned char *n_sclass;
1296 1.1 christos
1297 1.1 christos /* Suppress error reporting by bfd_coff_classify_symbol.
1298 1.1 christos Error messages can be generated when we are processing a local
1299 1.1 christos symbol which has no associated section and we do not have to
1300 1.1 christos worry about this, all we need to know is that it is local. */
1301 1.1 christos current_error_handler = bfd_set_error_handler (null_error_handler);
1302 1.3 christos BFD_ASSERT (c_symbol->native->is_sym);
1303 1.1 christos sym_class = bfd_coff_classify_symbol (abfd,
1304 1.3 christos &c_symbol->native->u.syment);
1305 1.1 christos (void) bfd_set_error_handler (current_error_handler);
1306 1.1 christos
1307 1.1 christos n_sclass = &c_symbol->native->u.syment.n_sclass;
1308 1.1 christos
1309 1.1 christos /* If the symbol class has been changed (eg objcopy/ld script/etc)
1310 1.1 christos we cannot retain the existing sclass from the original symbol.
1311 1.1 christos Weak symbols only have one valid sclass, so just set it always.
1312 1.1 christos If it is not local class and should be, set it C_STAT.
1313 1.1 christos If it is global and not classified as global, or if it is
1314 1.1 christos weak (which is also classified as global), set it C_EXT. */
1315 1.1 christos
1316 1.1 christos if (symbol->flags & BSF_WEAK)
1317 1.1 christos *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT;
1318 1.1 christos else if (symbol->flags & BSF_LOCAL && sym_class != COFF_SYMBOL_LOCAL)
1319 1.1 christos *n_sclass = C_STAT;
1320 1.1 christos else if (symbol->flags & BSF_GLOBAL
1321 1.1 christos && (sym_class != COFF_SYMBOL_GLOBAL
1322 1.1 christos #ifdef COFF_WITH_PE
1323 1.1 christos || *n_sclass == C_NT_WEAK
1324 1.1 christos #endif
1325 1.1 christos || *n_sclass == C_WEAKEXT))
1326 1.1 christos c_symbol->native->u.syment.n_sclass = C_EXT;
1327 1.1 christos }
1328 1.1 christos
1329 1.1 christos if (!coff_write_native_symbol (abfd, c_symbol, &written,
1330 1.1 christos &string_size, &debug_string_section,
1331 1.1 christos &debug_string_size))
1332 1.1 christos return FALSE;
1333 1.1 christos }
1334 1.1 christos }
1335 1.1 christos
1336 1.1 christos obj_raw_syment_count (abfd) = written;
1337 1.1 christos
1338 1.1 christos /* Now write out strings. */
1339 1.1 christos if (string_size != 0)
1340 1.1 christos {
1341 1.1 christos unsigned int size = string_size + STRING_SIZE_SIZE;
1342 1.1 christos bfd_byte buffer[STRING_SIZE_SIZE];
1343 1.1 christos
1344 1.1 christos #if STRING_SIZE_SIZE == 4
1345 1.1 christos H_PUT_32 (abfd, size, buffer);
1346 1.1 christos #else
1347 1.1 christos #error Change H_PUT_32
1348 1.1 christos #endif
1349 1.1 christos if (bfd_bwrite ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd)
1350 1.1 christos != sizeof (buffer))
1351 1.1 christos return FALSE;
1352 1.1 christos
1353 1.1 christos /* Handle long section names. This code must handle section
1354 1.1 christos names just as they are handled in coff_write_object_contents. */
1355 1.1 christos if (bfd_coff_long_section_names (abfd))
1356 1.1 christos {
1357 1.1 christos asection *o;
1358 1.1 christos
1359 1.1 christos for (o = abfd->sections; o != NULL; o = o->next)
1360 1.1 christos {
1361 1.1 christos size_t len;
1362 1.1 christos
1363 1.1 christos len = strlen (o->name);
1364 1.1 christos if (len > SCNNMLEN)
1365 1.1 christos {
1366 1.1 christos if (bfd_bwrite (o->name, (bfd_size_type) (len + 1), abfd)
1367 1.1 christos != len + 1)
1368 1.1 christos return FALSE;
1369 1.1 christos }
1370 1.1 christos }
1371 1.1 christos }
1372 1.1 christos
1373 1.1 christos for (p = abfd->outsymbols, i = 0;
1374 1.1 christos i < limit;
1375 1.1 christos i++, p++)
1376 1.1 christos {
1377 1.1 christos asymbol *q = *p;
1378 1.1 christos size_t name_length = strlen (q->name);
1379 1.3 christos coff_symbol_type *c_symbol = coff_symbol_from (q);
1380 1.1 christos size_t maxlen;
1381 1.1 christos
1382 1.1 christos /* Figure out whether the symbol name should go in the string
1383 1.1 christos table. Symbol names that are short enough are stored
1384 1.1 christos directly in the syment structure. File names permit a
1385 1.1 christos different, longer, length in the syment structure. On
1386 1.1 christos XCOFF, some symbol names are stored in the .debug section
1387 1.1 christos rather than in the string table. */
1388 1.1 christos
1389 1.1 christos if (c_symbol == NULL
1390 1.1 christos || c_symbol->native == NULL)
1391 1.1 christos /* This is not a COFF symbol, so it certainly is not a
1392 1.1 christos file name, nor does it go in the .debug section. */
1393 1.1 christos maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1394 1.1 christos
1395 1.3 christos else if (! c_symbol->native->is_sym)
1396 1.3 christos maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1397 1.3 christos
1398 1.1 christos else if (bfd_coff_symname_in_debug (abfd,
1399 1.1 christos &c_symbol->native->u.syment))
1400 1.1 christos /* This symbol name is in the XCOFF .debug section.
1401 1.1 christos Don't write it into the string table. */
1402 1.1 christos maxlen = name_length;
1403 1.1 christos
1404 1.1 christos else if (c_symbol->native->u.syment.n_sclass == C_FILE
1405 1.1 christos && c_symbol->native->u.syment.n_numaux > 0)
1406 1.1 christos {
1407 1.1 christos if (bfd_coff_force_symnames_in_strings (abfd))
1408 1.1 christos {
1409 1.1 christos if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6)
1410 1.1 christos return FALSE;
1411 1.1 christos }
1412 1.1 christos maxlen = bfd_coff_filnmlen (abfd);
1413 1.1 christos }
1414 1.1 christos else
1415 1.1 christos maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
1416 1.1 christos
1417 1.1 christos if (name_length > maxlen)
1418 1.1 christos {
1419 1.1 christos if (bfd_bwrite ((void *) (q->name), (bfd_size_type) name_length + 1,
1420 1.1 christos abfd) != name_length + 1)
1421 1.1 christos return FALSE;
1422 1.1 christos }
1423 1.1 christos }
1424 1.1 christos }
1425 1.1 christos else
1426 1.1 christos {
1427 1.1 christos /* We would normally not write anything here, but we'll write
1428 1.6 christos out 4 so that any stupid coff reader which tries to read the
1429 1.6 christos string table even when there isn't one won't croak. */
1430 1.1 christos unsigned int size = STRING_SIZE_SIZE;
1431 1.1 christos bfd_byte buffer[STRING_SIZE_SIZE];
1432 1.1 christos
1433 1.1 christos #if STRING_SIZE_SIZE == 4
1434 1.1 christos H_PUT_32 (abfd, size, buffer);
1435 1.1 christos #else
1436 1.1 christos #error Change H_PUT_32
1437 1.1 christos #endif
1438 1.1 christos if (bfd_bwrite ((void *) buffer, (bfd_size_type) STRING_SIZE_SIZE, abfd)
1439 1.1 christos != STRING_SIZE_SIZE)
1440 1.1 christos return FALSE;
1441 1.1 christos }
1442 1.1 christos
1443 1.1 christos /* Make sure the .debug section was created to be the correct size.
1444 1.1 christos We should create it ourselves on the fly, but we don't because
1445 1.1 christos BFD won't let us write to any section until we know how large all
1446 1.1 christos the sections are. We could still do it by making another pass
1447 1.1 christos over the symbols. FIXME. */
1448 1.1 christos BFD_ASSERT (debug_string_size == 0
1449 1.1 christos || (debug_string_section != (asection *) NULL
1450 1.1 christos && (BFD_ALIGN (debug_string_size,
1451 1.1 christos 1 << debug_string_section->alignment_power)
1452 1.1 christos == debug_string_section->size)));
1453 1.1 christos
1454 1.1 christos return TRUE;
1455 1.1 christos }
1456 1.1 christos
1457 1.1 christos bfd_boolean
1458 1.1 christos coff_write_linenumbers (bfd *abfd)
1459 1.1 christos {
1460 1.1 christos asection *s;
1461 1.1 christos bfd_size_type linesz;
1462 1.1 christos void * buff;
1463 1.1 christos
1464 1.1 christos linesz = bfd_coff_linesz (abfd);
1465 1.1 christos buff = bfd_alloc (abfd, linesz);
1466 1.1 christos if (!buff)
1467 1.1 christos return FALSE;
1468 1.1 christos for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1469 1.1 christos {
1470 1.1 christos if (s->lineno_count)
1471 1.1 christos {
1472 1.1 christos asymbol **q = abfd->outsymbols;
1473 1.1 christos if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
1474 1.1 christos return FALSE;
1475 1.1 christos /* Find all the linenumbers in this section. */
1476 1.1 christos while (*q)
1477 1.1 christos {
1478 1.1 christos asymbol *p = *q;
1479 1.1 christos if (p->section->output_section == s)
1480 1.1 christos {
1481 1.1 christos alent *l =
1482 1.1 christos BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1483 1.1 christos (bfd_asymbol_bfd (p), p));
1484 1.1 christos if (l)
1485 1.1 christos {
1486 1.1 christos /* Found a linenumber entry, output. */
1487 1.1 christos struct internal_lineno out;
1488 1.3 christos
1489 1.1 christos memset ((void *) & out, 0, sizeof (out));
1490 1.1 christos out.l_lnno = 0;
1491 1.1 christos out.l_addr.l_symndx = l->u.offset;
1492 1.1 christos bfd_coff_swap_lineno_out (abfd, &out, buff);
1493 1.1 christos if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1494 1.1 christos != linesz)
1495 1.1 christos return FALSE;
1496 1.1 christos l++;
1497 1.1 christos while (l->line_number)
1498 1.1 christos {
1499 1.1 christos out.l_lnno = l->line_number;
1500 1.1 christos out.l_addr.l_symndx = l->u.offset;
1501 1.1 christos bfd_coff_swap_lineno_out (abfd, &out, buff);
1502 1.1 christos if (bfd_bwrite (buff, (bfd_size_type) linesz, abfd)
1503 1.1 christos != linesz)
1504 1.1 christos return FALSE;
1505 1.1 christos l++;
1506 1.1 christos }
1507 1.1 christos }
1508 1.1 christos }
1509 1.1 christos q++;
1510 1.1 christos }
1511 1.1 christos }
1512 1.1 christos }
1513 1.1 christos bfd_release (abfd, buff);
1514 1.1 christos return TRUE;
1515 1.1 christos }
1516 1.1 christos
1517 1.1 christos alent *
1518 1.1 christos coff_get_lineno (bfd *ignore_abfd ATTRIBUTE_UNUSED, asymbol *symbol)
1519 1.1 christos {
1520 1.1 christos return coffsymbol (symbol)->lineno;
1521 1.1 christos }
1522 1.1 christos
1523 1.1 christos /* This function transforms the offsets into the symbol table into
1524 1.1 christos pointers to syments. */
1525 1.1 christos
1526 1.1 christos static void
1527 1.1 christos coff_pointerize_aux (bfd *abfd,
1528 1.1 christos combined_entry_type *table_base,
1529 1.1 christos combined_entry_type *symbol,
1530 1.1 christos unsigned int indaux,
1531 1.7 christos combined_entry_type *auxent,
1532 1.7 christos combined_entry_type *table_end)
1533 1.1 christos {
1534 1.1 christos unsigned int type = symbol->u.syment.n_type;
1535 1.1 christos unsigned int n_sclass = symbol->u.syment.n_sclass;
1536 1.1 christos
1537 1.3 christos BFD_ASSERT (symbol->is_sym);
1538 1.1 christos if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1539 1.1 christos {
1540 1.1 christos if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1541 1.1 christos (abfd, table_base, symbol, indaux, auxent))
1542 1.1 christos return;
1543 1.1 christos }
1544 1.1 christos
1545 1.1 christos /* Don't bother if this is a file or a section. */
1546 1.1 christos if (n_sclass == C_STAT && type == T_NULL)
1547 1.1 christos return;
1548 1.1 christos if (n_sclass == C_FILE)
1549 1.1 christos return;
1550 1.1 christos
1551 1.3 christos BFD_ASSERT (! auxent->is_sym);
1552 1.1 christos /* Otherwise patch up. */
1553 1.1 christos #define N_TMASK coff_data (abfd)->local_n_tmask
1554 1.1 christos #define N_BTSHFT coff_data (abfd)->local_n_btshft
1555 1.3 christos
1556 1.1 christos if ((ISFCN (type) || ISTAG (n_sclass) || n_sclass == C_BLOCK
1557 1.1 christos || n_sclass == C_FCN)
1558 1.6 christos && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0
1559 1.6 christos && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l
1560 1.7 christos < (long) obj_raw_syment_count (abfd)
1561 1.7 christos && table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l
1562 1.7 christos < table_end)
1563 1.1 christos {
1564 1.1 christos auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1565 1.1 christos table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1566 1.1 christos auxent->fix_end = 1;
1567 1.1 christos }
1568 1.7 christos
1569 1.1 christos /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1570 1.1 christos generate one, so we must be careful to ignore it. */
1571 1.6 christos if ((unsigned long) auxent->u.auxent.x_sym.x_tagndx.l
1572 1.7 christos < obj_raw_syment_count (abfd)
1573 1.7 christos && table_base + auxent->u.auxent.x_sym.x_tagndx.l < table_end)
1574 1.1 christos {
1575 1.1 christos auxent->u.auxent.x_sym.x_tagndx.p =
1576 1.1 christos table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1577 1.1 christos auxent->fix_tag = 1;
1578 1.1 christos }
1579 1.1 christos }
1580 1.1 christos
1581 1.1 christos /* Allocate space for the ".debug" section, and read it.
1582 1.1 christos We did not read the debug section until now, because
1583 1.1 christos we didn't want to go to the trouble until someone needed it. */
1584 1.1 christos
1585 1.1 christos static char *
1586 1.3 christos build_debug_section (bfd *abfd, asection ** sect_return)
1587 1.1 christos {
1588 1.1 christos char *debug_section;
1589 1.1 christos file_ptr position;
1590 1.1 christos bfd_size_type sec_size;
1591 1.1 christos
1592 1.1 christos asection *sect = bfd_get_section_by_name (abfd, ".debug");
1593 1.1 christos
1594 1.1 christos if (!sect)
1595 1.1 christos {
1596 1.1 christos bfd_set_error (bfd_error_no_debug_section);
1597 1.1 christos return NULL;
1598 1.1 christos }
1599 1.1 christos
1600 1.1 christos sec_size = sect->size;
1601 1.1 christos debug_section = (char *) bfd_alloc (abfd, sec_size);
1602 1.1 christos if (debug_section == NULL)
1603 1.1 christos return NULL;
1604 1.1 christos
1605 1.1 christos /* Seek to the beginning of the `.debug' section and read it.
1606 1.1 christos Save the current position first; it is needed by our caller.
1607 1.1 christos Then read debug section and reset the file pointer. */
1608 1.1 christos
1609 1.1 christos position = bfd_tell (abfd);
1610 1.1 christos if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1611 1.1 christos || bfd_bread (debug_section, sec_size, abfd) != sec_size
1612 1.1 christos || bfd_seek (abfd, position, SEEK_SET) != 0)
1613 1.1 christos return NULL;
1614 1.3 christos
1615 1.3 christos * sect_return = sect;
1616 1.1 christos return debug_section;
1617 1.1 christos }
1618 1.1 christos
1619 1.1 christos /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1620 1.1 christos \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1621 1.1 christos be \0-terminated. */
1622 1.1 christos
1623 1.1 christos static char *
1624 1.1 christos copy_name (bfd *abfd, char *name, size_t maxlen)
1625 1.1 christos {
1626 1.1 christos size_t len;
1627 1.1 christos char *newname;
1628 1.1 christos
1629 1.1 christos for (len = 0; len < maxlen; ++len)
1630 1.1 christos if (name[len] == '\0')
1631 1.1 christos break;
1632 1.1 christos
1633 1.1 christos if ((newname = (char *) bfd_alloc (abfd, (bfd_size_type) len + 1)) == NULL)
1634 1.1 christos return NULL;
1635 1.1 christos
1636 1.1 christos strncpy (newname, name, len);
1637 1.1 christos newname[len] = '\0';
1638 1.1 christos return newname;
1639 1.1 christos }
1640 1.1 christos
1641 1.1 christos /* Read in the external symbols. */
1642 1.1 christos
1643 1.1 christos bfd_boolean
1644 1.1 christos _bfd_coff_get_external_symbols (bfd *abfd)
1645 1.1 christos {
1646 1.1 christos bfd_size_type symesz;
1647 1.1 christos bfd_size_type size;
1648 1.1 christos void * syms;
1649 1.1 christos
1650 1.1 christos if (obj_coff_external_syms (abfd) != NULL)
1651 1.1 christos return TRUE;
1652 1.1 christos
1653 1.1 christos symesz = bfd_coff_symesz (abfd);
1654 1.1 christos
1655 1.1 christos size = obj_raw_syment_count (abfd) * symesz;
1656 1.1 christos if (size == 0)
1657 1.1 christos return TRUE;
1658 1.6 christos /* Check for integer overflow and for unreasonable symbol counts. */
1659 1.6 christos if (size < obj_raw_syment_count (abfd)
1660 1.6 christos || (bfd_get_file_size (abfd) > 0
1661 1.6 christos && size > bfd_get_file_size (abfd)))
1662 1.6 christos
1663 1.6 christos {
1664 1.6 christos _bfd_error_handler (_("%pB: corrupt symbol count: %#" PRIx64 ""),
1665 1.6 christos abfd, (uint64_t) obj_raw_syment_count (abfd));
1666 1.6 christos return FALSE;
1667 1.6 christos }
1668 1.1 christos
1669 1.1 christos syms = bfd_malloc (size);
1670 1.1 christos if (syms == NULL)
1671 1.6 christos {
1672 1.6 christos /* PR 21013: Provide an error message when the alloc fails. */
1673 1.6 christos _bfd_error_handler (_("%pB: not enough memory to allocate space "
1674 1.6 christos "for %#" PRIx64 " symbols of size %#" PRIx64),
1675 1.6 christos abfd, (uint64_t) obj_raw_syment_count (abfd),
1676 1.6 christos (uint64_t) symesz);
1677 1.6 christos return FALSE;
1678 1.6 christos }
1679 1.1 christos
1680 1.1 christos if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1681 1.1 christos || bfd_bread (syms, size, abfd) != size)
1682 1.1 christos {
1683 1.1 christos if (syms != NULL)
1684 1.1 christos free (syms);
1685 1.1 christos return FALSE;
1686 1.1 christos }
1687 1.1 christos
1688 1.1 christos obj_coff_external_syms (abfd) = syms;
1689 1.1 christos return TRUE;
1690 1.1 christos }
1691 1.1 christos
1692 1.1 christos /* Read in the external strings. The strings are not loaded until
1693 1.1 christos they are needed. This is because we have no simple way of
1694 1.3 christos detecting a missing string table in an archive. If the strings
1695 1.3 christos are loaded then the STRINGS and STRINGS_LEN fields in the
1696 1.3 christos coff_tdata structure will be set. */
1697 1.1 christos
1698 1.1 christos const char *
1699 1.1 christos _bfd_coff_read_string_table (bfd *abfd)
1700 1.1 christos {
1701 1.1 christos char extstrsize[STRING_SIZE_SIZE];
1702 1.1 christos bfd_size_type strsize;
1703 1.1 christos char *strings;
1704 1.1 christos file_ptr pos;
1705 1.1 christos
1706 1.1 christos if (obj_coff_strings (abfd) != NULL)
1707 1.1 christos return obj_coff_strings (abfd);
1708 1.1 christos
1709 1.1 christos if (obj_sym_filepos (abfd) == 0)
1710 1.1 christos {
1711 1.1 christos bfd_set_error (bfd_error_no_symbols);
1712 1.1 christos return NULL;
1713 1.1 christos }
1714 1.1 christos
1715 1.1 christos pos = obj_sym_filepos (abfd);
1716 1.1 christos pos += obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
1717 1.1 christos if (bfd_seek (abfd, pos, SEEK_SET) != 0)
1718 1.1 christos return NULL;
1719 1.1 christos
1720 1.1 christos if (bfd_bread (extstrsize, (bfd_size_type) sizeof extstrsize, abfd)
1721 1.1 christos != sizeof extstrsize)
1722 1.1 christos {
1723 1.1 christos if (bfd_get_error () != bfd_error_file_truncated)
1724 1.1 christos return NULL;
1725 1.1 christos
1726 1.1 christos /* There is no string table. */
1727 1.1 christos strsize = STRING_SIZE_SIZE;
1728 1.1 christos }
1729 1.1 christos else
1730 1.1 christos {
1731 1.1 christos #if STRING_SIZE_SIZE == 4
1732 1.1 christos strsize = H_GET_32 (abfd, extstrsize);
1733 1.1 christos #else
1734 1.1 christos #error Change H_GET_32
1735 1.1 christos #endif
1736 1.1 christos }
1737 1.1 christos
1738 1.6 christos if (strsize < STRING_SIZE_SIZE || strsize > bfd_get_file_size (abfd))
1739 1.1 christos {
1740 1.6 christos _bfd_error_handler
1741 1.6 christos /* xgettext: c-format */
1742 1.6 christos (_("%pB: bad string table size %" PRIu64), abfd, (uint64_t) strsize);
1743 1.1 christos bfd_set_error (bfd_error_bad_value);
1744 1.1 christos return NULL;
1745 1.1 christos }
1746 1.1 christos
1747 1.3 christos strings = (char *) bfd_malloc (strsize + 1);
1748 1.1 christos if (strings == NULL)
1749 1.1 christos return NULL;
1750 1.1 christos
1751 1.3 christos /* PR 17521 file: 079-54929-0.004.
1752 1.3 christos A corrupt file could contain an index that points into the first
1753 1.3 christos STRING_SIZE_SIZE bytes of the string table, so make sure that
1754 1.3 christos they are zero. */
1755 1.3 christos memset (strings, 0, STRING_SIZE_SIZE);
1756 1.3 christos
1757 1.1 christos if (bfd_bread (strings + STRING_SIZE_SIZE, strsize - STRING_SIZE_SIZE, abfd)
1758 1.1 christos != strsize - STRING_SIZE_SIZE)
1759 1.1 christos {
1760 1.1 christos free (strings);
1761 1.1 christos return NULL;
1762 1.1 christos }
1763 1.1 christos
1764 1.1 christos obj_coff_strings (abfd) = strings;
1765 1.3 christos obj_coff_strings_len (abfd) = strsize;
1766 1.3 christos /* Terminate the string table, just in case. */
1767 1.3 christos strings[strsize] = 0;
1768 1.1 christos return strings;
1769 1.1 christos }
1770 1.1 christos
1771 1.1 christos /* Free up the external symbols and strings read from a COFF file. */
1772 1.1 christos
1773 1.1 christos bfd_boolean
1774 1.1 christos _bfd_coff_free_symbols (bfd *abfd)
1775 1.1 christos {
1776 1.6 christos if (! bfd_family_coff (abfd))
1777 1.6 christos return FALSE;
1778 1.6 christos
1779 1.1 christos if (obj_coff_external_syms (abfd) != NULL
1780 1.1 christos && ! obj_coff_keep_syms (abfd))
1781 1.1 christos {
1782 1.1 christos free (obj_coff_external_syms (abfd));
1783 1.1 christos obj_coff_external_syms (abfd) = NULL;
1784 1.1 christos }
1785 1.6 christos
1786 1.1 christos if (obj_coff_strings (abfd) != NULL
1787 1.1 christos && ! obj_coff_keep_strings (abfd))
1788 1.1 christos {
1789 1.1 christos free (obj_coff_strings (abfd));
1790 1.1 christos obj_coff_strings (abfd) = NULL;
1791 1.3 christos obj_coff_strings_len (abfd) = 0;
1792 1.1 christos }
1793 1.6 christos
1794 1.1 christos return TRUE;
1795 1.1 christos }
1796 1.1 christos
1797 1.1 christos /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1798 1.1 christos knit the symbol names into a normalized form. By normalized here I
1799 1.1 christos mean that all symbols have an n_offset pointer that points to a null-
1800 1.1 christos terminated string. */
1801 1.1 christos
1802 1.1 christos combined_entry_type *
1803 1.1 christos coff_get_normalized_symtab (bfd *abfd)
1804 1.1 christos {
1805 1.1 christos combined_entry_type *internal;
1806 1.1 christos combined_entry_type *internal_ptr;
1807 1.1 christos combined_entry_type *symbol_ptr;
1808 1.1 christos combined_entry_type *internal_end;
1809 1.1 christos size_t symesz;
1810 1.1 christos char *raw_src;
1811 1.1 christos char *raw_end;
1812 1.1 christos const char *string_table = NULL;
1813 1.3 christos asection * debug_sec = NULL;
1814 1.3 christos char *debug_sec_data = NULL;
1815 1.1 christos bfd_size_type size;
1816 1.1 christos
1817 1.1 christos if (obj_raw_syments (abfd) != NULL)
1818 1.1 christos return obj_raw_syments (abfd);
1819 1.1 christos
1820 1.3 christos if (! _bfd_coff_get_external_symbols (abfd))
1821 1.3 christos return NULL;
1822 1.3 christos
1823 1.7 christos size = obj_raw_syment_count (abfd);
1824 1.6 christos /* Check for integer overflow. */
1825 1.7 christos if (size > (bfd_size_type) -1 / sizeof (combined_entry_type))
1826 1.6 christos return NULL;
1827 1.7 christos size *= sizeof (combined_entry_type);
1828 1.1 christos internal = (combined_entry_type *) bfd_zalloc (abfd, size);
1829 1.1 christos if (internal == NULL && size != 0)
1830 1.1 christos return NULL;
1831 1.1 christos internal_end = internal + obj_raw_syment_count (abfd);
1832 1.1 christos
1833 1.1 christos raw_src = (char *) obj_coff_external_syms (abfd);
1834 1.1 christos
1835 1.1 christos /* Mark the end of the symbols. */
1836 1.1 christos symesz = bfd_coff_symesz (abfd);
1837 1.1 christos raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1838 1.1 christos
1839 1.1 christos /* FIXME SOMEDAY. A string table size of zero is very weird, but
1840 1.1 christos probably possible. If one shows up, it will probably kill us. */
1841 1.1 christos
1842 1.1 christos /* Swap all the raw entries. */
1843 1.1 christos for (internal_ptr = internal;
1844 1.1 christos raw_src < raw_end;
1845 1.1 christos raw_src += symesz, internal_ptr++)
1846 1.1 christos {
1847 1.3 christos unsigned int i;
1848 1.1 christos
1849 1.1 christos bfd_coff_swap_sym_in (abfd, (void *) raw_src,
1850 1.1 christos (void *) & internal_ptr->u.syment);
1851 1.1 christos symbol_ptr = internal_ptr;
1852 1.3 christos internal_ptr->is_sym = TRUE;
1853 1.3 christos
1854 1.1 christos for (i = 0;
1855 1.1 christos i < symbol_ptr->u.syment.n_numaux;
1856 1.1 christos i++)
1857 1.1 christos {
1858 1.1 christos internal_ptr++;
1859 1.7 christos raw_src += symesz;
1860 1.7 christos
1861 1.3 christos /* PR 17512: Prevent buffer overrun. */
1862 1.7 christos if (raw_src >= raw_end || internal_ptr >= internal_end)
1863 1.3 christos {
1864 1.3 christos bfd_release (abfd, internal);
1865 1.3 christos return NULL;
1866 1.3 christos }
1867 1.3 christos
1868 1.1 christos bfd_coff_swap_aux_in (abfd, (void *) raw_src,
1869 1.1 christos symbol_ptr->u.syment.n_type,
1870 1.1 christos symbol_ptr->u.syment.n_sclass,
1871 1.1 christos (int) i, symbol_ptr->u.syment.n_numaux,
1872 1.1 christos &(internal_ptr->u.auxent));
1873 1.3 christos
1874 1.3 christos internal_ptr->is_sym = FALSE;
1875 1.1 christos coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1876 1.7 christos internal_ptr, internal_end);
1877 1.1 christos }
1878 1.1 christos }
1879 1.1 christos
1880 1.1 christos /* Free the raw symbols, but not the strings (if we have them). */
1881 1.1 christos obj_coff_keep_strings (abfd) = TRUE;
1882 1.1 christos if (! _bfd_coff_free_symbols (abfd))
1883 1.1 christos return NULL;
1884 1.1 christos
1885 1.1 christos for (internal_ptr = internal; internal_ptr < internal_end;
1886 1.1 christos internal_ptr++)
1887 1.1 christos {
1888 1.3 christos BFD_ASSERT (internal_ptr->is_sym);
1889 1.3 christos
1890 1.1 christos if (internal_ptr->u.syment.n_sclass == C_FILE
1891 1.1 christos && internal_ptr->u.syment.n_numaux > 0)
1892 1.1 christos {
1893 1.3 christos combined_entry_type * aux = internal_ptr + 1;
1894 1.3 christos
1895 1.1 christos /* Make a file symbol point to the name in the auxent, since
1896 1.1 christos the text ".file" is redundant. */
1897 1.3 christos BFD_ASSERT (! aux->is_sym);
1898 1.3 christos
1899 1.3 christos if (aux->u.auxent.x_file.x_n.x_zeroes == 0)
1900 1.1 christos {
1901 1.1 christos /* The filename is a long one, point into the string table. */
1902 1.1 christos if (string_table == NULL)
1903 1.1 christos {
1904 1.1 christos string_table = _bfd_coff_read_string_table (abfd);
1905 1.1 christos if (string_table == NULL)
1906 1.1 christos return NULL;
1907 1.1 christos }
1908 1.1 christos
1909 1.3 christos if ((bfd_size_type)(aux->u.auxent.x_file.x_n.x_offset)
1910 1.3 christos >= obj_coff_strings_len (abfd))
1911 1.3 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1912 1.3 christos else
1913 1.3 christos internal_ptr->u.syment._n._n_n._n_offset =
1914 1.3 christos (bfd_hostptr_t) (string_table + (aux->u.auxent.x_file.x_n.x_offset));
1915 1.1 christos }
1916 1.1 christos else
1917 1.1 christos {
1918 1.1 christos /* Ordinary short filename, put into memory anyway. The
1919 1.6 christos Microsoft PE tools sometimes store a filename in
1920 1.6 christos multiple AUX entries. */
1921 1.1 christos if (internal_ptr->u.syment.n_numaux > 1
1922 1.1 christos && coff_data (abfd)->pe)
1923 1.1 christos internal_ptr->u.syment._n._n_n._n_offset =
1924 1.3 christos (bfd_hostptr_t)
1925 1.3 christos copy_name (abfd,
1926 1.3 christos aux->u.auxent.x_file.x_fname,
1927 1.3 christos internal_ptr->u.syment.n_numaux * symesz);
1928 1.1 christos else
1929 1.1 christos internal_ptr->u.syment._n._n_n._n_offset =
1930 1.1 christos ((bfd_hostptr_t)
1931 1.1 christos copy_name (abfd,
1932 1.3 christos aux->u.auxent.x_file.x_fname,
1933 1.1 christos (size_t) bfd_coff_filnmlen (abfd)));
1934 1.1 christos }
1935 1.1 christos }
1936 1.1 christos else
1937 1.1 christos {
1938 1.1 christos if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1939 1.1 christos {
1940 1.1 christos /* This is a "short" name. Make it long. */
1941 1.1 christos size_t i;
1942 1.1 christos char *newstring;
1943 1.1 christos
1944 1.1 christos /* Find the length of this string without walking into memory
1945 1.6 christos that isn't ours. */
1946 1.1 christos for (i = 0; i < 8; ++i)
1947 1.1 christos if (internal_ptr->u.syment._n._n_name[i] == '\0')
1948 1.1 christos break;
1949 1.1 christos
1950 1.1 christos newstring = (char *) bfd_zalloc (abfd, (bfd_size_type) (i + 1));
1951 1.1 christos if (newstring == NULL)
1952 1.1 christos return NULL;
1953 1.1 christos strncpy (newstring, internal_ptr->u.syment._n._n_name, i);
1954 1.1 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) newstring;
1955 1.1 christos internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1956 1.1 christos }
1957 1.1 christos else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1958 1.1 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
1959 1.1 christos else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1960 1.1 christos {
1961 1.1 christos /* Long name already. Point symbol at the string in the
1962 1.6 christos table. */
1963 1.1 christos if (string_table == NULL)
1964 1.1 christos {
1965 1.1 christos string_table = _bfd_coff_read_string_table (abfd);
1966 1.1 christos if (string_table == NULL)
1967 1.1 christos return NULL;
1968 1.1 christos }
1969 1.3 christos if (internal_ptr->u.syment._n._n_n._n_offset >= obj_coff_strings_len (abfd)
1970 1.3 christos || string_table + internal_ptr->u.syment._n._n_n._n_offset < string_table)
1971 1.3 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1972 1.3 christos else
1973 1.3 christos internal_ptr->u.syment._n._n_n._n_offset =
1974 1.3 christos ((bfd_hostptr_t)
1975 1.3 christos (string_table
1976 1.3 christos + internal_ptr->u.syment._n._n_n._n_offset));
1977 1.1 christos }
1978 1.1 christos else
1979 1.1 christos {
1980 1.1 christos /* Long name in debug section. Very similar. */
1981 1.3 christos if (debug_sec_data == NULL)
1982 1.3 christos debug_sec_data = build_debug_section (abfd, & debug_sec);
1983 1.3 christos if (debug_sec_data != NULL)
1984 1.3 christos {
1985 1.3 christos BFD_ASSERT (debug_sec != NULL);
1986 1.3 christos /* PR binutils/17512: Catch out of range offsets into the debug data. */
1987 1.3 christos if (internal_ptr->u.syment._n._n_n._n_offset > debug_sec->size
1988 1.3 christos || debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset < debug_sec_data)
1989 1.3 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) _("<corrupt>");
1990 1.3 christos else
1991 1.3 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t)
1992 1.3 christos (debug_sec_data + internal_ptr->u.syment._n._n_n._n_offset);
1993 1.3 christos }
1994 1.3 christos else
1995 1.3 christos internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) "";
1996 1.1 christos }
1997 1.1 christos }
1998 1.1 christos internal_ptr += internal_ptr->u.syment.n_numaux;
1999 1.1 christos }
2000 1.1 christos
2001 1.1 christos obj_raw_syments (abfd) = internal;
2002 1.1 christos BFD_ASSERT (obj_raw_syment_count (abfd)
2003 1.1 christos == (unsigned int) (internal_ptr - internal));
2004 1.1 christos
2005 1.1 christos return internal;
2006 1.1 christos }
2007 1.1 christos
2008 1.1 christos long
2009 1.1 christos coff_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
2010 1.1 christos {
2011 1.1 christos if (bfd_get_format (abfd) != bfd_object)
2012 1.1 christos {
2013 1.1 christos bfd_set_error (bfd_error_invalid_operation);
2014 1.1 christos return -1;
2015 1.1 christos }
2016 1.7 christos #if SIZEOF_LONG == SIZEOF_INT
2017 1.7 christos if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
2018 1.7 christos {
2019 1.7 christos bfd_set_error (bfd_error_file_too_big);
2020 1.7 christos return -1;
2021 1.7 christos }
2022 1.7 christos #endif
2023 1.1 christos return (asect->reloc_count + 1) * sizeof (arelent *);
2024 1.1 christos }
2025 1.1 christos
2026 1.1 christos asymbol *
2027 1.1 christos coff_make_empty_symbol (bfd *abfd)
2028 1.1 christos {
2029 1.1 christos bfd_size_type amt = sizeof (coff_symbol_type);
2030 1.1 christos coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_zalloc (abfd, amt);
2031 1.1 christos
2032 1.1 christos if (new_symbol == NULL)
2033 1.1 christos return NULL;
2034 1.1 christos new_symbol->symbol.section = 0;
2035 1.3 christos new_symbol->native = NULL;
2036 1.1 christos new_symbol->lineno = NULL;
2037 1.1 christos new_symbol->done_lineno = FALSE;
2038 1.1 christos new_symbol->symbol.the_bfd = abfd;
2039 1.1 christos
2040 1.1 christos return & new_symbol->symbol;
2041 1.1 christos }
2042 1.1 christos
2043 1.1 christos /* Make a debugging symbol. */
2044 1.1 christos
2045 1.1 christos asymbol *
2046 1.1 christos coff_bfd_make_debug_symbol (bfd *abfd,
2047 1.1 christos void * ptr ATTRIBUTE_UNUSED,
2048 1.1 christos unsigned long sz ATTRIBUTE_UNUSED)
2049 1.1 christos {
2050 1.1 christos bfd_size_type amt = sizeof (coff_symbol_type);
2051 1.1 christos coff_symbol_type *new_symbol = (coff_symbol_type *) bfd_alloc (abfd, amt);
2052 1.1 christos
2053 1.1 christos if (new_symbol == NULL)
2054 1.1 christos return NULL;
2055 1.1 christos /* @@ The 10 is a guess at a plausible maximum number of aux entries
2056 1.1 christos (but shouldn't be a constant). */
2057 1.1 christos amt = sizeof (combined_entry_type) * 10;
2058 1.1 christos new_symbol->native = (combined_entry_type *) bfd_zalloc (abfd, amt);
2059 1.1 christos if (!new_symbol->native)
2060 1.1 christos return NULL;
2061 1.3 christos new_symbol->native->is_sym = TRUE;
2062 1.1 christos new_symbol->symbol.section = bfd_abs_section_ptr;
2063 1.1 christos new_symbol->symbol.flags = BSF_DEBUGGING;
2064 1.1 christos new_symbol->lineno = NULL;
2065 1.1 christos new_symbol->done_lineno = FALSE;
2066 1.1 christos new_symbol->symbol.the_bfd = abfd;
2067 1.3 christos
2068 1.1 christos return & new_symbol->symbol;
2069 1.1 christos }
2070 1.1 christos
2071 1.1 christos void
2072 1.1 christos coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
2073 1.1 christos {
2074 1.1 christos bfd_symbol_info (symbol, ret);
2075 1.1 christos
2076 1.1 christos if (coffsymbol (symbol)->native != NULL
2077 1.3 christos && coffsymbol (symbol)->native->fix_value
2078 1.3 christos && coffsymbol (symbol)->native->is_sym)
2079 1.1 christos ret->value = coffsymbol (symbol)->native->u.syment.n_value -
2080 1.1 christos (bfd_hostptr_t) obj_raw_syments (abfd);
2081 1.1 christos }
2082 1.1 christos
2083 1.1 christos /* Print out information about COFF symbol. */
2084 1.1 christos
2085 1.1 christos void
2086 1.1 christos coff_print_symbol (bfd *abfd,
2087 1.1 christos void * filep,
2088 1.1 christos asymbol *symbol,
2089 1.1 christos bfd_print_symbol_type how)
2090 1.1 christos {
2091 1.1 christos FILE * file = (FILE *) filep;
2092 1.1 christos
2093 1.1 christos switch (how)
2094 1.1 christos {
2095 1.1 christos case bfd_print_symbol_name:
2096 1.1 christos fprintf (file, "%s", symbol->name);
2097 1.1 christos break;
2098 1.1 christos
2099 1.1 christos case bfd_print_symbol_more:
2100 1.1 christos fprintf (file, "coff %s %s",
2101 1.1 christos coffsymbol (symbol)->native ? "n" : "g",
2102 1.1 christos coffsymbol (symbol)->lineno ? "l" : " ");
2103 1.1 christos break;
2104 1.1 christos
2105 1.1 christos case bfd_print_symbol_all:
2106 1.1 christos if (coffsymbol (symbol)->native)
2107 1.1 christos {
2108 1.1 christos bfd_vma val;
2109 1.1 christos unsigned int aux;
2110 1.1 christos combined_entry_type *combined = coffsymbol (symbol)->native;
2111 1.1 christos combined_entry_type *root = obj_raw_syments (abfd);
2112 1.1 christos struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
2113 1.1 christos
2114 1.1 christos fprintf (file, "[%3ld]", (long) (combined - root));
2115 1.1 christos
2116 1.3 christos /* PR 17512: file: 079-33786-0.001:0.1. */
2117 1.3 christos if (combined < obj_raw_syments (abfd)
2118 1.3 christos || combined >= obj_raw_syments (abfd) + obj_raw_syment_count (abfd))
2119 1.3 christos {
2120 1.3 christos fprintf (file, _("<corrupt info> %s"), symbol->name);
2121 1.3 christos break;
2122 1.3 christos }
2123 1.3 christos
2124 1.3 christos BFD_ASSERT (combined->is_sym);
2125 1.1 christos if (! combined->fix_value)
2126 1.1 christos val = (bfd_vma) combined->u.syment.n_value;
2127 1.1 christos else
2128 1.1 christos val = combined->u.syment.n_value - (bfd_hostptr_t) root;
2129 1.1 christos
2130 1.1 christos fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
2131 1.1 christos combined->u.syment.n_scnum,
2132 1.1 christos combined->u.syment.n_flags,
2133 1.1 christos combined->u.syment.n_type,
2134 1.1 christos combined->u.syment.n_sclass,
2135 1.1 christos combined->u.syment.n_numaux);
2136 1.1 christos bfd_fprintf_vma (abfd, file, val);
2137 1.1 christos fprintf (file, " %s", symbol->name);
2138 1.1 christos
2139 1.1 christos for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
2140 1.1 christos {
2141 1.1 christos combined_entry_type *auxp = combined + aux + 1;
2142 1.1 christos long tagndx;
2143 1.1 christos
2144 1.3 christos BFD_ASSERT (! auxp->is_sym);
2145 1.1 christos if (auxp->fix_tag)
2146 1.1 christos tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
2147 1.1 christos else
2148 1.1 christos tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
2149 1.1 christos
2150 1.1 christos fprintf (file, "\n");
2151 1.1 christos
2152 1.1 christos if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
2153 1.1 christos continue;
2154 1.1 christos
2155 1.1 christos switch (combined->u.syment.n_sclass)
2156 1.1 christos {
2157 1.1 christos case C_FILE:
2158 1.1 christos fprintf (file, "File ");
2159 1.1 christos break;
2160 1.1 christos
2161 1.1 christos case C_STAT:
2162 1.1 christos if (combined->u.syment.n_type == T_NULL)
2163 1.1 christos /* Probably a section symbol ? */
2164 1.1 christos {
2165 1.1 christos fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
2166 1.1 christos (unsigned long) auxp->u.auxent.x_scn.x_scnlen,
2167 1.1 christos auxp->u.auxent.x_scn.x_nreloc,
2168 1.1 christos auxp->u.auxent.x_scn.x_nlinno);
2169 1.1 christos if (auxp->u.auxent.x_scn.x_checksum != 0
2170 1.1 christos || auxp->u.auxent.x_scn.x_associated != 0
2171 1.1 christos || auxp->u.auxent.x_scn.x_comdat != 0)
2172 1.1 christos fprintf (file, " checksum 0x%lx assoc %d comdat %d",
2173 1.1 christos auxp->u.auxent.x_scn.x_checksum,
2174 1.1 christos auxp->u.auxent.x_scn.x_associated,
2175 1.1 christos auxp->u.auxent.x_scn.x_comdat);
2176 1.1 christos break;
2177 1.1 christos }
2178 1.6 christos /* Fall through. */
2179 1.1 christos case C_EXT:
2180 1.1 christos case C_AIX_WEAKEXT:
2181 1.1 christos if (ISFCN (combined->u.syment.n_type))
2182 1.1 christos {
2183 1.1 christos long next, llnos;
2184 1.1 christos
2185 1.1 christos if (auxp->fix_end)
2186 1.1 christos next = (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2187 1.1 christos - root);
2188 1.1 christos else
2189 1.1 christos next = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2190 1.1 christos llnos = auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr;
2191 1.1 christos fprintf (file,
2192 1.1 christos "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
2193 1.1 christos tagndx,
2194 1.1 christos (unsigned long) auxp->u.auxent.x_sym.x_misc.x_fsize,
2195 1.1 christos llnos, next);
2196 1.1 christos break;
2197 1.1 christos }
2198 1.6 christos /* Fall through. */
2199 1.1 christos default:
2200 1.1 christos fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
2201 1.1 christos auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
2202 1.1 christos auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
2203 1.1 christos tagndx);
2204 1.1 christos if (auxp->fix_end)
2205 1.1 christos fprintf (file, " endndx %ld",
2206 1.1 christos ((long)
2207 1.1 christos (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
2208 1.1 christos - root)));
2209 1.1 christos break;
2210 1.1 christos }
2211 1.1 christos }
2212 1.1 christos
2213 1.1 christos if (l)
2214 1.1 christos {
2215 1.1 christos fprintf (file, "\n%s :", l->u.sym->name);
2216 1.1 christos l++;
2217 1.1 christos while (l->line_number)
2218 1.1 christos {
2219 1.3 christos if (l->line_number > 0)
2220 1.3 christos {
2221 1.3 christos fprintf (file, "\n%4d : ", l->line_number);
2222 1.3 christos bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
2223 1.3 christos }
2224 1.1 christos l++;
2225 1.1 christos }
2226 1.1 christos }
2227 1.1 christos }
2228 1.1 christos else
2229 1.1 christos {
2230 1.1 christos bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2231 1.1 christos fprintf (file, " %-5s %s %s %s",
2232 1.1 christos symbol->section->name,
2233 1.1 christos coffsymbol (symbol)->native ? "n" : "g",
2234 1.1 christos coffsymbol (symbol)->lineno ? "l" : " ",
2235 1.1 christos symbol->name);
2236 1.1 christos }
2237 1.1 christos }
2238 1.1 christos }
2239 1.1 christos
2240 1.1 christos /* Return whether a symbol name implies a local symbol. In COFF,
2241 1.1 christos local symbols generally start with ``.L''. Most targets use this
2242 1.1 christos function for the is_local_label_name entry point, but some may
2243 1.1 christos override it. */
2244 1.1 christos
2245 1.1 christos bfd_boolean
2246 1.1 christos _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
2247 1.1 christos const char *name)
2248 1.1 christos {
2249 1.1 christos return name[0] == '.' && name[1] == 'L';
2250 1.1 christos }
2251 1.1 christos
2252 1.1 christos /* Provided a BFD, a section and an offset (in bytes, not octets) into the
2253 1.1 christos section, calculate and return the name of the source file and the line
2254 1.1 christos nearest to the wanted location. */
2255 1.1 christos
2256 1.1 christos bfd_boolean
2257 1.1 christos coff_find_nearest_line_with_names (bfd *abfd,
2258 1.6 christos asymbol **symbols,
2259 1.6 christos asection *section,
2260 1.6 christos bfd_vma offset,
2261 1.6 christos const char **filename_ptr,
2262 1.6 christos const char **functionname_ptr,
2263 1.6 christos unsigned int *line_ptr,
2264 1.6 christos const struct dwarf_debug_section *debug_sections)
2265 1.1 christos {
2266 1.1 christos bfd_boolean found;
2267 1.1 christos unsigned int i;
2268 1.1 christos unsigned int line_base;
2269 1.1 christos coff_data_type *cof = coff_data (abfd);
2270 1.1 christos /* Run through the raw syments if available. */
2271 1.1 christos combined_entry_type *p;
2272 1.1 christos combined_entry_type *pend;
2273 1.1 christos alent *l;
2274 1.1 christos struct coff_section_tdata *sec_data;
2275 1.1 christos bfd_size_type amt;
2276 1.1 christos
2277 1.1 christos /* Before looking through the symbol table, try to use a .stab
2278 1.1 christos section to find the information. */
2279 1.1 christos if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
2280 1.1 christos &found, filename_ptr,
2281 1.1 christos functionname_ptr, line_ptr,
2282 1.1 christos &coff_data(abfd)->line_info))
2283 1.1 christos return FALSE;
2284 1.1 christos
2285 1.1 christos if (found)
2286 1.1 christos return TRUE;
2287 1.1 christos
2288 1.1 christos /* Also try examining DWARF2 debugging information. */
2289 1.3 christos if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
2290 1.1 christos filename_ptr, functionname_ptr,
2291 1.7 christos line_ptr, NULL, debug_sections,
2292 1.1 christos &coff_data(abfd)->dwarf2_find_line_info))
2293 1.1 christos return TRUE;
2294 1.1 christos
2295 1.6 christos sec_data = coff_section_data (abfd, section);
2296 1.6 christos
2297 1.3 christos /* If the DWARF lookup failed, but there is DWARF information available
2298 1.3 christos then the problem might be that the file has been rebased. This tool
2299 1.3 christos changes the VMAs of all the sections, but it does not update the DWARF
2300 1.3 christos information. So try again, using a bias against the address sought. */
2301 1.3 christos if (coff_data (abfd)->dwarf2_find_line_info != NULL)
2302 1.3 christos {
2303 1.7 christos bfd_signed_vma bias = 0;
2304 1.3 christos
2305 1.6 christos /* Create a cache of the result for the next call. */
2306 1.6 christos if (sec_data == NULL && section->owner == abfd)
2307 1.6 christos {
2308 1.6 christos amt = sizeof (struct coff_section_tdata);
2309 1.6 christos section->used_by_bfd = bfd_zalloc (abfd, amt);
2310 1.6 christos sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2311 1.6 christos }
2312 1.6 christos
2313 1.6 christos if (sec_data != NULL && sec_data->saved_bias)
2314 1.6 christos bias = sec_data->saved_bias;
2315 1.7 christos else if (symbols)
2316 1.6 christos {
2317 1.6 christos bias = _bfd_dwarf2_find_symbol_bias (symbols,
2318 1.6 christos & coff_data (abfd)->dwarf2_find_line_info);
2319 1.7 christos
2320 1.6 christos if (sec_data)
2321 1.6 christos {
2322 1.6 christos sec_data->saved_bias = TRUE;
2323 1.6 christos sec_data->bias = bias;
2324 1.6 christos }
2325 1.6 christos }
2326 1.3 christos
2327 1.3 christos if (bias
2328 1.3 christos && _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section,
2329 1.3 christos offset + bias,
2330 1.3 christos filename_ptr, functionname_ptr,
2331 1.7 christos line_ptr, NULL, debug_sections,
2332 1.3 christos &coff_data(abfd)->dwarf2_find_line_info))
2333 1.3 christos return TRUE;
2334 1.3 christos }
2335 1.3 christos
2336 1.1 christos *filename_ptr = 0;
2337 1.1 christos *functionname_ptr = 0;
2338 1.1 christos *line_ptr = 0;
2339 1.1 christos
2340 1.1 christos /* Don't try and find line numbers in a non coff file. */
2341 1.1 christos if (!bfd_family_coff (abfd))
2342 1.1 christos return FALSE;
2343 1.1 christos
2344 1.1 christos if (cof == NULL)
2345 1.1 christos return FALSE;
2346 1.1 christos
2347 1.1 christos /* Find the first C_FILE symbol. */
2348 1.1 christos p = cof->raw_syments;
2349 1.1 christos if (!p)
2350 1.1 christos return FALSE;
2351 1.1 christos
2352 1.1 christos pend = p + cof->raw_syment_count;
2353 1.1 christos while (p < pend)
2354 1.1 christos {
2355 1.3 christos BFD_ASSERT (p->is_sym);
2356 1.1 christos if (p->u.syment.n_sclass == C_FILE)
2357 1.1 christos break;
2358 1.1 christos p += 1 + p->u.syment.n_numaux;
2359 1.1 christos }
2360 1.1 christos
2361 1.1 christos if (p < pend)
2362 1.1 christos {
2363 1.1 christos bfd_vma sec_vma;
2364 1.1 christos bfd_vma maxdiff;
2365 1.1 christos
2366 1.1 christos /* Look through the C_FILE symbols to find the best one. */
2367 1.7 christos sec_vma = bfd_section_vma (section);
2368 1.1 christos *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2369 1.1 christos maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
2370 1.1 christos while (1)
2371 1.1 christos {
2372 1.1 christos bfd_vma file_addr;
2373 1.1 christos combined_entry_type *p2;
2374 1.1 christos
2375 1.1 christos for (p2 = p + 1 + p->u.syment.n_numaux;
2376 1.1 christos p2 < pend;
2377 1.1 christos p2 += 1 + p2->u.syment.n_numaux)
2378 1.1 christos {
2379 1.3 christos BFD_ASSERT (p2->is_sym);
2380 1.1 christos if (p2->u.syment.n_scnum > 0
2381 1.1 christos && (section
2382 1.1 christos == coff_section_from_bfd_index (abfd,
2383 1.1 christos p2->u.syment.n_scnum)))
2384 1.1 christos break;
2385 1.1 christos if (p2->u.syment.n_sclass == C_FILE)
2386 1.1 christos {
2387 1.1 christos p2 = pend;
2388 1.1 christos break;
2389 1.1 christos }
2390 1.1 christos }
2391 1.3 christos if (p2 >= pend)
2392 1.3 christos break;
2393 1.1 christos
2394 1.1 christos file_addr = (bfd_vma) p2->u.syment.n_value;
2395 1.1 christos /* PR 11512: Include the section address of the function name symbol. */
2396 1.1 christos if (p2->u.syment.n_scnum > 0)
2397 1.1 christos file_addr += coff_section_from_bfd_index (abfd,
2398 1.1 christos p2->u.syment.n_scnum)->vma;
2399 1.1 christos /* We use <= MAXDIFF here so that if we get a zero length
2400 1.6 christos file, we actually use the next file entry. */
2401 1.1 christos if (p2 < pend
2402 1.1 christos && offset + sec_vma >= file_addr
2403 1.1 christos && offset + sec_vma - file_addr <= maxdiff)
2404 1.1 christos {
2405 1.1 christos *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
2406 1.1 christos maxdiff = offset + sec_vma - p2->u.syment.n_value;
2407 1.1 christos }
2408 1.1 christos
2409 1.7 christos if (p->u.syment.n_value >= cof->raw_syment_count)
2410 1.7 christos break;
2411 1.7 christos
2412 1.1 christos /* Avoid endless loops on erroneous files by ensuring that
2413 1.1 christos we always move forward in the file. */
2414 1.1 christos if (p >= cof->raw_syments + p->u.syment.n_value)
2415 1.1 christos break;
2416 1.1 christos
2417 1.1 christos p = cof->raw_syments + p->u.syment.n_value;
2418 1.7 christos if (!p->is_sym || p->u.syment.n_sclass != C_FILE)
2419 1.1 christos break;
2420 1.1 christos }
2421 1.1 christos }
2422 1.1 christos
2423 1.6 christos if (section->lineno_count == 0)
2424 1.6 christos {
2425 1.6 christos *functionname_ptr = NULL;
2426 1.6 christos *line_ptr = 0;
2427 1.6 christos return TRUE;
2428 1.6 christos }
2429 1.6 christos
2430 1.6 christos /* Now wander though the raw linenumbers of the section.
2431 1.6 christos If we have been called on this section before, and the offset
2432 1.6 christos we want is further down then we can prime the lookup loop. */
2433 1.1 christos if (sec_data != NULL
2434 1.1 christos && sec_data->i > 0
2435 1.1 christos && offset >= sec_data->offset)
2436 1.1 christos {
2437 1.1 christos i = sec_data->i;
2438 1.1 christos *functionname_ptr = sec_data->function;
2439 1.1 christos line_base = sec_data->line_base;
2440 1.1 christos }
2441 1.1 christos else
2442 1.1 christos {
2443 1.1 christos i = 0;
2444 1.1 christos line_base = 0;
2445 1.1 christos }
2446 1.1 christos
2447 1.1 christos if (section->lineno != NULL)
2448 1.1 christos {
2449 1.1 christos bfd_vma last_value = 0;
2450 1.1 christos
2451 1.1 christos l = §ion->lineno[i];
2452 1.1 christos
2453 1.1 christos for (; i < section->lineno_count; i++)
2454 1.1 christos {
2455 1.1 christos if (l->line_number == 0)
2456 1.1 christos {
2457 1.1 christos /* Get the symbol this line number points at. */
2458 1.1 christos coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
2459 1.1 christos if (coff->symbol.value > offset)
2460 1.1 christos break;
2461 1.6 christos
2462 1.1 christos *functionname_ptr = coff->symbol.name;
2463 1.1 christos last_value = coff->symbol.value;
2464 1.1 christos if (coff->native)
2465 1.1 christos {
2466 1.1 christos combined_entry_type *s = coff->native;
2467 1.3 christos
2468 1.3 christos BFD_ASSERT (s->is_sym);
2469 1.1 christos s = s + 1 + s->u.syment.n_numaux;
2470 1.1 christos
2471 1.1 christos /* In XCOFF a debugging symbol can follow the
2472 1.1 christos function symbol. */
2473 1.1 christos if (s->u.syment.n_scnum == N_DEBUG)
2474 1.1 christos s = s + 1 + s->u.syment.n_numaux;
2475 1.1 christos
2476 1.1 christos /* S should now point to the .bf of the function. */
2477 1.1 christos if (s->u.syment.n_numaux)
2478 1.1 christos {
2479 1.1 christos /* The linenumber is stored in the auxent. */
2480 1.1 christos union internal_auxent *a = &((s + 1)->u.auxent);
2481 1.3 christos
2482 1.1 christos line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
2483 1.1 christos *line_ptr = line_base;
2484 1.1 christos }
2485 1.1 christos }
2486 1.1 christos }
2487 1.1 christos else
2488 1.1 christos {
2489 1.1 christos if (l->u.offset > offset)
2490 1.1 christos break;
2491 1.1 christos *line_ptr = l->line_number + line_base - 1;
2492 1.1 christos }
2493 1.1 christos l++;
2494 1.1 christos }
2495 1.1 christos
2496 1.1 christos /* If we fell off the end of the loop, then assume that this
2497 1.1 christos symbol has no line number info. Otherwise, symbols with no
2498 1.1 christos line number info get reported with the line number of the
2499 1.1 christos last line of the last symbol which does have line number
2500 1.1 christos info. We use 0x100 as a slop to account for cases where the
2501 1.1 christos last line has executable code. */
2502 1.1 christos if (i >= section->lineno_count
2503 1.1 christos && last_value != 0
2504 1.1 christos && offset - last_value > 0x100)
2505 1.1 christos {
2506 1.1 christos *functionname_ptr = NULL;
2507 1.1 christos *line_ptr = 0;
2508 1.1 christos }
2509 1.1 christos }
2510 1.1 christos
2511 1.1 christos /* Cache the results for the next call. */
2512 1.1 christos if (sec_data == NULL && section->owner == abfd)
2513 1.1 christos {
2514 1.1 christos amt = sizeof (struct coff_section_tdata);
2515 1.1 christos section->used_by_bfd = bfd_zalloc (abfd, amt);
2516 1.1 christos sec_data = (struct coff_section_tdata *) section->used_by_bfd;
2517 1.1 christos }
2518 1.6 christos
2519 1.1 christos if (sec_data != NULL)
2520 1.1 christos {
2521 1.1 christos sec_data->offset = offset;
2522 1.1 christos sec_data->i = i - 1;
2523 1.1 christos sec_data->function = *functionname_ptr;
2524 1.1 christos sec_data->line_base = line_base;
2525 1.1 christos }
2526 1.1 christos
2527 1.1 christos return TRUE;
2528 1.1 christos }
2529 1.1 christos
2530 1.1 christos bfd_boolean
2531 1.1 christos coff_find_nearest_line (bfd *abfd,
2532 1.3 christos asymbol **symbols,
2533 1.1 christos asection *section,
2534 1.1 christos bfd_vma offset,
2535 1.1 christos const char **filename_ptr,
2536 1.1 christos const char **functionname_ptr,
2537 1.3 christos unsigned int *line_ptr,
2538 1.3 christos unsigned int *discriminator_ptr)
2539 1.1 christos {
2540 1.3 christos if (discriminator_ptr)
2541 1.3 christos *discriminator_ptr = 0;
2542 1.3 christos return coff_find_nearest_line_with_names (abfd, symbols, section, offset,
2543 1.6 christos filename_ptr, functionname_ptr,
2544 1.6 christos line_ptr, dwarf_debug_sections);
2545 1.1 christos }
2546 1.1 christos
2547 1.1 christos bfd_boolean
2548 1.1 christos coff_find_inliner_info (bfd *abfd,
2549 1.1 christos const char **filename_ptr,
2550 1.1 christos const char **functionname_ptr,
2551 1.1 christos unsigned int *line_ptr)
2552 1.1 christos {
2553 1.1 christos bfd_boolean found;
2554 1.1 christos
2555 1.1 christos found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
2556 1.1 christos functionname_ptr, line_ptr,
2557 1.1 christos &coff_data(abfd)->dwarf2_find_line_info);
2558 1.1 christos return (found);
2559 1.1 christos }
2560 1.1 christos
2561 1.1 christos int
2562 1.1 christos coff_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
2563 1.1 christos {
2564 1.1 christos size_t size;
2565 1.1 christos
2566 1.3 christos if (!bfd_link_relocatable (info))
2567 1.1 christos size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
2568 1.1 christos else
2569 1.1 christos size = bfd_coff_filhsz (abfd);
2570 1.1 christos
2571 1.1 christos size += abfd->section_count * bfd_coff_scnhsz (abfd);
2572 1.1 christos return size;
2573 1.1 christos }
2574 1.1 christos
2575 1.1 christos /* Change the class of a coff symbol held by BFD. */
2576 1.1 christos
2577 1.1 christos bfd_boolean
2578 1.6 christos bfd_coff_set_symbol_class (bfd * abfd,
2579 1.6 christos asymbol * symbol,
2580 1.6 christos unsigned int symbol_class)
2581 1.1 christos {
2582 1.1 christos coff_symbol_type * csym;
2583 1.1 christos
2584 1.3 christos csym = coff_symbol_from (symbol);
2585 1.1 christos if (csym == NULL)
2586 1.1 christos {
2587 1.1 christos bfd_set_error (bfd_error_invalid_operation);
2588 1.1 christos return FALSE;
2589 1.1 christos }
2590 1.1 christos else if (csym->native == NULL)
2591 1.1 christos {
2592 1.1 christos /* This is an alien symbol which no native coff backend data.
2593 1.1 christos We cheat here by creating a fake native entry for it and
2594 1.1 christos then filling in the class. This code is based on that in
2595 1.1 christos coff_write_alien_symbol(). */
2596 1.1 christos
2597 1.1 christos combined_entry_type * native;
2598 1.1 christos bfd_size_type amt = sizeof (* native);
2599 1.1 christos
2600 1.1 christos native = (combined_entry_type *) bfd_zalloc (abfd, amt);
2601 1.1 christos if (native == NULL)
2602 1.1 christos return FALSE;
2603 1.1 christos
2604 1.3 christos native->is_sym = TRUE;
2605 1.1 christos native->u.syment.n_type = T_NULL;
2606 1.1 christos native->u.syment.n_sclass = symbol_class;
2607 1.1 christos
2608 1.1 christos if (bfd_is_und_section (symbol->section))
2609 1.1 christos {
2610 1.1 christos native->u.syment.n_scnum = N_UNDEF;
2611 1.1 christos native->u.syment.n_value = symbol->value;
2612 1.1 christos }
2613 1.1 christos else if (bfd_is_com_section (symbol->section))
2614 1.1 christos {
2615 1.1 christos native->u.syment.n_scnum = N_UNDEF;
2616 1.1 christos native->u.syment.n_value = symbol->value;
2617 1.1 christos }
2618 1.1 christos else
2619 1.1 christos {
2620 1.1 christos native->u.syment.n_scnum =
2621 1.1 christos symbol->section->output_section->target_index;
2622 1.1 christos native->u.syment.n_value = (symbol->value
2623 1.1 christos + symbol->section->output_offset);
2624 1.1 christos if (! obj_pe (abfd))
2625 1.1 christos native->u.syment.n_value += symbol->section->output_section->vma;
2626 1.1 christos
2627 1.1 christos /* Copy the any flags from the file header into the symbol.
2628 1.1 christos FIXME: Why? */
2629 1.1 christos native->u.syment.n_flags = bfd_asymbol_bfd (& csym->symbol)->flags;
2630 1.1 christos }
2631 1.1 christos
2632 1.1 christos csym->native = native;
2633 1.1 christos }
2634 1.1 christos else
2635 1.1 christos csym->native->u.syment.n_sclass = symbol_class;
2636 1.1 christos
2637 1.1 christos return TRUE;
2638 1.1 christos }
2639 1.1 christos
2640 1.1 christos bfd_boolean
2641 1.1 christos _bfd_coff_section_already_linked (bfd *abfd,
2642 1.1 christos asection *sec,
2643 1.1 christos struct bfd_link_info *info)
2644 1.1 christos {
2645 1.1 christos flagword flags;
2646 1.1 christos const char *name, *key;
2647 1.1 christos struct bfd_section_already_linked *l;
2648 1.1 christos struct bfd_section_already_linked_hash_entry *already_linked_list;
2649 1.1 christos struct coff_comdat_info *s_comdat;
2650 1.1 christos
2651 1.7 christos if (sec->output_section == bfd_abs_section_ptr)
2652 1.7 christos return FALSE;
2653 1.7 christos
2654 1.1 christos flags = sec->flags;
2655 1.1 christos if ((flags & SEC_LINK_ONCE) == 0)
2656 1.1 christos return FALSE;
2657 1.1 christos
2658 1.1 christos /* The COFF backend linker doesn't support group sections. */
2659 1.1 christos if ((flags & SEC_GROUP) != 0)
2660 1.1 christos return FALSE;
2661 1.1 christos
2662 1.7 christos name = bfd_section_name (sec);
2663 1.1 christos s_comdat = bfd_coff_get_comdat_section (abfd, sec);
2664 1.1 christos
2665 1.1 christos if (s_comdat != NULL)
2666 1.1 christos key = s_comdat->name;
2667 1.1 christos else
2668 1.1 christos {
2669 1.1 christos if (CONST_STRNEQ (name, ".gnu.linkonce.")
2670 1.1 christos && (key = strchr (name + sizeof (".gnu.linkonce.") - 1, '.')) != NULL)
2671 1.1 christos key++;
2672 1.1 christos else
2673 1.1 christos /* FIXME: gcc as of 2011-09 emits sections like .text$<key>,
2674 1.1 christos .xdata$<key> and .pdata$<key> only the first of which has a
2675 1.1 christos comdat key. Should these all match the LTO IR key? */
2676 1.1 christos key = name;
2677 1.1 christos }
2678 1.1 christos
2679 1.1 christos already_linked_list = bfd_section_already_linked_table_lookup (key);
2680 1.1 christos
2681 1.1 christos for (l = already_linked_list->entry; l != NULL; l = l->next)
2682 1.1 christos {
2683 1.1 christos struct coff_comdat_info *l_comdat;
2684 1.1 christos
2685 1.1 christos l_comdat = bfd_coff_get_comdat_section (l->sec->owner, l->sec);
2686 1.1 christos
2687 1.1 christos /* The section names must match, and both sections must be
2688 1.1 christos comdat and have the same comdat name, or both sections must
2689 1.1 christos be non-comdat. LTO IR plugin sections are an exception. They
2690 1.1 christos are always named .gnu.linkonce.t.<key> (<key> is some string)
2691 1.1 christos and match any comdat section with comdat name of <key>, and
2692 1.1 christos any linkonce section with the same suffix, ie.
2693 1.1 christos .gnu.linkonce.*.<key>. */
2694 1.1 christos if (((s_comdat != NULL) == (l_comdat != NULL)
2695 1.1 christos && strcmp (name, l->sec->name) == 0)
2696 1.1 christos || (l->sec->owner->flags & BFD_PLUGIN) != 0)
2697 1.1 christos {
2698 1.1 christos /* The section has already been linked. See if we should
2699 1.1 christos issue a warning. */
2700 1.1 christos return _bfd_handle_already_linked (sec, l, info);
2701 1.1 christos }
2702 1.1 christos }
2703 1.1 christos
2704 1.1 christos /* This is the first section with this name. Record it. */
2705 1.1 christos if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
2706 1.1 christos info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
2707 1.1 christos return FALSE;
2708 1.1 christos }
2709 1.3 christos
2710 1.3 christos /* Initialize COOKIE for input bfd ABFD. */
2711 1.3 christos
2712 1.3 christos static bfd_boolean
2713 1.3 christos init_reloc_cookie (struct coff_reloc_cookie *cookie,
2714 1.3 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
2715 1.3 christos bfd *abfd)
2716 1.3 christos {
2717 1.3 christos /* Sometimes the symbol table does not yet have been loaded here. */
2718 1.3 christos bfd_coff_slurp_symbol_table (abfd);
2719 1.3 christos
2720 1.3 christos cookie->abfd = abfd;
2721 1.3 christos cookie->sym_hashes = obj_coff_sym_hashes (abfd);
2722 1.3 christos
2723 1.3 christos cookie->symbols = obj_symbols (abfd);
2724 1.3 christos
2725 1.3 christos return TRUE;
2726 1.3 christos }
2727 1.3 christos
2728 1.3 christos /* Free the memory allocated by init_reloc_cookie, if appropriate. */
2729 1.3 christos
2730 1.3 christos static void
2731 1.3 christos fini_reloc_cookie (struct coff_reloc_cookie *cookie ATTRIBUTE_UNUSED,
2732 1.3 christos bfd *abfd ATTRIBUTE_UNUSED)
2733 1.3 christos {
2734 1.3 christos /* Nothing to do. */
2735 1.3 christos }
2736 1.3 christos
2737 1.3 christos /* Initialize the relocation information in COOKIE for input section SEC
2738 1.3 christos of input bfd ABFD. */
2739 1.3 christos
2740 1.3 christos static bfd_boolean
2741 1.3 christos init_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
2742 1.3 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
2743 1.3 christos bfd *abfd,
2744 1.3 christos asection *sec)
2745 1.3 christos {
2746 1.3 christos if (sec->reloc_count == 0)
2747 1.3 christos {
2748 1.3 christos cookie->rels = NULL;
2749 1.3 christos cookie->relend = NULL;
2750 1.3 christos cookie->rel = NULL;
2751 1.3 christos return TRUE;
2752 1.3 christos }
2753 1.3 christos
2754 1.3 christos cookie->rels = _bfd_coff_read_internal_relocs (abfd, sec, FALSE, NULL, 0, NULL);
2755 1.3 christos
2756 1.3 christos if (cookie->rels == NULL)
2757 1.3 christos return FALSE;
2758 1.3 christos
2759 1.3 christos cookie->rel = cookie->rels;
2760 1.3 christos cookie->relend = (cookie->rels + sec->reloc_count);
2761 1.3 christos return TRUE;
2762 1.3 christos }
2763 1.3 christos
2764 1.3 christos /* Free the memory allocated by init_reloc_cookie_rels,
2765 1.3 christos if appropriate. */
2766 1.3 christos
2767 1.3 christos static void
2768 1.3 christos fini_reloc_cookie_rels (struct coff_reloc_cookie *cookie,
2769 1.3 christos asection *sec)
2770 1.3 christos {
2771 1.5 christos if (cookie->rels
2772 1.5 christos /* PR 20401. The relocs may not have been cached, so check first.
2773 1.5 christos If the relocs were loaded by init_reloc_cookie_rels() then this
2774 1.5 christos will be the case. FIXME: Would performance be improved if the
2775 1.5 christos relocs *were* cached ? */
2776 1.5 christos && coff_section_data (NULL, sec)
2777 1.5 christos && coff_section_data (NULL, sec)->relocs != cookie->rels)
2778 1.3 christos free (cookie->rels);
2779 1.3 christos }
2780 1.3 christos
2781 1.3 christos /* Initialize the whole of COOKIE for input section SEC. */
2782 1.3 christos
2783 1.3 christos static bfd_boolean
2784 1.3 christos init_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
2785 1.3 christos struct bfd_link_info *info,
2786 1.3 christos asection *sec)
2787 1.3 christos {
2788 1.3 christos if (!init_reloc_cookie (cookie, info, sec->owner))
2789 1.3 christos return FALSE;
2790 1.3 christos
2791 1.3 christos if (!init_reloc_cookie_rels (cookie, info, sec->owner, sec))
2792 1.3 christos {
2793 1.3 christos fini_reloc_cookie (cookie, sec->owner);
2794 1.3 christos return FALSE;
2795 1.3 christos }
2796 1.3 christos return TRUE;
2797 1.3 christos }
2798 1.3 christos
2799 1.3 christos /* Free the memory allocated by init_reloc_cookie_for_section,
2800 1.3 christos if appropriate. */
2801 1.3 christos
2802 1.3 christos static void
2803 1.3 christos fini_reloc_cookie_for_section (struct coff_reloc_cookie *cookie,
2804 1.3 christos asection *sec)
2805 1.3 christos {
2806 1.3 christos fini_reloc_cookie_rels (cookie, sec);
2807 1.3 christos fini_reloc_cookie (cookie, sec->owner);
2808 1.3 christos }
2809 1.3 christos
2810 1.3 christos static asection *
2811 1.3 christos _bfd_coff_gc_mark_hook (asection *sec,
2812 1.3 christos struct bfd_link_info *info ATTRIBUTE_UNUSED,
2813 1.3 christos struct internal_reloc *rel ATTRIBUTE_UNUSED,
2814 1.3 christos struct coff_link_hash_entry *h,
2815 1.3 christos struct internal_syment *sym)
2816 1.3 christos {
2817 1.3 christos if (h != NULL)
2818 1.3 christos {
2819 1.3 christos switch (h->root.type)
2820 1.6 christos {
2821 1.6 christos case bfd_link_hash_defined:
2822 1.6 christos case bfd_link_hash_defweak:
2823 1.6 christos return h->root.u.def.section;
2824 1.6 christos
2825 1.6 christos case bfd_link_hash_common:
2826 1.6 christos return h->root.u.c.p->section;
2827 1.6 christos
2828 1.6 christos case bfd_link_hash_undefweak:
2829 1.6 christos if (h->symbol_class == C_NT_WEAK && h->numaux == 1)
2830 1.6 christos {
2831 1.6 christos /* PE weak externals. A weak symbol may include an auxiliary
2832 1.6 christos record indicating that if the weak symbol is not resolved,
2833 1.6 christos another external symbol is used instead. */
2834 1.6 christos struct coff_link_hash_entry *h2 =
2835 1.6 christos h->auxbfd->tdata.coff_obj_data->sym_hashes[
2836 1.6 christos h->aux->x_sym.x_tagndx.l];
2837 1.3 christos
2838 1.6 christos if (h2 && h2->root.type != bfd_link_hash_undefined)
2839 1.6 christos return h2->root.u.def.section;
2840 1.6 christos }
2841 1.6 christos break;
2842 1.3 christos
2843 1.3 christos case bfd_link_hash_undefined:
2844 1.6 christos default:
2845 1.6 christos break;
2846 1.6 christos }
2847 1.3 christos return NULL;
2848 1.3 christos }
2849 1.3 christos
2850 1.3 christos return coff_section_from_bfd_index (sec->owner, sym->n_scnum);
2851 1.3 christos }
2852 1.3 christos
2853 1.3 christos /* COOKIE->rel describes a relocation against section SEC, which is
2854 1.3 christos a section we've decided to keep. Return the section that contains
2855 1.3 christos the relocation symbol, or NULL if no section contains it. */
2856 1.3 christos
2857 1.3 christos static asection *
2858 1.3 christos _bfd_coff_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
2859 1.3 christos coff_gc_mark_hook_fn gc_mark_hook,
2860 1.3 christos struct coff_reloc_cookie *cookie)
2861 1.3 christos {
2862 1.3 christos struct coff_link_hash_entry *h;
2863 1.3 christos
2864 1.3 christos h = cookie->sym_hashes[cookie->rel->r_symndx];
2865 1.3 christos if (h != NULL)
2866 1.3 christos {
2867 1.3 christos while (h->root.type == bfd_link_hash_indirect
2868 1.3 christos || h->root.type == bfd_link_hash_warning)
2869 1.3 christos h = (struct coff_link_hash_entry *) h->root.u.i.link;
2870 1.3 christos
2871 1.3 christos return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
2872 1.3 christos }
2873 1.3 christos
2874 1.3 christos return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
2875 1.3 christos &(cookie->symbols
2876 1.3 christos + obj_convert (sec->owner)[cookie->rel->r_symndx])->native->u.syment);
2877 1.3 christos }
2878 1.3 christos
2879 1.3 christos static bfd_boolean _bfd_coff_gc_mark
2880 1.3 christos (struct bfd_link_info *, asection *, coff_gc_mark_hook_fn);
2881 1.3 christos
2882 1.3 christos /* COOKIE->rel describes a relocation against section SEC, which is
2883 1.3 christos a section we've decided to keep. Mark the section that contains
2884 1.3 christos the relocation symbol. */
2885 1.3 christos
2886 1.3 christos static bfd_boolean
2887 1.3 christos _bfd_coff_gc_mark_reloc (struct bfd_link_info *info,
2888 1.3 christos asection *sec,
2889 1.3 christos coff_gc_mark_hook_fn gc_mark_hook,
2890 1.3 christos struct coff_reloc_cookie *cookie)
2891 1.3 christos {
2892 1.3 christos asection *rsec;
2893 1.3 christos
2894 1.3 christos rsec = _bfd_coff_gc_mark_rsec (info, sec, gc_mark_hook, cookie);
2895 1.3 christos if (rsec && !rsec->gc_mark)
2896 1.3 christos {
2897 1.3 christos if (bfd_get_flavour (rsec->owner) != bfd_target_coff_flavour)
2898 1.3 christos rsec->gc_mark = 1;
2899 1.3 christos else if (!_bfd_coff_gc_mark (info, rsec, gc_mark_hook))
2900 1.3 christos return FALSE;
2901 1.3 christos }
2902 1.3 christos return TRUE;
2903 1.3 christos }
2904 1.3 christos
2905 1.3 christos /* The mark phase of garbage collection. For a given section, mark
2906 1.3 christos it and any sections in this section's group, and all the sections
2907 1.3 christos which define symbols to which it refers. */
2908 1.3 christos
2909 1.3 christos static bfd_boolean
2910 1.3 christos _bfd_coff_gc_mark (struct bfd_link_info *info,
2911 1.3 christos asection *sec,
2912 1.3 christos coff_gc_mark_hook_fn gc_mark_hook)
2913 1.3 christos {
2914 1.3 christos bfd_boolean ret = TRUE;
2915 1.3 christos
2916 1.3 christos sec->gc_mark = 1;
2917 1.3 christos
2918 1.3 christos /* Look through the section relocs. */
2919 1.3 christos if ((sec->flags & SEC_RELOC) != 0
2920 1.3 christos && sec->reloc_count > 0)
2921 1.3 christos {
2922 1.3 christos struct coff_reloc_cookie cookie;
2923 1.3 christos
2924 1.3 christos if (!init_reloc_cookie_for_section (&cookie, info, sec))
2925 1.6 christos ret = FALSE;
2926 1.3 christos else
2927 1.6 christos {
2928 1.6 christos for (; cookie.rel < cookie.relend; cookie.rel++)
2929 1.6 christos {
2930 1.3 christos if (!_bfd_coff_gc_mark_reloc (info, sec, gc_mark_hook, &cookie))
2931 1.3 christos {
2932 1.3 christos ret = FALSE;
2933 1.3 christos break;
2934 1.3 christos }
2935 1.3 christos }
2936 1.6 christos fini_reloc_cookie_for_section (&cookie, sec);
2937 1.6 christos }
2938 1.3 christos }
2939 1.3 christos
2940 1.3 christos return ret;
2941 1.3 christos }
2942 1.3 christos
2943 1.3 christos static bfd_boolean
2944 1.3 christos _bfd_coff_gc_mark_extra_sections (struct bfd_link_info *info,
2945 1.3 christos coff_gc_mark_hook_fn mark_hook ATTRIBUTE_UNUSED)
2946 1.3 christos {
2947 1.3 christos bfd *ibfd;
2948 1.3 christos
2949 1.3 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2950 1.3 christos {
2951 1.3 christos asection *isec;
2952 1.3 christos bfd_boolean some_kept;
2953 1.3 christos
2954 1.6 christos if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour)
2955 1.3 christos continue;
2956 1.3 christos
2957 1.3 christos /* Ensure all linker created sections are kept, and see whether
2958 1.3 christos any other section is already marked. */
2959 1.3 christos some_kept = FALSE;
2960 1.3 christos for (isec = ibfd->sections; isec != NULL; isec = isec->next)
2961 1.3 christos {
2962 1.3 christos if ((isec->flags & SEC_LINKER_CREATED) != 0)
2963 1.3 christos isec->gc_mark = 1;
2964 1.3 christos else if (isec->gc_mark)
2965 1.3 christos some_kept = TRUE;
2966 1.3 christos }
2967 1.3 christos
2968 1.3 christos /* If no section in this file will be kept, then we can
2969 1.3 christos toss out debug sections. */
2970 1.3 christos if (!some_kept)
2971 1.3 christos continue;
2972 1.3 christos
2973 1.3 christos /* Keep debug and special sections like .comment when they are
2974 1.3 christos not part of a group, or when we have single-member groups. */
2975 1.3 christos for (isec = ibfd->sections; isec != NULL; isec = isec->next)
2976 1.3 christos if ((isec->flags & SEC_DEBUGGING) != 0
2977 1.3 christos || (isec->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
2978 1.3 christos isec->gc_mark = 1;
2979 1.3 christos }
2980 1.3 christos return TRUE;
2981 1.3 christos }
2982 1.3 christos
2983 1.3 christos /* Sweep symbols in swept sections. Called via coff_link_hash_traverse. */
2984 1.3 christos
2985 1.3 christos static bfd_boolean
2986 1.3 christos coff_gc_sweep_symbol (struct coff_link_hash_entry *h,
2987 1.3 christos void *data ATTRIBUTE_UNUSED)
2988 1.3 christos {
2989 1.3 christos if (h->root.type == bfd_link_hash_warning)
2990 1.3 christos h = (struct coff_link_hash_entry *) h->root.u.i.link;
2991 1.3 christos
2992 1.3 christos if ((h->root.type == bfd_link_hash_defined
2993 1.3 christos || h->root.type == bfd_link_hash_defweak)
2994 1.3 christos && !h->root.u.def.section->gc_mark
2995 1.3 christos && !(h->root.u.def.section->owner->flags & DYNAMIC))
2996 1.3 christos {
2997 1.3 christos /* Do our best to hide the symbol. */
2998 1.3 christos h->root.u.def.section = bfd_und_section_ptr;
2999 1.3 christos h->symbol_class = C_HIDDEN;
3000 1.3 christos }
3001 1.3 christos
3002 1.3 christos return TRUE;
3003 1.3 christos }
3004 1.3 christos
3005 1.3 christos /* The sweep phase of garbage collection. Remove all garbage sections. */
3006 1.3 christos
3007 1.3 christos typedef bfd_boolean (*gc_sweep_hook_fn)
3008 1.3 christos (bfd *, struct bfd_link_info *, asection *, const struct internal_reloc *);
3009 1.3 christos
3010 1.3 christos static bfd_boolean
3011 1.3 christos coff_gc_sweep (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
3012 1.3 christos {
3013 1.3 christos bfd *sub;
3014 1.3 christos
3015 1.3 christos for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3016 1.3 christos {
3017 1.3 christos asection *o;
3018 1.3 christos
3019 1.3 christos if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
3020 1.3 christos continue;
3021 1.3 christos
3022 1.3 christos for (o = sub->sections; o != NULL; o = o->next)
3023 1.3 christos {
3024 1.3 christos /* Keep debug and special sections. */
3025 1.6 christos if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0
3026 1.3 christos || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
3027 1.3 christos o->gc_mark = 1;
3028 1.6 christos else if (CONST_STRNEQ (o->name, ".idata")
3029 1.3 christos || CONST_STRNEQ (o->name, ".pdata")
3030 1.3 christos || CONST_STRNEQ (o->name, ".xdata")
3031 1.3 christos || CONST_STRNEQ (o->name, ".rsrc"))
3032 1.3 christos o->gc_mark = 1;
3033 1.3 christos
3034 1.3 christos if (o->gc_mark)
3035 1.3 christos continue;
3036 1.3 christos
3037 1.3 christos /* Skip sweeping sections already excluded. */
3038 1.3 christos if (o->flags & SEC_EXCLUDE)
3039 1.3 christos continue;
3040 1.3 christos
3041 1.3 christos /* Since this is early in the link process, it is simple
3042 1.3 christos to remove a section from the output. */
3043 1.3 christos o->flags |= SEC_EXCLUDE;
3044 1.3 christos
3045 1.3 christos if (info->print_gc_sections && o->size != 0)
3046 1.6 christos /* xgettext: c-format */
3047 1.6 christos _bfd_error_handler (_("removing unused section '%pA' in file '%pB'"),
3048 1.6 christos o, sub);
3049 1.3 christos
3050 1.3 christos #if 0
3051 1.3 christos /* But we also have to update some of the relocation
3052 1.3 christos info we collected before. */
3053 1.3 christos if (gc_sweep_hook
3054 1.3 christos && (o->flags & SEC_RELOC) != 0
3055 1.3 christos && o->reloc_count > 0
3056 1.3 christos && !bfd_is_abs_section (o->output_section))
3057 1.3 christos {
3058 1.3 christos struct internal_reloc *internal_relocs;
3059 1.3 christos bfd_boolean r;
3060 1.3 christos
3061 1.3 christos internal_relocs
3062 1.3 christos = _bfd_coff_link_read_relocs (o->owner, o, NULL, NULL,
3063 1.3 christos info->keep_memory);
3064 1.3 christos if (internal_relocs == NULL)
3065 1.3 christos return FALSE;
3066 1.3 christos
3067 1.3 christos r = (*gc_sweep_hook) (o->owner, info, o, internal_relocs);
3068 1.3 christos
3069 1.3 christos if (coff_section_data (o)->relocs != internal_relocs)
3070 1.3 christos free (internal_relocs);
3071 1.3 christos
3072 1.3 christos if (!r)
3073 1.3 christos return FALSE;
3074 1.3 christos }
3075 1.3 christos #endif
3076 1.3 christos }
3077 1.3 christos }
3078 1.3 christos
3079 1.3 christos /* Remove the symbols that were in the swept sections from the dynamic
3080 1.3 christos symbol table. */
3081 1.3 christos coff_link_hash_traverse (coff_hash_table (info), coff_gc_sweep_symbol,
3082 1.3 christos NULL);
3083 1.3 christos
3084 1.3 christos return TRUE;
3085 1.3 christos }
3086 1.3 christos
3087 1.3 christos /* Keep all sections containing symbols undefined on the command-line,
3088 1.3 christos and the section containing the entry symbol. */
3089 1.3 christos
3090 1.3 christos static void
3091 1.3 christos _bfd_coff_gc_keep (struct bfd_link_info *info)
3092 1.3 christos {
3093 1.3 christos struct bfd_sym_chain *sym;
3094 1.3 christos
3095 1.3 christos for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
3096 1.3 christos {
3097 1.3 christos struct coff_link_hash_entry *h;
3098 1.3 christos
3099 1.3 christos h = coff_link_hash_lookup (coff_hash_table (info), sym->name,
3100 1.3 christos FALSE, FALSE, FALSE);
3101 1.3 christos
3102 1.3 christos if (h != NULL
3103 1.3 christos && (h->root.type == bfd_link_hash_defined
3104 1.3 christos || h->root.type == bfd_link_hash_defweak)
3105 1.3 christos && !bfd_is_abs_section (h->root.u.def.section))
3106 1.3 christos h->root.u.def.section->flags |= SEC_KEEP;
3107 1.3 christos }
3108 1.3 christos }
3109 1.3 christos
3110 1.3 christos /* Do mark and sweep of unused sections. */
3111 1.3 christos
3112 1.3 christos bfd_boolean
3113 1.3 christos bfd_coff_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
3114 1.3 christos {
3115 1.3 christos bfd *sub;
3116 1.3 christos
3117 1.3 christos /* FIXME: Should we implement this? */
3118 1.3 christos #if 0
3119 1.3 christos const bfd_coff_backend_data *bed = coff_backend_info (abfd);
3120 1.3 christos
3121 1.3 christos if (!bed->can_gc_sections
3122 1.3 christos || !is_coff_hash_table (info->hash))
3123 1.3 christos {
3124 1.6 christos _bfd_error_handler(_("warning: gc-sections option ignored"));
3125 1.3 christos return TRUE;
3126 1.3 christos }
3127 1.3 christos #endif
3128 1.3 christos
3129 1.3 christos _bfd_coff_gc_keep (info);
3130 1.3 christos
3131 1.3 christos /* Grovel through relocs to find out who stays ... */
3132 1.3 christos for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3133 1.3 christos {
3134 1.3 christos asection *o;
3135 1.3 christos
3136 1.3 christos if (bfd_get_flavour (sub) != bfd_target_coff_flavour)
3137 1.6 christos continue;
3138 1.3 christos
3139 1.3 christos for (o = sub->sections; o != NULL; o = o->next)
3140 1.6 christos {
3141 1.3 christos if (((o->flags & (SEC_EXCLUDE | SEC_KEEP)) == SEC_KEEP
3142 1.3 christos || CONST_STRNEQ (o->name, ".vectors")
3143 1.3 christos || CONST_STRNEQ (o->name, ".ctors")
3144 1.3 christos || CONST_STRNEQ (o->name, ".dtors"))
3145 1.3 christos && !o->gc_mark)
3146 1.3 christos {
3147 1.3 christos if (!_bfd_coff_gc_mark (info, o, _bfd_coff_gc_mark_hook))
3148 1.3 christos return FALSE;
3149 1.3 christos }
3150 1.6 christos }
3151 1.3 christos }
3152 1.3 christos
3153 1.3 christos /* Allow the backend to mark additional target specific sections. */
3154 1.3 christos _bfd_coff_gc_mark_extra_sections (info, _bfd_coff_gc_mark_hook);
3155 1.3 christos
3156 1.3 christos /* ... and mark SEC_EXCLUDE for those that go. */
3157 1.3 christos return coff_gc_sweep (abfd, info);
3158 1.3 christos }
3159 1.7 christos
3160 1.7 christos /* Return name used to identify a comdat group. */
3161 1.7 christos
3162 1.7 christos const char *
3163 1.7 christos bfd_coff_group_name (bfd *abfd, const asection *sec)
3164 1.7 christos {
3165 1.7 christos struct coff_comdat_info *ci = bfd_coff_get_comdat_section (abfd, sec);
3166 1.7 christos if (ci != NULL)
3167 1.7 christos return ci->name;
3168 1.7 christos return NULL;
3169 1.7 christos }
3170 1.7 christos
3171 1.7 christos bfd_boolean
3172 1.7 christos _bfd_coff_close_and_cleanup (bfd *abfd)
3173 1.7 christos {
3174 1.7 christos if (abfd->format == bfd_object
3175 1.7 christos && bfd_family_coff (abfd)
3176 1.7 christos && coff_data (abfd) != NULL)
3177 1.7 christos {
3178 1.7 christos obj_coff_keep_syms (abfd) = FALSE;
3179 1.7 christos obj_coff_keep_strings (abfd) = FALSE;
3180 1.7 christos if (!_bfd_coff_free_symbols (abfd))
3181 1.7 christos return FALSE;
3182 1.7 christos }
3183 1.7 christos return _bfd_generic_close_and_cleanup (abfd);
3184 1.7 christos }
3185