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