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