1 1.1 christos /* ELF object file format 2 1.10 christos Copyright (C) 1992-2025 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of GAS, the GNU Assembler. 5 1.1 christos 6 1.1 christos GAS is free software; you can redistribute it and/or modify 7 1.1 christos it under the terms of the GNU General Public License as 8 1.1 christos published by the Free Software Foundation; either version 3, 9 1.1 christos or (at your option) any later version. 10 1.1 christos 11 1.1 christos GAS is distributed in the hope that it will be useful, but 12 1.1 christos WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 14 1.1 christos the GNU General Public License for more details. 15 1.1 christos 16 1.1 christos You should have received a copy of the GNU General Public License 17 1.1 christos along with GAS; see the file COPYING. If not, write to the Free 18 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 1.1 christos 02110-1301, USA. */ 20 1.1 christos 21 1.1 christos #define OBJ_HEADER "obj-elf.h" 22 1.1 christos #include "as.h" 23 1.1 christos #include "safe-ctype.h" 24 1.1 christos #include "subsegs.h" 25 1.1 christos #include "obstack.h" 26 1.1 christos #include "dwarf2dbg.h" 27 1.9 christos #include "ginsn.h" 28 1.1 christos 29 1.1 christos #ifndef ECOFF_DEBUGGING 30 1.1 christos #define ECOFF_DEBUGGING 0 31 1.1 christos #else 32 1.1 christos #define NEED_ECOFF_DEBUG 33 1.1 christos #endif 34 1.1 christos 35 1.1 christos #ifdef NEED_ECOFF_DEBUG 36 1.1 christos #include "ecoff.h" 37 1.7 christos #include "bfd/ecoff-bfd.h" 38 1.1 christos #endif 39 1.1 christos 40 1.1 christos #ifdef TC_ALPHA 41 1.1 christos #include "elf/alpha.h" 42 1.1 christos #endif 43 1.1 christos 44 1.1 christos #ifdef TC_MIPS 45 1.1 christos #include "elf/mips.h" 46 1.1 christos #endif 47 1.1 christos 48 1.1 christos #ifdef TC_PPC 49 1.1 christos #include "elf/ppc.h" 50 1.1 christos #endif 51 1.1 christos 52 1.1 christos #ifdef TC_I386 53 1.1 christos #include "elf/x86-64.h" 54 1.1 christos #endif 55 1.1 christos 56 1.1 christos #ifdef TC_MEP 57 1.1 christos #include "elf/mep.h" 58 1.1 christos #endif 59 1.1 christos 60 1.6 christos #ifdef TC_PRU 61 1.6 christos #include "elf/pru.h" 62 1.6 christos #endif 63 1.6 christos 64 1.1 christos static void obj_elf_line (int); 65 1.1 christos static void obj_elf_size (int); 66 1.1 christos static void obj_elf_type (int); 67 1.1 christos static void obj_elf_ident (int); 68 1.1 christos static void obj_elf_weak (int); 69 1.1 christos static void obj_elf_local (int); 70 1.1 christos static void obj_elf_visibility (int); 71 1.1 christos static void obj_elf_symver (int); 72 1.1 christos static void obj_elf_subsection (int); 73 1.1 christos static void obj_elf_popsection (int); 74 1.3 christos static void obj_elf_gnu_attribute (int); 75 1.1 christos static void obj_elf_tls_common (int); 76 1.1 christos static void obj_elf_lcomm (int); 77 1.1 christos static void obj_elf_struct (int); 78 1.8 christos static void obj_elf_attach_to_group (int); 79 1.1 christos 80 1.1 christos static const pseudo_typeS elf_pseudo_table[] = 81 1.1 christos { 82 1.8 christos {"attach_to_group", obj_elf_attach_to_group, 0}, 83 1.1 christos {"comm", obj_elf_common, 0}, 84 1.1 christos {"common", obj_elf_common, 1}, 85 1.1 christos {"ident", obj_elf_ident, 0}, 86 1.1 christos {"lcomm", obj_elf_lcomm, 0}, 87 1.1 christos {"local", obj_elf_local, 0}, 88 1.1 christos {"previous", obj_elf_previous, 0}, 89 1.1 christos {"section", obj_elf_section, 0}, 90 1.1 christos {"section.s", obj_elf_section, 0}, 91 1.1 christos {"sect", obj_elf_section, 0}, 92 1.1 christos {"sect.s", obj_elf_section, 0}, 93 1.1 christos {"pushsection", obj_elf_section, 1}, 94 1.1 christos {"popsection", obj_elf_popsection, 0}, 95 1.1 christos {"size", obj_elf_size, 0}, 96 1.1 christos {"type", obj_elf_type, 0}, 97 1.1 christos {"version", obj_elf_version, 0}, 98 1.1 christos {"weak", obj_elf_weak, 0}, 99 1.1 christos 100 1.1 christos /* These define symbol visibility. */ 101 1.1 christos {"internal", obj_elf_visibility, STV_INTERNAL}, 102 1.1 christos {"hidden", obj_elf_visibility, STV_HIDDEN}, 103 1.1 christos {"protected", obj_elf_visibility, STV_PROTECTED}, 104 1.1 christos 105 1.1 christos /* These are used for stabs-in-elf configurations. */ 106 1.1 christos {"line", obj_elf_line, 0}, 107 1.1 christos 108 1.1 christos /* This is a GNU extension to handle symbol versions. */ 109 1.1 christos {"symver", obj_elf_symver, 0}, 110 1.1 christos 111 1.1 christos /* A GNU extension to change subsection only. */ 112 1.1 christos {"subsection", obj_elf_subsection, 0}, 113 1.1 christos 114 1.1 christos /* These are GNU extensions to aid in garbage collecting C++ vtables. */ 115 1.6 christos {"vtable_inherit", obj_elf_vtable_inherit, 0}, 116 1.6 christos {"vtable_entry", obj_elf_vtable_entry, 0}, 117 1.1 christos 118 1.3 christos /* A GNU extension for object attributes. */ 119 1.3 christos {"gnu_attribute", obj_elf_gnu_attribute, 0}, 120 1.3 christos 121 1.1 christos /* These are used for dwarf2. */ 122 1.6 christos { "file", dwarf2_directive_file, 0 }, 123 1.1 christos { "loc", dwarf2_directive_loc, 0 }, 124 1.1 christos { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 }, 125 1.1 christos 126 1.1 christos /* We need to trap the section changing calls to handle .previous. */ 127 1.1 christos {"data", obj_elf_data, 0}, 128 1.1 christos {"offset", obj_elf_struct, 0}, 129 1.1 christos {"struct", obj_elf_struct, 0}, 130 1.1 christos {"text", obj_elf_text, 0}, 131 1.8 christos {"bss", obj_elf_bss, 0}, 132 1.1 christos 133 1.1 christos {"tls_common", obj_elf_tls_common, 0}, 134 1.1 christos 135 1.1 christos /* End sentinel. */ 136 1.1 christos {NULL, NULL, 0}, 137 1.1 christos }; 138 1.1 christos 139 1.1 christos static const pseudo_typeS ecoff_debug_pseudo_table[] = 140 1.1 christos { 141 1.1 christos #ifdef NEED_ECOFF_DEBUG 142 1.1 christos /* COFF style debugging information for ECOFF. .ln is not used; .loc 143 1.1 christos is used instead. */ 144 1.1 christos { "def", ecoff_directive_def, 0 }, 145 1.1 christos { "dim", ecoff_directive_dim, 0 }, 146 1.1 christos { "endef", ecoff_directive_endef, 0 }, 147 1.1 christos { "file", ecoff_directive_file, 0 }, 148 1.1 christos { "scl", ecoff_directive_scl, 0 }, 149 1.1 christos { "tag", ecoff_directive_tag, 0 }, 150 1.1 christos { "val", ecoff_directive_val, 0 }, 151 1.1 christos 152 1.1 christos /* COFF debugging requires pseudo-ops .size and .type, but ELF 153 1.1 christos already has meanings for those. We use .esize and .etype 154 1.1 christos instead. These are only generated by gcc anyhow. */ 155 1.1 christos { "esize", ecoff_directive_size, 0 }, 156 1.1 christos { "etype", ecoff_directive_type, 0 }, 157 1.1 christos 158 1.1 christos /* ECOFF specific debugging information. */ 159 1.6 christos { "aent", ecoff_directive_ent, 1 }, 160 1.1 christos { "begin", ecoff_directive_begin, 0 }, 161 1.1 christos { "bend", ecoff_directive_bend, 0 }, 162 1.1 christos { "end", ecoff_directive_end, 0 }, 163 1.1 christos { "ent", ecoff_directive_ent, 0 }, 164 1.1 christos { "fmask", ecoff_directive_fmask, 0 }, 165 1.1 christos { "frame", ecoff_directive_frame, 0 }, 166 1.1 christos { "loc", ecoff_directive_loc, 0 }, 167 1.1 christos { "mask", ecoff_directive_mask, 0 }, 168 1.1 christos 169 1.1 christos /* Other ECOFF directives. */ 170 1.1 christos { "extern", ecoff_directive_extern, 0 }, 171 1.1 christos 172 1.1 christos /* These are used on Irix. I don't know how to implement them. */ 173 1.1 christos { "alias", s_ignore, 0 }, 174 1.1 christos { "bgnb", s_ignore, 0 }, 175 1.1 christos { "endb", s_ignore, 0 }, 176 1.1 christos { "lab", s_ignore, 0 }, 177 1.1 christos { "noalias", s_ignore, 0 }, 178 1.1 christos { "verstamp", s_ignore, 0 }, 179 1.1 christos { "vreg", s_ignore, 0 }, 180 1.1 christos #endif 181 1.1 christos 182 1.1 christos {NULL, NULL, 0} /* end sentinel */ 183 1.1 christos }; 184 1.1 christos 185 1.1 christos #undef NO_RELOC 186 1.1 christos #include "aout/aout64.h" 187 1.1 christos 188 1.1 christos asection *elf_com_section_ptr; 189 1.1 christos 190 1.1 christos void 191 1.1 christos elf_pop_insert (void) 192 1.1 christos { 193 1.1 christos pop_insert (elf_pseudo_table); 194 1.1 christos if (ECOFF_DEBUGGING) 195 1.1 christos pop_insert (ecoff_debug_pseudo_table); 196 1.1 christos } 197 1.1 christos 198 1.1 christos void 199 1.8 christos elf_file_symbol (const char *s) 200 1.1 christos { 201 1.7 christos asymbol *bsym; 202 1.8 christos symbolS *sym = symbol_new (s, absolute_section, &zero_address_frag, 0); 203 1.8 christos size_t name_length = strlen (s); 204 1.7 christos 205 1.8 christos if (name_length > strlen (S_GET_NAME (sym))) 206 1.8 christos { 207 1.8 christos obstack_grow (¬es, s, name_length + 1); 208 1.10 christos S_SET_NAME (sym, obstack_finish (¬es)); 209 1.8 christos } 210 1.8 christos else 211 1.8 christos strcpy ((char *) S_GET_NAME (sym), s); 212 1.1 christos 213 1.8 christos symbol_get_bfdsym (sym)->flags |= BSF_FILE; 214 1.1 christos 215 1.8 christos if (symbol_rootP != sym 216 1.8 christos && ((bsym = symbol_get_bfdsym (symbol_rootP)) == NULL 217 1.8 christos || (bsym->flags & BSF_FILE) == 0)) 218 1.8 christos { 219 1.8 christos symbol_remove (sym, &symbol_rootP, &symbol_lastP); 220 1.8 christos symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP); 221 1.8 christos } 222 1.5 christos 223 1.1 christos #ifdef DEBUG 224 1.8 christos verify_symbol_chain (symbol_rootP, symbol_lastP); 225 1.1 christos #endif 226 1.1 christos 227 1.1 christos #ifdef NEED_ECOFF_DEBUG 228 1.8 christos ecoff_new_file (s); 229 1.1 christos #endif 230 1.1 christos } 231 1.1 christos 232 1.1 christos /* Called from read.c:s_comm after we've parsed .comm symbol, size. 233 1.1 christos Parse a possible alignment value. */ 234 1.1 christos 235 1.1 christos symbolS * 236 1.1 christos elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size) 237 1.1 christos { 238 1.1 christos addressT align = 0; 239 1.1 christos int is_local = symbol_get_obj (symbolP)->local; 240 1.1 christos 241 1.1 christos if (*input_line_pointer == ',') 242 1.1 christos { 243 1.1 christos char *save = input_line_pointer; 244 1.1 christos 245 1.1 christos input_line_pointer++; 246 1.1 christos SKIP_WHITESPACE (); 247 1.1 christos 248 1.1 christos if (*input_line_pointer == '"') 249 1.1 christos { 250 1.1 christos /* For sparc. Accept .common symbol, length, "bss" */ 251 1.1 christos input_line_pointer++; 252 1.1 christos /* Some use the dot, some don't. */ 253 1.1 christos if (*input_line_pointer == '.') 254 1.1 christos input_line_pointer++; 255 1.1 christos /* Some say data, some say bss. */ 256 1.8 christos if (startswith (input_line_pointer, "bss\"")) 257 1.1 christos input_line_pointer += 4; 258 1.8 christos else if (startswith (input_line_pointer, "data\"")) 259 1.1 christos input_line_pointer += 5; 260 1.1 christos else 261 1.1 christos { 262 1.1 christos char *p = input_line_pointer; 263 1.1 christos char c; 264 1.1 christos 265 1.1 christos while (*--p != '"') 266 1.1 christos ; 267 1.10 christos while (!is_end_of_stmt (*input_line_pointer)) 268 1.1 christos if (*input_line_pointer++ == '"') 269 1.1 christos break; 270 1.1 christos c = *input_line_pointer; 271 1.1 christos *input_line_pointer = '\0'; 272 1.1 christos as_bad (_("bad .common segment %s"), p); 273 1.1 christos *input_line_pointer = c; 274 1.1 christos ignore_rest_of_line (); 275 1.1 christos return NULL; 276 1.1 christos } 277 1.1 christos /* ??? Don't ask me why these are always global. */ 278 1.1 christos is_local = 0; 279 1.1 christos } 280 1.1 christos else 281 1.1 christos { 282 1.1 christos input_line_pointer = save; 283 1.1 christos align = parse_align (is_local); 284 1.1 christos if (align == (addressT) -1) 285 1.1 christos return NULL; 286 1.1 christos } 287 1.1 christos } 288 1.1 christos 289 1.1 christos if (is_local) 290 1.1 christos { 291 1.1 christos bss_alloc (symbolP, size, align); 292 1.1 christos S_CLEAR_EXTERNAL (symbolP); 293 1.1 christos } 294 1.1 christos else 295 1.1 christos { 296 1.1 christos S_SET_VALUE (symbolP, size); 297 1.1 christos S_SET_ALIGN (symbolP, align); 298 1.1 christos S_SET_EXTERNAL (symbolP); 299 1.1 christos S_SET_SEGMENT (symbolP, elf_com_section_ptr); 300 1.1 christos } 301 1.1 christos 302 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; 303 1.1 christos 304 1.1 christos return symbolP; 305 1.1 christos } 306 1.1 christos 307 1.1 christos void 308 1.1 christos obj_elf_common (int is_common) 309 1.1 christos { 310 1.1 christos if (flag_mri && is_common) 311 1.1 christos s_mri_common (0); 312 1.1 christos else 313 1.1 christos s_comm_internal (0, elf_common_parse); 314 1.1 christos } 315 1.1 christos 316 1.1 christos static void 317 1.1 christos obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED) 318 1.1 christos { 319 1.1 christos symbolS *symbolP = s_comm_internal (0, elf_common_parse); 320 1.1 christos 321 1.1 christos if (symbolP) 322 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL; 323 1.1 christos } 324 1.1 christos 325 1.1 christos static void 326 1.1 christos obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED) 327 1.1 christos { 328 1.1 christos symbolS *symbolP = s_comm_internal (0, s_lcomm_internal); 329 1.1 christos 330 1.1 christos if (symbolP) 331 1.1 christos symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; 332 1.1 christos } 333 1.1 christos 334 1.1 christos static symbolS * 335 1.1 christos get_sym_from_input_line_and_check (void) 336 1.1 christos { 337 1.1 christos char *name; 338 1.1 christos char c; 339 1.1 christos symbolS *sym; 340 1.1 christos 341 1.3 christos c = get_symbol_name (& name); 342 1.1 christos sym = symbol_find_or_make (name); 343 1.10 christos restore_line_pointer (c); 344 1.10 christos SKIP_WHITESPACE (); 345 1.1 christos 346 1.1 christos /* There is no symbol name if input_line_pointer has not moved. */ 347 1.1 christos if (name == input_line_pointer) 348 1.1 christos as_bad (_("Missing symbol name in directive")); 349 1.1 christos return sym; 350 1.1 christos } 351 1.1 christos 352 1.1 christos static void 353 1.1 christos obj_elf_local (int ignore ATTRIBUTE_UNUSED) 354 1.1 christos { 355 1.1 christos int c; 356 1.1 christos symbolS *symbolP; 357 1.1 christos 358 1.1 christos do 359 1.1 christos { 360 1.1 christos symbolP = get_sym_from_input_line_and_check (); 361 1.1 christos c = *input_line_pointer; 362 1.1 christos S_CLEAR_EXTERNAL (symbolP); 363 1.1 christos symbol_get_obj (symbolP)->local = 1; 364 1.1 christos if (c == ',') 365 1.1 christos { 366 1.1 christos input_line_pointer++; 367 1.1 christos SKIP_WHITESPACE (); 368 1.1 christos if (*input_line_pointer == '\n') 369 1.1 christos c = '\n'; 370 1.1 christos } 371 1.1 christos } 372 1.1 christos while (c == ','); 373 1.1 christos demand_empty_rest_of_line (); 374 1.1 christos } 375 1.1 christos 376 1.1 christos static void 377 1.1 christos obj_elf_weak (int ignore ATTRIBUTE_UNUSED) 378 1.1 christos { 379 1.1 christos int c; 380 1.1 christos symbolS *symbolP; 381 1.1 christos 382 1.1 christos do 383 1.1 christos { 384 1.1 christos symbolP = get_sym_from_input_line_and_check (); 385 1.1 christos c = *input_line_pointer; 386 1.1 christos S_SET_WEAK (symbolP); 387 1.1 christos if (c == ',') 388 1.1 christos { 389 1.1 christos input_line_pointer++; 390 1.1 christos SKIP_WHITESPACE (); 391 1.1 christos if (*input_line_pointer == '\n') 392 1.1 christos c = '\n'; 393 1.1 christos } 394 1.1 christos } 395 1.1 christos while (c == ','); 396 1.1 christos demand_empty_rest_of_line (); 397 1.1 christos } 398 1.1 christos 399 1.1 christos static void 400 1.1 christos obj_elf_visibility (int visibility) 401 1.1 christos { 402 1.1 christos int c; 403 1.1 christos symbolS *symbolP; 404 1.1 christos asymbol *bfdsym; 405 1.1 christos elf_symbol_type *elfsym; 406 1.1 christos 407 1.1 christos do 408 1.1 christos { 409 1.1 christos symbolP = get_sym_from_input_line_and_check (); 410 1.1 christos 411 1.1 christos bfdsym = symbol_get_bfdsym (symbolP); 412 1.8 christos elfsym = elf_symbol_from (bfdsym); 413 1.1 christos 414 1.1 christos gas_assert (elfsym); 415 1.1 christos 416 1.1 christos elfsym->internal_elf_sym.st_other &= ~3; 417 1.1 christos elfsym->internal_elf_sym.st_other |= visibility; 418 1.1 christos 419 1.1 christos c = *input_line_pointer; 420 1.1 christos if (c == ',') 421 1.1 christos { 422 1.1 christos input_line_pointer ++; 423 1.1 christos 424 1.1 christos SKIP_WHITESPACE (); 425 1.1 christos 426 1.1 christos if (*input_line_pointer == '\n') 427 1.1 christos c = '\n'; 428 1.1 christos } 429 1.1 christos } 430 1.1 christos while (c == ','); 431 1.1 christos 432 1.1 christos demand_empty_rest_of_line (); 433 1.1 christos } 434 1.1 christos 435 1.1 christos static segT previous_section; 436 1.1 christos static int previous_subsection; 437 1.1 christos 438 1.1 christos struct section_stack 439 1.1 christos { 440 1.1 christos struct section_stack *next; 441 1.1 christos segT seg, prev_seg; 442 1.1 christos int subseg, prev_subseg; 443 1.1 christos }; 444 1.1 christos 445 1.1 christos static struct section_stack *section_stack; 446 1.1 christos 447 1.8 christos /* ELF section flags for unique sections. */ 448 1.8 christos #define SEC_ASSEMBLER_SHF_MASK SHF_GNU_RETAIN 449 1.8 christos 450 1.10 christos struct group_list 451 1.10 christos { 452 1.10 christos asection **head; /* Section lists. */ 453 1.10 christos unsigned int num_group; /* Number of lists. */ 454 1.10 christos htab_t indexes; /* Maps group name to index in head array. */ 455 1.10 christos }; 456 1.10 christos 457 1.10 christos static struct group_list groups; 458 1.6 christos 459 1.8 christos static bool 460 1.10 christos match_section (const asection *sec, const struct elf_section_match *match) 461 1.1 christos { 462 1.10 christos const char *linked_to_symbol_name = sec->map_head.linked_to_symbol_name; 463 1.8 christos unsigned int sh_info = elf_section_data (sec)->this_hdr.sh_info; 464 1.8 christos bfd_vma sh_flags = (elf_section_data (sec)->this_hdr.sh_flags 465 1.8 christos & SEC_ASSEMBLER_SHF_MASK); 466 1.8 christos 467 1.8 christos return (sh_info == match->sh_info 468 1.8 christos && sh_flags == match->sh_flags 469 1.8 christos && ((bfd_section_flags (sec) & SEC_ASSEMBLER_SECTION_ID) 470 1.8 christos == (match->flags & SEC_ASSEMBLER_SECTION_ID)) 471 1.8 christos && sec->section_id == match->section_id 472 1.8 christos && (linked_to_symbol_name == match->linked_to_symbol_name 473 1.8 christos || (linked_to_symbol_name != NULL 474 1.8 christos && match->linked_to_symbol_name != NULL 475 1.8 christos && strcmp (linked_to_symbol_name, 476 1.8 christos match->linked_to_symbol_name) == 0))); 477 1.1 christos } 478 1.1 christos 479 1.10 christos /* Return TRUE iff SEC matches the section info INF. */ 480 1.10 christos 481 1.10 christos static bool 482 1.10 christos get_section_by_match (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf) 483 1.10 christos { 484 1.10 christos struct elf_section_match *match = inf; 485 1.10 christos const char *gname = match->group_name; 486 1.10 christos const char *group_name = elf_group_name (sec); 487 1.10 christos 488 1.10 christos return ((group_name == gname 489 1.10 christos || (group_name != NULL 490 1.10 christos && gname != NULL 491 1.10 christos && strcmp (group_name, gname) == 0)) 492 1.10 christos && match_section (sec, match)); 493 1.10 christos } 494 1.10 christos 495 1.10 christos /* Go look in section lists kept per group for SEC_NAME with 496 1.10 christos properties given by MATCH. If info for the group named by 497 1.10 christos MATCH->GROUP_NAME has been initialised, set GROUP_IDX. */ 498 1.10 christos 499 1.10 christos static asection * 500 1.10 christos group_section_find (const struct elf_section_match *match, 501 1.10 christos const char *sec_name, 502 1.10 christos unsigned int *group_idx) 503 1.10 christos { 504 1.10 christos if (!groups.indexes) 505 1.10 christos { 506 1.10 christos groups.num_group = 0; 507 1.10 christos groups.head = NULL; 508 1.10 christos groups.indexes = htab_create_alloc (16, hash_string_tuple, eq_string_tuple, 509 1.10 christos NULL, notes_calloc, NULL); 510 1.10 christos *group_idx = ~0u; 511 1.10 christos return NULL; 512 1.10 christos } 513 1.10 christos 514 1.10 christos *group_idx = str_hash_find_int (groups.indexes, match->group_name); 515 1.10 christos if (*group_idx == ~0u) 516 1.10 christos return NULL; 517 1.10 christos 518 1.10 christos asection *s; 519 1.10 christos for (s = groups.head[*group_idx]; s != NULL; s = elf_next_in_group (s)) 520 1.10 christos if ((s->name == sec_name 521 1.10 christos || strcmp (s->name, sec_name) == 0) 522 1.10 christos && match_section (s, match)) 523 1.10 christos break; 524 1.10 christos return s; 525 1.10 christos } 526 1.10 christos 527 1.10 christos /* Insert SEC into section lists kept per group. MATCH and GROUP_IDX 528 1.10 christos must be from a prior call to group_section_find. */ 529 1.10 christos 530 1.10 christos static void 531 1.10 christos group_section_insert (const struct elf_section_match *match, 532 1.10 christos asection *sec, 533 1.10 christos unsigned int *group_idx) 534 1.10 christos { 535 1.10 christos if (*group_idx != ~0u) 536 1.10 christos { 537 1.10 christos elf_next_in_group (sec) = groups.head[*group_idx]; 538 1.10 christos groups.head[*group_idx] = sec; 539 1.10 christos return; 540 1.10 christos } 541 1.10 christos 542 1.10 christos unsigned int i = groups.num_group; 543 1.10 christos if ((i & 127) == 0) 544 1.10 christos groups.head = XRESIZEVEC (asection *, groups.head, i + 128); 545 1.10 christos groups.head[i] = sec; 546 1.10 christos groups.num_group += 1; 547 1.10 christos 548 1.10 christos /* We keep the index into groups.head rather than the entry address 549 1.10 christos because groups.head may be realloc'd. */ 550 1.10 christos str_hash_insert_int (groups.indexes, match->group_name, i, 0); 551 1.10 christos } 552 1.10 christos 553 1.1 christos /* Handle the .section pseudo-op. This code supports two different 554 1.1 christos syntaxes. 555 1.1 christos 556 1.1 christos The first is found on Solaris, and looks like 557 1.1 christos .section ".sec1",#alloc,#execinstr,#write 558 1.1 christos Here the names after '#' are the SHF_* flags to turn on for the 559 1.1 christos section. I'm not sure how it determines the SHT_* type (BFD 560 1.1 christos doesn't really give us control over the type, anyhow). 561 1.1 christos 562 1.1 christos The second format is found on UnixWare, and probably most SVR4 563 1.1 christos machines, and looks like 564 1.1 christos .section .sec1,"a",@progbits 565 1.1 christos The quoted string may contain any combination of a, w, x, and 566 1.1 christos represents the SHF_* flags to turn on for the section. The string 567 1.1 christos beginning with '@' can be progbits or nobits. There should be 568 1.1 christos other possibilities, but I don't know what they are. In any case, 569 1.1 christos BFD doesn't really let us set the section type. */ 570 1.1 christos 571 1.9 christos static void 572 1.9 christos change_section (const char *name, 573 1.9 christos unsigned int type, 574 1.9 christos bfd_vma attr, 575 1.9 christos int entsize, 576 1.9 christos struct elf_section_match *match_p, 577 1.9 christos bool linkonce, 578 1.9 christos bool push, 579 1.9 christos subsegT new_subsection) 580 1.1 christos { 581 1.1 christos asection *old_sec; 582 1.1 christos segT sec; 583 1.1 christos flagword flags; 584 1.1 christos const struct elf_backend_data *bed; 585 1.1 christos const struct bfd_elf_special_section *ssect; 586 1.8 christos 587 1.8 christos if (match_p == NULL) 588 1.8 christos { 589 1.8 christos static struct elf_section_match unused_match; 590 1.8 christos match_p = &unused_match; 591 1.8 christos } 592 1.1 christos 593 1.1 christos #ifdef md_flush_pending_output 594 1.1 christos md_flush_pending_output (); 595 1.1 christos #endif 596 1.1 christos 597 1.1 christos /* Switch to the section, creating it if necessary. */ 598 1.1 christos if (push) 599 1.1 christos { 600 1.1 christos struct section_stack *elt; 601 1.5 christos elt = XNEW (struct section_stack); 602 1.1 christos elt->next = section_stack; 603 1.1 christos elt->seg = now_seg; 604 1.1 christos elt->prev_seg = previous_section; 605 1.1 christos elt->subseg = now_subseg; 606 1.1 christos elt->prev_subseg = previous_subsection; 607 1.1 christos section_stack = elt; 608 1.1 christos } 609 1.1 christos 610 1.8 christos obj_elf_section_change_hook (); 611 1.8 christos 612 1.10 christos unsigned int group_idx = ~0u; 613 1.10 christos if (match_p->group_name) 614 1.10 christos old_sec = group_section_find (match_p, name, &group_idx); 615 1.10 christos else 616 1.10 christos old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section_by_match, 617 1.10 christos match_p); 618 1.1 christos if (old_sec) 619 1.1 christos { 620 1.1 christos sec = old_sec; 621 1.9 christos subseg_set (sec, new_subsection); 622 1.1 christos } 623 1.1 christos else 624 1.10 christos { 625 1.10 christos sec = subseg_force_new (name, new_subsection); 626 1.10 christos if (match_p->group_name) 627 1.10 christos group_section_insert (match_p, sec, &group_idx); 628 1.10 christos } 629 1.1 christos 630 1.1 christos bed = get_elf_backend_data (stdoutput); 631 1.1 christos ssect = (*bed->get_sec_type_attr) (stdoutput, sec); 632 1.1 christos 633 1.1 christos if (ssect != NULL) 634 1.1 christos { 635 1.8 christos bool override = false; 636 1.1 christos 637 1.1 christos if (type == SHT_NULL) 638 1.1 christos type = ssect->type; 639 1.1 christos else if (type != ssect->type) 640 1.1 christos { 641 1.1 christos if (old_sec == NULL 642 1.1 christos /* Some older versions of gcc will emit 643 1.1 christos 644 1.1 christos .section .init_array,"aw",@progbits 645 1.1 christos 646 1.1 christos for __attribute__ ((section (".init_array"))). 647 1.1 christos "@progbits" is incorrect. Also for x86-64 large bss 648 1.1 christos sections, some older versions of gcc will emit 649 1.1 christos 650 1.1 christos .section .lbss,"aw",@progbits 651 1.1 christos 652 1.1 christos "@progbits" is incorrect. */ 653 1.1 christos #ifdef TC_I386 654 1.1 christos && (bed->s->arch_size != 64 655 1.1 christos || !(ssect->attr & SHF_X86_64_LARGE)) 656 1.1 christos #endif 657 1.1 christos && ssect->type != SHT_INIT_ARRAY 658 1.1 christos && ssect->type != SHT_FINI_ARRAY 659 1.1 christos && ssect->type != SHT_PREINIT_ARRAY) 660 1.1 christos { 661 1.1 christos /* We allow to specify any type for a .note section. */ 662 1.5 christos if (ssect->type != SHT_NOTE 663 1.5 christos /* Processor and application defined types are allowed too. */ 664 1.5 christos && type < SHT_LOPROC) 665 1.1 christos as_warn (_("setting incorrect section type for %s"), 666 1.1 christos name); 667 1.1 christos } 668 1.1 christos else 669 1.1 christos { 670 1.1 christos as_warn (_("ignoring incorrect section type for %s"), 671 1.1 christos name); 672 1.1 christos type = ssect->type; 673 1.1 christos } 674 1.1 christos } 675 1.1 christos 676 1.8 christos if (old_sec == NULL && ((attr & ~(SHF_LINK_ORDER 677 1.8 christos | SHF_MASKOS 678 1.8 christos | SHF_MASKPROC)) 679 1.5 christos & ~ssect->attr) != 0) 680 1.1 christos { 681 1.8 christos /* Strip SHF_GNU_RETAIN. */ 682 1.8 christos bfd_vma generic_attr = attr; 683 1.8 christos if (elf_tdata (stdoutput)->has_gnu_osabi) 684 1.8 christos generic_attr &= ~SHF_GNU_RETAIN; 685 1.8 christos 686 1.1 christos /* As a GNU extension, we permit a .note section to be 687 1.1 christos allocatable. If the linker sees an allocatable .note 688 1.1 christos section, it will create a PT_NOTE segment in the output 689 1.1 christos file. We also allow "x" for .note.GNU-stack. */ 690 1.1 christos if (ssect->type == SHT_NOTE 691 1.8 christos && (generic_attr == SHF_ALLOC 692 1.8 christos || generic_attr == SHF_EXECINSTR)) 693 1.1 christos ; 694 1.1 christos /* Allow different SHF_MERGE and SHF_STRINGS if we have 695 1.1 christos something like .rodata.str. */ 696 1.1 christos else if (ssect->suffix_length == -2 697 1.1 christos && name[ssect->prefix_length] == '.' 698 1.8 christos && (generic_attr 699 1.1 christos & ~ssect->attr 700 1.1 christos & ~SHF_MERGE 701 1.1 christos & ~SHF_STRINGS) == 0) 702 1.1 christos ; 703 1.1 christos /* .interp, .strtab and .symtab can have SHF_ALLOC. */ 704 1.8 christos else if (generic_attr == SHF_ALLOC 705 1.1 christos && (strcmp (name, ".interp") == 0 706 1.1 christos || strcmp (name, ".strtab") == 0 707 1.1 christos || strcmp (name, ".symtab") == 0)) 708 1.8 christos override = true; 709 1.1 christos /* .note.GNU-stack can have SHF_EXECINSTR. */ 710 1.8 christos else if (generic_attr == SHF_EXECINSTR 711 1.1 christos && strcmp (name, ".note.GNU-stack") == 0) 712 1.8 christos override = true; 713 1.1 christos #ifdef TC_ALPHA 714 1.1 christos /* A section on Alpha may have SHF_ALPHA_GPREL. */ 715 1.8 christos else if ((generic_attr & ~ssect->attr) == SHF_ALPHA_GPREL) 716 1.8 christos override = true; 717 1.1 christos #endif 718 1.3 christos #ifdef TC_RX 719 1.8 christos else if (generic_attr == (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC) 720 1.3 christos && (ssect->type == SHT_INIT_ARRAY 721 1.3 christos || ssect->type == SHT_FINI_ARRAY 722 1.3 christos || ssect->type == SHT_PREINIT_ARRAY)) 723 1.3 christos /* RX init/fini arrays can and should have the "awx" attributes set. */ 724 1.3 christos ; 725 1.3 christos #endif 726 1.1 christos else 727 1.1 christos { 728 1.8 christos if (match_p->group_name == NULL) 729 1.1 christos as_warn (_("setting incorrect section attributes for %s"), 730 1.1 christos name); 731 1.8 christos override = true; 732 1.1 christos } 733 1.1 christos } 734 1.5 christos 735 1.1 christos if (!override && old_sec == NULL) 736 1.1 christos attr |= ssect->attr; 737 1.1 christos } 738 1.1 christos 739 1.1 christos /* Convert ELF type and flags to BFD flags. */ 740 1.1 christos flags = (SEC_RELOC 741 1.1 christos | ((attr & SHF_WRITE) ? 0 : SEC_READONLY) 742 1.1 christos | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0) 743 1.1 christos | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0) 744 1.1 christos | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0) 745 1.1 christos | ((attr & SHF_MERGE) ? SEC_MERGE : 0) 746 1.1 christos | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0) 747 1.1 christos | ((attr & SHF_EXCLUDE) ? SEC_EXCLUDE: 0) 748 1.1 christos | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0)); 749 1.1 christos #ifdef md_elf_section_flags 750 1.1 christos flags = md_elf_section_flags (flags, attr, type); 751 1.1 christos #endif 752 1.1 christos 753 1.1 christos if (linkonce) 754 1.1 christos flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; 755 1.1 christos 756 1.8 christos /* PR 28054: Set the SEC_ELF_OCTETS flag for debugging sections. 757 1.8 christos Based on the code in bfd/elf.c:_bfd_elf_make_section_from_shdr(). 758 1.8 christos 759 1.8 christos FIXME: We do not set the SEC_DEBUGGING flag because that causes 760 1.8 christos problems for the FT32 and MSP430 targets. Investigate and fix. */ 761 1.8 christos if ((flags & SEC_ALLOC) == 0 && name [0] == '.') 762 1.8 christos { 763 1.8 christos if ( startswith (name, ".debug") 764 1.8 christos || startswith (name, ".zdebug") 765 1.8 christos || startswith (name, ".gnu.debuglto_.debug_") 766 1.8 christos || startswith (name, ".gnu.linkonce.wi.") 767 1.8 christos || startswith (name, GNU_BUILD_ATTRS_SECTION_NAME) 768 1.8 christos || startswith (name, ".note.gnu")) 769 1.8 christos flags |= SEC_ELF_OCTETS; 770 1.8 christos } 771 1.10 christos 772 1.1 christos if (old_sec == NULL) 773 1.1 christos { 774 1.1 christos symbolS *secsym; 775 1.1 christos 776 1.1 christos if (type == SHT_NULL) 777 1.1 christos type = bfd_elf_get_default_section_type (flags); 778 1.1 christos elf_section_type (sec) = type; 779 1.1 christos elf_section_flags (sec) = attr; 780 1.8 christos elf_section_data (sec)->this_hdr.sh_info = match_p->sh_info; 781 1.1 christos 782 1.1 christos /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */ 783 1.1 christos if (type == SHT_NOBITS) 784 1.1 christos seg_info (sec)->bss = 1; 785 1.1 christos 786 1.8 christos /* Set the section ID and flags. */ 787 1.8 christos sec->section_id = match_p->section_id; 788 1.8 christos flags |= match_p->flags; 789 1.8 christos 790 1.8 christos /* Set the linked-to symbol name. */ 791 1.8 christos sec->map_head.linked_to_symbol_name 792 1.8 christos = match_p->linked_to_symbol_name; 793 1.8 christos 794 1.7 christos bfd_set_section_flags (sec, flags); 795 1.10 christos if (flags & (SEC_MERGE | SEC_STRINGS)) 796 1.1 christos sec->entsize = entsize; 797 1.8 christos elf_group_name (sec) = match_p->group_name; 798 1.1 christos 799 1.1 christos /* Add a symbol for this section to the symbol table. */ 800 1.1 christos secsym = symbol_find (name); 801 1.1 christos if (secsym != NULL) 802 1.8 christos { 803 1.8 christos /* We could be repurposing an undefined symbol here: make sure we 804 1.8 christos reset sy_value to look like other section symbols in order to avoid 805 1.8 christos trying to incorrectly resolve this section symbol later on. */ 806 1.8 christos static const expressionS exp = { .X_op = O_constant }; 807 1.8 christos symbol_set_value_expression (secsym, &exp); 808 1.8 christos symbol_set_bfdsym (secsym, sec->symbol); 809 1.8 christos } 810 1.1 christos else 811 1.1 christos symbol_table_insert (section_symbol (sec)); 812 1.1 christos } 813 1.1 christos else 814 1.1 christos { 815 1.1 christos if (type != SHT_NULL 816 1.1 christos && (unsigned) type != elf_section_type (old_sec)) 817 1.8 christos { 818 1.8 christos if (ssect != NULL) 819 1.8 christos /* This is a special section with known type. User 820 1.8 christos assembly might get the section type wrong; Even high 821 1.8 christos profile projects like glibc have done so in the past. 822 1.8 christos So don't error in this case. */ 823 1.8 christos as_warn (_("ignoring changed section type for %s"), name); 824 1.8 christos else 825 1.8 christos /* Do error when assembly isn't self-consistent. */ 826 1.8 christos as_bad (_("changed section type for %s"), name); 827 1.8 christos } 828 1.1 christos 829 1.1 christos if (attr != 0) 830 1.1 christos { 831 1.1 christos /* If section attributes are specified the second time we see a 832 1.1 christos particular section, then check that they are the same as we 833 1.1 christos saw the first time. */ 834 1.1 christos if (((old_sec->flags ^ flags) 835 1.1 christos & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE 836 1.1 christos | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS 837 1.1 christos | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD 838 1.1 christos | SEC_THREAD_LOCAL))) 839 1.8 christos { 840 1.8 christos if (ssect != NULL) 841 1.8 christos as_warn (_("ignoring changed section attributes for %s"), name); 842 1.8 christos else 843 1.8 christos as_bad (_("changed section attributes for %s"), name); 844 1.8 christos } 845 1.5 christos else 846 1.5 christos /* FIXME: Maybe we should consider removing a previously set 847 1.8 christos processor or application specific attribute as suspicious? */ 848 1.5 christos elf_section_flags (sec) = attr; 849 1.5 christos 850 1.10 christos if ((flags & (SEC_MERGE | SEC_STRINGS)) 851 1.10 christos && old_sec->entsize != (unsigned) entsize) 852 1.8 christos as_bad (_("changed section entity size for %s"), name); 853 1.1 christos } 854 1.1 christos } 855 1.1 christos 856 1.1 christos #ifdef md_elf_section_change_hook 857 1.1 christos md_elf_section_change_hook (); 858 1.1 christos #endif 859 1.1 christos } 860 1.1 christos 861 1.9 christos void 862 1.9 christos obj_elf_change_section (const char *name, 863 1.9 christos unsigned int type, 864 1.9 christos bfd_vma attr, 865 1.9 christos int entsize, 866 1.9 christos struct elf_section_match *match_p, 867 1.9 christos bool linkonce) 868 1.9 christos { 869 1.9 christos change_section (name, type, attr, entsize, match_p, linkonce, false, 0); 870 1.9 christos } 871 1.9 christos 872 1.1 christos static bfd_vma 873 1.7 christos obj_elf_parse_section_letters (char *str, size_t len, 874 1.9 christos bool *is_clone, int *inherit, bfd_vma *gnu_attr) 875 1.1 christos { 876 1.1 christos bfd_vma attr = 0; 877 1.9 christos 878 1.8 christos *is_clone = false; 879 1.9 christos *inherit = 0; 880 1.1 christos 881 1.1 christos while (len > 0) 882 1.1 christos { 883 1.1 christos switch (*str) 884 1.1 christos { 885 1.1 christos case 'a': 886 1.1 christos attr |= SHF_ALLOC; 887 1.8 christos /* Compatibility. */ 888 1.8 christos if (len > 1 && str[1] == 'm') 889 1.8 christos { 890 1.8 christos attr |= SHF_MERGE; 891 1.8 christos str++, len--; 892 1.8 christos if (len > 1 && str[1] == 's') 893 1.8 christos { 894 1.8 christos attr |= SHF_STRINGS; 895 1.8 christos str++, len--; 896 1.8 christos } 897 1.8 christos } 898 1.1 christos break; 899 1.1 christos case 'e': 900 1.1 christos attr |= SHF_EXCLUDE; 901 1.1 christos break; 902 1.8 christos case 'o': 903 1.8 christos attr |= SHF_LINK_ORDER; 904 1.8 christos break; 905 1.1 christos case 'w': 906 1.1 christos attr |= SHF_WRITE; 907 1.1 christos break; 908 1.1 christos case 'x': 909 1.1 christos attr |= SHF_EXECINSTR; 910 1.1 christos break; 911 1.1 christos case 'M': 912 1.1 christos attr |= SHF_MERGE; 913 1.1 christos break; 914 1.1 christos case 'S': 915 1.1 christos attr |= SHF_STRINGS; 916 1.1 christos break; 917 1.1 christos case 'G': 918 1.1 christos attr |= SHF_GROUP; 919 1.1 christos break; 920 1.1 christos case 'T': 921 1.1 christos attr |= SHF_TLS; 922 1.1 christos break; 923 1.6 christos case 'd': 924 1.7 christos *gnu_attr |= SHF_GNU_MBIND; 925 1.6 christos break; 926 1.8 christos case 'R': 927 1.8 christos *gnu_attr |= SHF_GNU_RETAIN; 928 1.8 christos break; 929 1.1 christos case '?': 930 1.8 christos *is_clone = true; 931 1.1 christos break; 932 1.1 christos default: 933 1.1 christos { 934 1.5 christos const char *bad_msg = _("unrecognized .section attribute:" 935 1.8 christos " want a,e,o,w,x,M,S,G,T or number"); 936 1.1 christos #ifdef md_elf_section_letter 937 1.1 christos bfd_vma md_attr = md_elf_section_letter (*str, &bad_msg); 938 1.1 christos if (md_attr != (bfd_vma) -1) 939 1.1 christos attr |= md_attr; 940 1.1 christos else 941 1.1 christos #endif 942 1.5 christos if (ISDIGIT (*str)) 943 1.5 christos { 944 1.5 christos char * end; 945 1.10 christos const struct elf_backend_data *bed; 946 1.8 christos bfd_vma numeric_flags = strtoul (str, &end, 0); 947 1.8 christos 948 1.8 christos attr |= numeric_flags; 949 1.8 christos 950 1.10 christos bed = get_elf_backend_data (stdoutput); 951 1.8 christos 952 1.8 christos if (bed->elf_osabi == ELFOSABI_NONE 953 1.8 christos || bed->elf_osabi == ELFOSABI_STANDALONE 954 1.8 christos || bed->elf_osabi == ELFOSABI_GNU 955 1.8 christos || bed->elf_osabi == ELFOSABI_FREEBSD) 956 1.8 christos { 957 1.8 christos /* Add flags in the SHF_MASKOS range to gnu_attr for 958 1.8 christos OSABIs that support those flags. 959 1.8 christos Also adding the flags for ELFOSABI_{NONE,STANDALONE} 960 1.8 christos allows them to be validated later in obj_elf_section. 961 1.8 christos We can't just always set these bits in gnu_attr for 962 1.8 christos all OSABIs, since Binutils does not recognize all 963 1.8 christos SHF_MASKOS bits for non-GNU OSABIs. It's therefore 964 1.8 christos possible that numeric flags are being used to set bits 965 1.8 christos in the SHF_MASKOS range for those targets, and we 966 1.8 christos don't want assembly to fail in those situations. */ 967 1.8 christos *gnu_attr |= (numeric_flags & SHF_MASKOS); 968 1.8 christos } 969 1.5 christos 970 1.5 christos /* Update str and len, allowing for the fact that 971 1.5 christos we will execute str++ and len-- below. */ 972 1.5 christos end --; 973 1.5 christos len -= (end - str); 974 1.5 christos str = end; 975 1.5 christos } 976 1.9 christos else if (!attr && !*gnu_attr && (*str == '+' || *str == '-')) 977 1.9 christos *inherit = *str == '+' ? 1 : -1; 978 1.5 christos else 979 1.5 christos as_fatal ("%s", bad_msg); 980 1.1 christos } 981 1.1 christos break; 982 1.1 christos } 983 1.1 christos str++, len--; 984 1.1 christos } 985 1.1 christos 986 1.1 christos return attr; 987 1.1 christos } 988 1.1 christos 989 1.1 christos static int 990 1.8 christos obj_elf_section_type (char *str, size_t len, bool warn) 991 1.1 christos { 992 1.8 christos if (len == 8 && startswith (str, "progbits")) 993 1.1 christos return SHT_PROGBITS; 994 1.8 christos if (len == 6 && startswith (str, "nobits")) 995 1.1 christos return SHT_NOBITS; 996 1.8 christos if (len == 4 && startswith (str, "note")) 997 1.1 christos return SHT_NOTE; 998 1.8 christos if (len == 10 && startswith (str, "init_array")) 999 1.1 christos return SHT_INIT_ARRAY; 1000 1.8 christos if (len == 10 && startswith (str, "fini_array")) 1001 1.1 christos return SHT_FINI_ARRAY; 1002 1.8 christos if (len == 13 && startswith (str, "preinit_array")) 1003 1.1 christos return SHT_PREINIT_ARRAY; 1004 1.1 christos 1005 1.1 christos #ifdef md_elf_section_type 1006 1.1 christos { 1007 1.1 christos int md_type = md_elf_section_type (str, len); 1008 1.1 christos if (md_type >= 0) 1009 1.1 christos return md_type; 1010 1.1 christos } 1011 1.1 christos #endif 1012 1.1 christos 1013 1.5 christos if (ISDIGIT (*str)) 1014 1.5 christos { 1015 1.5 christos char * end; 1016 1.5 christos int type = strtoul (str, & end, 0); 1017 1.5 christos 1018 1.5 christos if (warn && (size_t) (end - str) != len) 1019 1.5 christos as_warn (_("extraneous characters at end of numeric section type")); 1020 1.5 christos 1021 1.5 christos return type; 1022 1.5 christos } 1023 1.5 christos 1024 1.1 christos if (warn) 1025 1.1 christos as_warn (_("unrecognized section type")); 1026 1.1 christos return 0; 1027 1.1 christos } 1028 1.1 christos 1029 1.9 christos #ifdef TC_SPARC 1030 1.1 christos static bfd_vma 1031 1.1 christos obj_elf_section_word (char *str, size_t len, int *type) 1032 1.1 christos { 1033 1.1 christos int ret; 1034 1.1 christos 1035 1.8 christos if (len == 5 && startswith (str, "write")) 1036 1.1 christos return SHF_WRITE; 1037 1.8 christos if (len == 5 && startswith (str, "alloc")) 1038 1.1 christos return SHF_ALLOC; 1039 1.8 christos if (len == 9 && startswith (str, "execinstr")) 1040 1.1 christos return SHF_EXECINSTR; 1041 1.8 christos if (len == 7 && startswith (str, "exclude")) 1042 1.1 christos return SHF_EXCLUDE; 1043 1.8 christos if (len == 3 && startswith (str, "tls")) 1044 1.1 christos return SHF_TLS; 1045 1.1 christos 1046 1.8 christos ret = obj_elf_section_type (str, len, false); 1047 1.1 christos if (ret != 0) 1048 1.1 christos *type = ret; 1049 1.1 christos else 1050 1.1 christos as_warn (_("unrecognized section attribute")); 1051 1.1 christos 1052 1.1 christos return 0; 1053 1.1 christos } 1054 1.9 christos #endif 1055 1.1 christos 1056 1.1 christos /* Get name of section. */ 1057 1.5 christos const char * 1058 1.1 christos obj_elf_section_name (void) 1059 1.1 christos { 1060 1.1 christos char *name; 1061 1.1 christos 1062 1.1 christos SKIP_WHITESPACE (); 1063 1.1 christos if (*input_line_pointer == '"') 1064 1.1 christos { 1065 1.1 christos int dummy; 1066 1.1 christos 1067 1.1 christos name = demand_copy_C_string (&dummy); 1068 1.1 christos if (name == NULL) 1069 1.1 christos { 1070 1.1 christos ignore_rest_of_line (); 1071 1.1 christos return NULL; 1072 1.1 christos } 1073 1.1 christos } 1074 1.1 christos else 1075 1.1 christos { 1076 1.1 christos char *end = input_line_pointer; 1077 1.1 christos 1078 1.10 christos while (!is_whitespace (*end) && !is_end_of_stmt (*end) && *end != ',') 1079 1.1 christos end++; 1080 1.1 christos if (end == input_line_pointer) 1081 1.1 christos { 1082 1.1 christos as_bad (_("missing name")); 1083 1.1 christos ignore_rest_of_line (); 1084 1.1 christos return NULL; 1085 1.1 christos } 1086 1.1 christos 1087 1.8 christos obstack_grow0 (¬es, input_line_pointer, end - input_line_pointer); 1088 1.8 christos name = obstack_base (¬es); 1089 1.3 christos 1090 1.3 christos while (flag_sectname_subst) 1091 1.3 christos { 1092 1.3 christos char *subst = strchr (name, '%'); 1093 1.3 christos if (subst && subst[1] == 'S') 1094 1.3 christos { 1095 1.8 christos size_t head = subst - name; 1096 1.8 christos size_t tail = strlen (subst + 2) + 1; 1097 1.8 christos size_t slen = strlen (now_seg->name); 1098 1.8 christos 1099 1.8 christos if (slen > 2) 1100 1.8 christos { 1101 1.8 christos obstack_blank (¬es, slen - 2); 1102 1.8 christos name = obstack_base (¬es); 1103 1.8 christos } 1104 1.8 christos memmove (name + head + slen, name + head + 2, tail); 1105 1.8 christos memcpy (name + head, now_seg->name, slen); 1106 1.3 christos } 1107 1.3 christos else 1108 1.3 christos break; 1109 1.3 christos } 1110 1.3 christos 1111 1.8 christos obstack_finish (¬es); 1112 1.8 christos 1113 1.1 christos #ifdef tc_canonicalize_section_name 1114 1.1 christos name = tc_canonicalize_section_name (name); 1115 1.1 christos #endif 1116 1.1 christos input_line_pointer = end; 1117 1.1 christos } 1118 1.1 christos SKIP_WHITESPACE (); 1119 1.1 christos return name; 1120 1.1 christos } 1121 1.1 christos 1122 1.10 christos /* Arrange to put SEC, known to be in group GNAME into the per-group 1123 1.10 christos section lists kept by gas. */ 1124 1.10 christos 1125 1.10 christos void 1126 1.10 christos elf_set_group_name (asection *sec, const char *gname) 1127 1.10 christos { 1128 1.10 christos elf_group_name (sec) = gname; 1129 1.10 christos elf_section_flags (sec) |= SHF_GROUP; 1130 1.10 christos 1131 1.10 christos struct elf_section_match match; 1132 1.10 christos match.group_name = gname; 1133 1.10 christos match.linked_to_symbol_name = sec->map_head.linked_to_symbol_name; 1134 1.10 christos match.section_id = sec->section_id; 1135 1.10 christos match.sh_info = elf_section_data (sec)->this_hdr.sh_info; 1136 1.10 christos match.sh_flags = (elf_section_data (sec)->this_hdr.sh_flags 1137 1.10 christos & SEC_ASSEMBLER_SHF_MASK); 1138 1.10 christos match.flags = bfd_section_flags (sec) & SEC_ASSEMBLER_SECTION_ID; 1139 1.10 christos 1140 1.10 christos unsigned int group_idx; 1141 1.10 christos if (!group_section_find (&match, sec->name, &group_idx)) 1142 1.10 christos group_section_insert (&match, sec, &group_idx); 1143 1.10 christos } 1144 1.10 christos 1145 1.8 christos static void 1146 1.8 christos obj_elf_attach_to_group (int dummy ATTRIBUTE_UNUSED) 1147 1.8 christos { 1148 1.8 christos const char * gname = obj_elf_section_name (); 1149 1.8 christos 1150 1.8 christos if (gname == NULL) 1151 1.8 christos { 1152 1.8 christos as_warn (_("group name not parseable")); 1153 1.8 christos return; 1154 1.8 christos } 1155 1.8 christos 1156 1.8 christos if (elf_group_name (now_seg)) 1157 1.8 christos { 1158 1.9 christos if (strcmp (elf_group_name (now_seg), gname) != 0) 1159 1.9 christos as_warn (_("section %s already has a group (%s)"), 1160 1.9 christos bfd_section_name (now_seg), elf_group_name (now_seg)); 1161 1.8 christos return; 1162 1.8 christos } 1163 1.10 christos elf_set_group_name (now_seg, gname); 1164 1.10 christos } 1165 1.10 christos 1166 1.10 christos /* Handle section related directives. 1167 1.8 christos 1168 1.10 christos Note on support for SFrame sections: These are generally expected to be 1169 1.10 christos generated by the assembler. However, this function permits their direct 1170 1.10 christos creation by the user. At the moment though, we go no extra mile by adding 1171 1.10 christos an explicit @sframe for SHT_GNU_SFRAME (using the numeric value of section 1172 1.10 christos type should suffice); Nor do we implement any outright refusal for 1173 1.10 christos non-supported targets via ELFOSABI-specific checks. */ 1174 1.8 christos 1175 1.1 christos void 1176 1.1 christos obj_elf_section (int push) 1177 1.1 christos { 1178 1.8 christos const char *name; 1179 1.5 christos char *beg; 1180 1.1 christos int type, dummy; 1181 1.1 christos bfd_vma attr; 1182 1.7 christos bfd_vma gnu_attr; 1183 1.1 christos int entsize; 1184 1.9 christos bool linkonce; 1185 1.9 christos subsegT new_subsection = 0; 1186 1.8 christos struct elf_section_match match; 1187 1.8 christos unsigned long linked_to_section_index = -1UL; 1188 1.1 christos 1189 1.1 christos if (flag_mri) 1190 1.1 christos { 1191 1.1 christos char mri_type; 1192 1.1 christos 1193 1.1 christos #ifdef md_flush_pending_output 1194 1.1 christos md_flush_pending_output (); 1195 1.1 christos #endif 1196 1.1 christos 1197 1.8 christos obj_elf_section_change_hook (); 1198 1.1 christos 1199 1.1 christos s_mri_sect (&mri_type); 1200 1.1 christos 1201 1.1 christos #ifdef md_elf_section_change_hook 1202 1.1 christos md_elf_section_change_hook (); 1203 1.1 christos #endif 1204 1.1 christos 1205 1.1 christos return; 1206 1.1 christos } 1207 1.1 christos 1208 1.1 christos name = obj_elf_section_name (); 1209 1.1 christos if (name == NULL) 1210 1.1 christos return; 1211 1.7 christos 1212 1.8 christos memset (&match, 0, sizeof (match)); 1213 1.8 christos 1214 1.7 christos symbolS * sym; 1215 1.7 christos if ((sym = symbol_find (name)) != NULL 1216 1.7 christos && ! symbol_section_p (sym) 1217 1.7 christos && S_IS_DEFINED (sym) 1218 1.7 christos && ! S_IS_VOLATILE (sym) 1219 1.7 christos && ! S_CAN_BE_REDEFINED (sym)) 1220 1.7 christos { 1221 1.7 christos as_bad (_("section name '%s' already defined as another symbol"), name); 1222 1.7 christos ignore_rest_of_line (); 1223 1.7 christos return; 1224 1.7 christos } 1225 1.1 christos type = SHT_NULL; 1226 1.1 christos attr = 0; 1227 1.7 christos gnu_attr = 0; 1228 1.1 christos entsize = 0; 1229 1.1 christos linkonce = 0; 1230 1.1 christos 1231 1.1 christos if (*input_line_pointer == ',') 1232 1.1 christos { 1233 1.1 christos /* Skip the comma. */ 1234 1.1 christos ++input_line_pointer; 1235 1.1 christos SKIP_WHITESPACE (); 1236 1.1 christos 1237 1.1 christos if (push && ISDIGIT (*input_line_pointer)) 1238 1.1 christos { 1239 1.1 christos /* .pushsection has an optional subsection. */ 1240 1.10 christos new_subsection = get_absolute_expression (); 1241 1.1 christos 1242 1.1 christos SKIP_WHITESPACE (); 1243 1.1 christos 1244 1.1 christos /* Stop if we don't see a comma. */ 1245 1.1 christos if (*input_line_pointer != ',') 1246 1.1 christos goto done; 1247 1.1 christos 1248 1.1 christos /* Skip the comma. */ 1249 1.1 christos ++input_line_pointer; 1250 1.1 christos SKIP_WHITESPACE (); 1251 1.1 christos } 1252 1.1 christos 1253 1.1 christos if (*input_line_pointer == '"') 1254 1.1 christos { 1255 1.8 christos bool is_clone; 1256 1.9 christos int inherit; 1257 1.1 christos 1258 1.1 christos beg = demand_copy_C_string (&dummy); 1259 1.1 christos if (beg == NULL) 1260 1.1 christos { 1261 1.1 christos ignore_rest_of_line (); 1262 1.1 christos return; 1263 1.1 christos } 1264 1.9 christos attr = obj_elf_parse_section_letters (beg, strlen (beg), &is_clone, 1265 1.9 christos &inherit, &gnu_attr); 1266 1.9 christos 1267 1.9 christos if (inherit > 0) 1268 1.9 christos attr |= elf_section_flags (now_seg); 1269 1.9 christos else if (inherit < 0) 1270 1.9 christos attr = elf_section_flags (now_seg) & ~attr; 1271 1.9 christos if (inherit) 1272 1.9 christos type = elf_section_type (now_seg); 1273 1.1 christos 1274 1.1 christos SKIP_WHITESPACE (); 1275 1.1 christos if (*input_line_pointer == ',') 1276 1.1 christos { 1277 1.1 christos char c; 1278 1.1 christos char *save = input_line_pointer; 1279 1.1 christos 1280 1.1 christos ++input_line_pointer; 1281 1.1 christos SKIP_WHITESPACE (); 1282 1.1 christos c = *input_line_pointer; 1283 1.1 christos if (c == '"') 1284 1.1 christos { 1285 1.1 christos beg = demand_copy_C_string (&dummy); 1286 1.1 christos if (beg == NULL) 1287 1.1 christos { 1288 1.1 christos ignore_rest_of_line (); 1289 1.1 christos return; 1290 1.1 christos } 1291 1.8 christos type = obj_elf_section_type (beg, strlen (beg), true); 1292 1.1 christos } 1293 1.1 christos else if (c == '@' || c == '%') 1294 1.1 christos { 1295 1.3 christos ++input_line_pointer; 1296 1.5 christos 1297 1.5 christos if (ISDIGIT (* input_line_pointer)) 1298 1.7 christos type = strtoul (input_line_pointer, &input_line_pointer, 0); 1299 1.5 christos else 1300 1.5 christos { 1301 1.5 christos c = get_symbol_name (& beg); 1302 1.5 christos (void) restore_line_pointer (c); 1303 1.7 christos type = obj_elf_section_type (beg, 1304 1.7 christos input_line_pointer - beg, 1305 1.8 christos true); 1306 1.5 christos } 1307 1.1 christos } 1308 1.1 christos else 1309 1.1 christos input_line_pointer = save; 1310 1.1 christos } 1311 1.1 christos 1312 1.1 christos SKIP_WHITESPACE (); 1313 1.10 christos if ((attr & (SHF_MERGE | SHF_STRINGS)) != 0 1314 1.10 christos && *input_line_pointer == ',') 1315 1.1 christos { 1316 1.1 christos ++input_line_pointer; 1317 1.1 christos SKIP_WHITESPACE (); 1318 1.9 christos if (inherit && *input_line_pointer == ',' 1319 1.10 christos && (bfd_section_flags (now_seg) 1320 1.10 christos & (SEC_MERGE | SEC_STRINGS)) != 0) 1321 1.9 christos goto fetch_entsize; 1322 1.10 christos if (is_end_of_stmt (*input_line_pointer)) 1323 1.1 christos { 1324 1.10 christos /* ??? This is here for older versions of gcc that 1325 1.10 christos test for gas string merge support with 1326 1.10 christos '.section .rodata.str, "aMS", @progbits, 1' 1327 1.10 christos Unfortunately '@' begins a comment on arm. 1328 1.10 christos This isn't as_warn because gcc tests with 1329 1.10 christos --fatal-warnings. */ 1330 1.10 christos as_tsktsk (_("missing merge / string entity size, 1 assumed")); 1331 1.10 christos entsize = 1; 1332 1.10 christos } 1333 1.10 christos else 1334 1.10 christos { 1335 1.10 christos entsize = get_absolute_expression (); 1336 1.10 christos SKIP_WHITESPACE (); 1337 1.10 christos if (entsize <= 0) 1338 1.10 christos { 1339 1.10 christos as_warn (_("invalid merge / string entity size")); 1340 1.10 christos attr &= ~(SHF_MERGE | SHF_STRINGS); 1341 1.10 christos entsize = 0; 1342 1.10 christos } 1343 1.1 christos } 1344 1.1 christos } 1345 1.10 christos else if ((attr & (SHF_MERGE | SHF_STRINGS)) != 0 && inherit 1346 1.10 christos && (bfd_section_flags (now_seg) 1347 1.10 christos & (SEC_MERGE | SEC_STRINGS)) != 0) 1348 1.9 christos { 1349 1.9 christos fetch_entsize: 1350 1.9 christos entsize = now_seg->entsize; 1351 1.9 christos } 1352 1.1 christos else if ((attr & SHF_MERGE) != 0) 1353 1.1 christos { 1354 1.10 christos /* ??? Perhaps we should error here. The manual says that 1355 1.10 christos entsize must be specified if SHF_MERGE is set. */ 1356 1.1 christos as_warn (_("entity size for SHF_MERGE not specified")); 1357 1.10 christos attr &= ~(SHF_MERGE | SHF_STRINGS); 1358 1.10 christos } 1359 1.10 christos else if ((attr & SHF_STRINGS) != 0) 1360 1.10 christos { 1361 1.10 christos /* Ideally we would warn about this, but older versions 1362 1.10 christos of gas did not permit an entity size to be specified, 1363 1.10 christos so we have to default this silently for 1364 1.10 christos compatibility. */ 1365 1.10 christos entsize = 1; 1366 1.1 christos } 1367 1.1 christos 1368 1.10 christos if ((attr & (SHF_MERGE | SHF_STRINGS)) != 0 && type == SHT_NOBITS) 1369 1.10 christos as_warn (_("bogus SHF_MERGE / SHF_STRINGS for SHT_NOBITS section")); 1370 1.10 christos 1371 1.8 christos if ((attr & SHF_LINK_ORDER) != 0 && *input_line_pointer == ',') 1372 1.8 christos { 1373 1.8 christos ++input_line_pointer; 1374 1.8 christos SKIP_WHITESPACE (); 1375 1.8 christos /* Check for a numeric section index, rather than a symbol name. */ 1376 1.8 christos if (ISDIGIT (* input_line_pointer)) 1377 1.8 christos { 1378 1.8 christos linked_to_section_index = strtoul (input_line_pointer, & input_line_pointer, 0); 1379 1.8 christos } 1380 1.9 christos else if (inherit && *input_line_pointer == ',' 1381 1.9 christos && (elf_section_flags (now_seg) & SHF_LINK_ORDER) != 0) 1382 1.9 christos goto fetch_linked_to; 1383 1.8 christos else 1384 1.8 christos { 1385 1.8 christos char c; 1386 1.8 christos unsigned int length; 1387 1.8 christos 1388 1.8 christos c = get_symbol_name (& beg); 1389 1.8 christos (void) restore_line_pointer (c); 1390 1.8 christos length = input_line_pointer - beg; 1391 1.8 christos if (length) 1392 1.10 christos match.linked_to_symbol_name 1393 1.10 christos = notes_memdup (beg, length, length + 1); 1394 1.8 christos } 1395 1.8 christos } 1396 1.9 christos else if ((attr & SHF_LINK_ORDER) != 0 && inherit 1397 1.9 christos && (elf_section_flags (now_seg) & SHF_LINK_ORDER) != 0) 1398 1.9 christos { 1399 1.9 christos fetch_linked_to: 1400 1.9 christos if (now_seg->map_head.linked_to_symbol_name) 1401 1.9 christos match.linked_to_symbol_name = 1402 1.9 christos now_seg->map_head.linked_to_symbol_name; 1403 1.9 christos else 1404 1.9 christos linked_to_section_index = 1405 1.9 christos elf_section_data (now_seg)->this_hdr.sh_link; 1406 1.9 christos } 1407 1.8 christos 1408 1.1 christos if ((attr & SHF_GROUP) != 0 && is_clone) 1409 1.1 christos { 1410 1.1 christos as_warn (_("? section flag ignored with G present")); 1411 1.8 christos is_clone = false; 1412 1.1 christos } 1413 1.8 christos 1414 1.1 christos if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',') 1415 1.1 christos { 1416 1.1 christos ++input_line_pointer; 1417 1.9 christos SKIP_WHITESPACE (); 1418 1.9 christos if (inherit && *input_line_pointer == ',' 1419 1.9 christos && (elf_section_flags (now_seg) & SHF_GROUP) != 0) 1420 1.9 christos goto fetch_group; 1421 1.8 christos match.group_name = obj_elf_section_name (); 1422 1.8 christos if (match.group_name == NULL) 1423 1.1 christos attr &= ~SHF_GROUP; 1424 1.1 christos else if (*input_line_pointer == ',') 1425 1.1 christos { 1426 1.1 christos ++input_line_pointer; 1427 1.1 christos SKIP_WHITESPACE (); 1428 1.8 christos if (startswith (input_line_pointer, "comdat")) 1429 1.1 christos { 1430 1.1 christos input_line_pointer += 6; 1431 1.1 christos linkonce = 1; 1432 1.1 christos } 1433 1.1 christos } 1434 1.8 christos else if (startswith (name, ".gnu.linkonce")) 1435 1.1 christos linkonce = 1; 1436 1.1 christos } 1437 1.9 christos else if ((attr & SHF_GROUP) != 0 && inherit 1438 1.9 christos && (elf_section_flags (now_seg) & SHF_GROUP) != 0) 1439 1.9 christos { 1440 1.9 christos fetch_group: 1441 1.9 christos match.group_name = elf_group_name (now_seg); 1442 1.9 christos linkonce = 1443 1.9 christos (bfd_section_flags (now_seg) & SEC_LINK_ONCE) != 0; 1444 1.9 christos } 1445 1.1 christos else if ((attr & SHF_GROUP) != 0) 1446 1.1 christos { 1447 1.1 christos as_warn (_("group name for SHF_GROUP not specified")); 1448 1.1 christos attr &= ~SHF_GROUP; 1449 1.1 christos } 1450 1.1 christos 1451 1.1 christos if (is_clone) 1452 1.1 christos { 1453 1.1 christos const char *now_group = elf_group_name (now_seg); 1454 1.1 christos if (now_group != NULL) 1455 1.1 christos { 1456 1.8 christos match.group_name = now_group; 1457 1.1 christos linkonce = (now_seg->flags & SEC_LINK_ONCE) != 0; 1458 1.1 christos } 1459 1.1 christos } 1460 1.6 christos 1461 1.7 christos if ((gnu_attr & SHF_GNU_MBIND) != 0 && *input_line_pointer == ',') 1462 1.6 christos { 1463 1.8 christos char *save = input_line_pointer; 1464 1.6 christos ++input_line_pointer; 1465 1.6 christos SKIP_WHITESPACE (); 1466 1.6 christos if (ISDIGIT (* input_line_pointer)) 1467 1.6 christos { 1468 1.6 christos char *t = input_line_pointer; 1469 1.8 christos match.sh_info = strtoul (input_line_pointer, 1470 1.8 christos &input_line_pointer, 0); 1471 1.10 christos if (match.sh_info == -1u) 1472 1.6 christos { 1473 1.6 christos as_warn (_("unsupported mbind section info: %s"), t); 1474 1.8 christos match.sh_info = 0; 1475 1.6 christos } 1476 1.6 christos } 1477 1.8 christos else 1478 1.8 christos input_line_pointer = save; 1479 1.8 christos } 1480 1.8 christos 1481 1.8 christos if ((gnu_attr & SHF_GNU_RETAIN) != 0) 1482 1.8 christos match.sh_flags |= SHF_GNU_RETAIN; 1483 1.8 christos 1484 1.8 christos if (*input_line_pointer == ',') 1485 1.8 christos { 1486 1.8 christos char *save = input_line_pointer; 1487 1.8 christos 1488 1.8 christos ++input_line_pointer; 1489 1.8 christos SKIP_WHITESPACE (); 1490 1.8 christos if (startswith (input_line_pointer, "unique")) 1491 1.8 christos { 1492 1.8 christos input_line_pointer += 6; 1493 1.8 christos SKIP_WHITESPACE (); 1494 1.8 christos if (*input_line_pointer == ',') 1495 1.8 christos { 1496 1.8 christos ++input_line_pointer; 1497 1.8 christos SKIP_WHITESPACE (); 1498 1.8 christos if (ISDIGIT (* input_line_pointer)) 1499 1.8 christos { 1500 1.8 christos bfd_vma id; 1501 1.8 christos bool overflow; 1502 1.8 christos char *t = input_line_pointer; 1503 1.8 christos if (sizeof (bfd_vma) <= sizeof (unsigned long)) 1504 1.8 christos { 1505 1.8 christos errno = 0; 1506 1.8 christos id = strtoul (input_line_pointer, 1507 1.8 christos &input_line_pointer, 0); 1508 1.10 christos overflow = id == -1ul && errno == ERANGE; 1509 1.8 christos } 1510 1.8 christos else 1511 1.8 christos { 1512 1.8 christos id = bfd_scan_vma 1513 1.8 christos (input_line_pointer, 1514 1.8 christos (const char **) &input_line_pointer, 0); 1515 1.8 christos overflow = id == ~(bfd_vma) 0; 1516 1.8 christos } 1517 1.10 christos if (overflow || id > -1u) 1518 1.8 christos { 1519 1.8 christos char *linefeed, saved_char = 0; 1520 1.8 christos if ((linefeed = strchr (t, '\n')) != NULL) 1521 1.8 christos { 1522 1.8 christos saved_char = *linefeed; 1523 1.8 christos *linefeed = '\0'; 1524 1.8 christos } 1525 1.8 christos as_bad (_("unsupported section id: %s"), t); 1526 1.8 christos if (saved_char) 1527 1.8 christos *linefeed = saved_char; 1528 1.8 christos } 1529 1.8 christos else 1530 1.8 christos { 1531 1.8 christos match.section_id = id; 1532 1.8 christos match.flags |= SEC_ASSEMBLER_SECTION_ID; 1533 1.8 christos } 1534 1.8 christos } 1535 1.8 christos } 1536 1.8 christos } 1537 1.8 christos else 1538 1.8 christos input_line_pointer = save; 1539 1.6 christos } 1540 1.1 christos } 1541 1.9 christos #ifdef TC_SPARC 1542 1.1 christos else 1543 1.1 christos { 1544 1.1 christos do 1545 1.1 christos { 1546 1.1 christos char c; 1547 1.1 christos 1548 1.1 christos SKIP_WHITESPACE (); 1549 1.1 christos if (*input_line_pointer != '#') 1550 1.1 christos { 1551 1.1 christos as_bad (_("character following name is not '#'")); 1552 1.1 christos ignore_rest_of_line (); 1553 1.1 christos return; 1554 1.1 christos } 1555 1.3 christos ++input_line_pointer; 1556 1.3 christos c = get_symbol_name (& beg); 1557 1.3 christos (void) restore_line_pointer (c); 1558 1.1 christos 1559 1.7 christos attr |= obj_elf_section_word (beg, input_line_pointer - beg, 1560 1.7 christos &type); 1561 1.1 christos 1562 1.1 christos SKIP_WHITESPACE (); 1563 1.1 christos } 1564 1.1 christos while (*input_line_pointer++ == ','); 1565 1.1 christos --input_line_pointer; 1566 1.1 christos } 1567 1.9 christos #endif 1568 1.1 christos } 1569 1.1 christos 1570 1.8 christos done: 1571 1.1 christos demand_empty_rest_of_line (); 1572 1.1 christos 1573 1.8 christos if ((gnu_attr & (SHF_GNU_MBIND | SHF_GNU_RETAIN)) != 0) 1574 1.7 christos { 1575 1.8 christos const struct elf_backend_data *bed; 1576 1.8 christos bool mbind_p = (gnu_attr & SHF_GNU_MBIND) != 0; 1577 1.7 christos 1578 1.8 christos if (mbind_p && (attr & SHF_ALLOC) == 0) 1579 1.7 christos as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name); 1580 1.7 christos 1581 1.8 christos bed = get_elf_backend_data (stdoutput); 1582 1.8 christos 1583 1.8 christos if (bed->elf_osabi != ELFOSABI_GNU 1584 1.8 christos && bed->elf_osabi != ELFOSABI_FREEBSD 1585 1.8 christos && bed->elf_osabi != ELFOSABI_NONE) 1586 1.8 christos as_bad (_("%s section is supported only by GNU and FreeBSD targets"), 1587 1.8 christos mbind_p ? "GNU_MBIND" : "GNU_RETAIN"); 1588 1.8 christos else 1589 1.8 christos { 1590 1.8 christos if (mbind_p) 1591 1.8 christos elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_mbind; 1592 1.8 christos if ((gnu_attr & SHF_GNU_RETAIN) != 0) 1593 1.8 christos elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_retain; 1594 1.8 christos 1595 1.8 christos attr |= gnu_attr; 1596 1.8 christos } 1597 1.8 christos } 1598 1.8 christos 1599 1.9 christos change_section (name, type, attr, entsize, &match, linkonce, push, 1600 1.9 christos new_subsection); 1601 1.8 christos 1602 1.8 christos if (linked_to_section_index != -1UL) 1603 1.8 christos { 1604 1.8 christos elf_section_flags (now_seg) |= SHF_LINK_ORDER; 1605 1.8 christos elf_section_data (now_seg)->this_hdr.sh_link = linked_to_section_index; 1606 1.8 christos /* FIXME: Should we perform some sanity checking on the section index ? */ 1607 1.7 christos } 1608 1.1 christos } 1609 1.1 christos 1610 1.8 christos /* Change to the .bss section. */ 1611 1.8 christos 1612 1.8 christos void 1613 1.8 christos obj_elf_bss (int i ATTRIBUTE_UNUSED) 1614 1.8 christos { 1615 1.8 christos int temp; 1616 1.8 christos 1617 1.8 christos #ifdef md_flush_pending_output 1618 1.8 christos md_flush_pending_output (); 1619 1.8 christos #endif 1620 1.8 christos 1621 1.8 christos obj_elf_section_change_hook (); 1622 1.8 christos 1623 1.8 christos temp = get_absolute_expression (); 1624 1.10 christos subseg_set (bss_section, temp); 1625 1.8 christos demand_empty_rest_of_line (); 1626 1.8 christos 1627 1.8 christos #ifdef md_elf_section_change_hook 1628 1.8 christos md_elf_section_change_hook (); 1629 1.8 christos #endif 1630 1.8 christos } 1631 1.8 christos 1632 1.1 christos /* Change to the .data section. */ 1633 1.1 christos 1634 1.1 christos void 1635 1.1 christos obj_elf_data (int i) 1636 1.1 christos { 1637 1.1 christos #ifdef md_flush_pending_output 1638 1.1 christos md_flush_pending_output (); 1639 1.1 christos #endif 1640 1.1 christos 1641 1.8 christos obj_elf_section_change_hook (); 1642 1.8 christos 1643 1.1 christos s_data (i); 1644 1.1 christos 1645 1.1 christos #ifdef md_elf_section_change_hook 1646 1.1 christos md_elf_section_change_hook (); 1647 1.1 christos #endif 1648 1.1 christos } 1649 1.1 christos 1650 1.1 christos /* Change to the .text section. */ 1651 1.1 christos 1652 1.1 christos void 1653 1.1 christos obj_elf_text (int i) 1654 1.1 christos { 1655 1.1 christos #ifdef md_flush_pending_output 1656 1.1 christos md_flush_pending_output (); 1657 1.1 christos #endif 1658 1.1 christos 1659 1.8 christos obj_elf_section_change_hook (); 1660 1.8 christos 1661 1.1 christos s_text (i); 1662 1.1 christos 1663 1.1 christos #ifdef md_elf_section_change_hook 1664 1.1 christos md_elf_section_change_hook (); 1665 1.1 christos #endif 1666 1.1 christos } 1667 1.1 christos 1668 1.1 christos /* Change to the *ABS* section. */ 1669 1.1 christos 1670 1.1 christos void 1671 1.1 christos obj_elf_struct (int i) 1672 1.1 christos { 1673 1.1 christos #ifdef md_flush_pending_output 1674 1.1 christos md_flush_pending_output (); 1675 1.1 christos #endif 1676 1.1 christos 1677 1.8 christos obj_elf_section_change_hook (); 1678 1.8 christos 1679 1.1 christos s_struct (i); 1680 1.1 christos 1681 1.1 christos #ifdef md_elf_section_change_hook 1682 1.1 christos md_elf_section_change_hook (); 1683 1.1 christos #endif 1684 1.1 christos } 1685 1.1 christos 1686 1.1 christos static void 1687 1.1 christos obj_elf_subsection (int ignore ATTRIBUTE_UNUSED) 1688 1.1 christos { 1689 1.1 christos int temp; 1690 1.1 christos 1691 1.1 christos #ifdef md_flush_pending_output 1692 1.1 christos md_flush_pending_output (); 1693 1.1 christos #endif 1694 1.1 christos 1695 1.8 christos obj_elf_section_change_hook (); 1696 1.1 christos 1697 1.1 christos temp = get_absolute_expression (); 1698 1.10 christos subseg_set (now_seg, temp); 1699 1.1 christos demand_empty_rest_of_line (); 1700 1.1 christos 1701 1.1 christos #ifdef md_elf_section_change_hook 1702 1.1 christos md_elf_section_change_hook (); 1703 1.1 christos #endif 1704 1.1 christos } 1705 1.1 christos 1706 1.1 christos /* This can be called from the processor backends if they change 1707 1.1 christos sections. */ 1708 1.1 christos 1709 1.1 christos void 1710 1.1 christos obj_elf_section_change_hook (void) 1711 1.1 christos { 1712 1.1 christos previous_section = now_seg; 1713 1.1 christos previous_subsection = now_subseg; 1714 1.1 christos } 1715 1.1 christos 1716 1.1 christos void 1717 1.1 christos obj_elf_previous (int ignore ATTRIBUTE_UNUSED) 1718 1.1 christos { 1719 1.1 christos segT new_section; 1720 1.1 christos int new_subsection; 1721 1.1 christos 1722 1.1 christos if (previous_section == 0) 1723 1.1 christos { 1724 1.1 christos as_warn (_(".previous without corresponding .section; ignored")); 1725 1.1 christos return; 1726 1.1 christos } 1727 1.1 christos 1728 1.1 christos #ifdef md_flush_pending_output 1729 1.1 christos md_flush_pending_output (); 1730 1.1 christos #endif 1731 1.1 christos 1732 1.1 christos new_section = previous_section; 1733 1.1 christos new_subsection = previous_subsection; 1734 1.8 christos obj_elf_section_change_hook (); 1735 1.8 christos 1736 1.1 christos subseg_set (new_section, new_subsection); 1737 1.1 christos 1738 1.1 christos #ifdef md_elf_section_change_hook 1739 1.1 christos md_elf_section_change_hook (); 1740 1.1 christos #endif 1741 1.1 christos } 1742 1.1 christos 1743 1.1 christos static void 1744 1.1 christos obj_elf_popsection (int xxx ATTRIBUTE_UNUSED) 1745 1.1 christos { 1746 1.1 christos struct section_stack *top = section_stack; 1747 1.1 christos 1748 1.1 christos if (top == NULL) 1749 1.1 christos { 1750 1.1 christos as_warn (_(".popsection without corresponding .pushsection; ignored")); 1751 1.1 christos return; 1752 1.1 christos } 1753 1.1 christos 1754 1.1 christos #ifdef md_flush_pending_output 1755 1.1 christos md_flush_pending_output (); 1756 1.1 christos #endif 1757 1.1 christos 1758 1.1 christos section_stack = top->next; 1759 1.1 christos previous_section = top->prev_seg; 1760 1.1 christos previous_subsection = top->prev_subseg; 1761 1.1 christos subseg_set (top->seg, top->subseg); 1762 1.1 christos free (top); 1763 1.1 christos 1764 1.1 christos #ifdef md_elf_section_change_hook 1765 1.1 christos md_elf_section_change_hook (); 1766 1.1 christos #endif 1767 1.1 christos } 1768 1.1 christos 1769 1.1 christos static void 1770 1.1 christos obj_elf_line (int ignore ATTRIBUTE_UNUSED) 1771 1.1 christos { 1772 1.1 christos /* Assume delimiter is part of expression. BSD4.2 as fails with 1773 1.1 christos delightful bug, so we are not being incompatible here. */ 1774 1.1 christos new_logical_line (NULL, get_absolute_expression ()); 1775 1.1 christos demand_empty_rest_of_line (); 1776 1.1 christos } 1777 1.1 christos 1778 1.8 christos static struct elf_versioned_name_list * 1779 1.8 christos obj_elf_find_and_add_versioned_name (const char *version_name, 1780 1.8 christos const char *sym_name, 1781 1.8 christos const char *ver, 1782 1.8 christos struct elf_obj_sy *sy_obj) 1783 1.8 christos { 1784 1.8 christos struct elf_versioned_name_list *versioned_name; 1785 1.8 christos const char *p; 1786 1.8 christos 1787 1.8 christos for (p = ver + 1; *p == ELF_VER_CHR; p++) 1788 1.8 christos ; 1789 1.8 christos 1790 1.8 christos /* NB: Since some tests in ld/testsuite/ld-elfvers have no version 1791 1.8 christos names, we have to disable this. */ 1792 1.8 christos if (0 && *p == '\0') 1793 1.8 christos { 1794 1.8 christos as_bad (_("missing version name in `%s' for symbol `%s'"), 1795 1.8 christos version_name, sym_name); 1796 1.8 christos return NULL; 1797 1.8 christos } 1798 1.8 christos 1799 1.8 christos versioned_name = sy_obj->versioned_name; 1800 1.8 christos 1801 1.8 christos switch (p - ver) 1802 1.8 christos { 1803 1.8 christos case 1: 1804 1.8 christos case 2: 1805 1.8 christos break; 1806 1.8 christos case 3: 1807 1.8 christos if (sy_obj->rename) 1808 1.8 christos { 1809 1.8 christos if (strcmp (versioned_name->name, version_name) == 0) 1810 1.8 christos return versioned_name; 1811 1.8 christos else 1812 1.8 christos { 1813 1.8 christos as_bad (_("only one version name with `@@@' is allowed " 1814 1.8 christos "for symbol `%s'"), sym_name); 1815 1.8 christos return NULL; 1816 1.8 christos } 1817 1.8 christos } 1818 1.8 christos sy_obj->rename = true; 1819 1.8 christos break; 1820 1.8 christos default: 1821 1.8 christos as_bad (_("invalid version name '%s' for symbol `%s'"), 1822 1.8 christos version_name, sym_name); 1823 1.8 christos return NULL; 1824 1.8 christos } 1825 1.8 christos 1826 1.8 christos for (; 1827 1.8 christos versioned_name != NULL; 1828 1.8 christos versioned_name = versioned_name->next) 1829 1.8 christos if (strcmp (versioned_name->name, version_name) == 0) 1830 1.8 christos return versioned_name; 1831 1.8 christos 1832 1.8 christos /* Add this versioned name to the head of the list, */ 1833 1.10 christos versioned_name = notes_alloc (sizeof (*versioned_name)); 1834 1.10 christos versioned_name->name = notes_strdup (version_name); 1835 1.8 christos versioned_name->next = sy_obj->versioned_name; 1836 1.8 christos sy_obj->versioned_name = versioned_name; 1837 1.8 christos 1838 1.8 christos return versioned_name; 1839 1.8 christos } 1840 1.8 christos 1841 1.1 christos /* This handles the .symver pseudo-op, which is used to specify a 1842 1.1 christos symbol version. The syntax is ``.symver NAME,SYMVERNAME''. 1843 1.1 christos SYMVERNAME may contain ELF_VER_CHR ('@') characters. This 1844 1.1 christos pseudo-op causes the assembler to emit a symbol named SYMVERNAME 1845 1.1 christos with the same value as the symbol NAME. */ 1846 1.1 christos 1847 1.1 christos static void 1848 1.1 christos obj_elf_symver (int ignore ATTRIBUTE_UNUSED) 1849 1.1 christos { 1850 1.1 christos char *name; 1851 1.8 christos const char *sym_name; 1852 1.1 christos char c; 1853 1.1 christos char old_lexat; 1854 1.1 christos symbolS *sym; 1855 1.8 christos struct elf_obj_sy *sy_obj; 1856 1.8 christos char *p; 1857 1.1 christos 1858 1.1 christos sym = get_sym_from_input_line_and_check (); 1859 1.1 christos 1860 1.1 christos if (*input_line_pointer != ',') 1861 1.1 christos { 1862 1.1 christos as_bad (_("expected comma after name in .symver")); 1863 1.1 christos ignore_rest_of_line (); 1864 1.1 christos return; 1865 1.1 christos } 1866 1.1 christos 1867 1.1 christos ++input_line_pointer; 1868 1.1 christos SKIP_WHITESPACE (); 1869 1.1 christos 1870 1.1 christos /* Temporarily include '@' in symbol names. */ 1871 1.1 christos old_lexat = lex_type[(unsigned char) '@']; 1872 1.1 christos lex_type[(unsigned char) '@'] |= LEX_NAME; 1873 1.3 christos c = get_symbol_name (& name); 1874 1.1 christos lex_type[(unsigned char) '@'] = old_lexat; 1875 1.8 christos sym_name = S_GET_NAME (sym); 1876 1.1 christos 1877 1.6 christos if (S_IS_COMMON (sym)) 1878 1.6 christos { 1879 1.6 christos as_bad (_("`%s' can't be versioned to common symbol '%s'"), 1880 1.8 christos name, sym_name); 1881 1.6 christos ignore_rest_of_line (); 1882 1.6 christos return; 1883 1.6 christos } 1884 1.6 christos 1885 1.8 christos p = strchr (name, ELF_VER_CHR); 1886 1.8 christos if (p == NULL) 1887 1.1 christos { 1888 1.8 christos as_bad (_("missing version name in `%s' for symbol `%s'"), 1889 1.8 christos name, sym_name); 1890 1.8 christos ignore_rest_of_line (); 1891 1.8 christos return; 1892 1.8 christos } 1893 1.8 christos 1894 1.8 christos sy_obj = symbol_get_obj (sym); 1895 1.8 christos if (obj_elf_find_and_add_versioned_name (name, sym_name, 1896 1.8 christos p, sy_obj) == NULL) 1897 1.8 christos { 1898 1.8 christos sy_obj->bad_version = true; 1899 1.8 christos ignore_rest_of_line (); 1900 1.8 christos return; 1901 1.8 christos } 1902 1.8 christos 1903 1.8 christos (void) restore_line_pointer (c); 1904 1.1 christos 1905 1.8 christos if (*input_line_pointer == ',') 1906 1.8 christos { 1907 1.8 christos char *save = input_line_pointer; 1908 1.1 christos 1909 1.8 christos ++input_line_pointer; 1910 1.8 christos SKIP_WHITESPACE (); 1911 1.8 christos if (startswith (input_line_pointer, "local")) 1912 1.1 christos { 1913 1.8 christos input_line_pointer += 5; 1914 1.8 christos sy_obj->visibility = visibility_local; 1915 1.8 christos } 1916 1.8 christos else if (startswith (input_line_pointer, "hidden")) 1917 1.8 christos { 1918 1.8 christos input_line_pointer += 6; 1919 1.8 christos sy_obj->visibility = visibility_hidden; 1920 1.1 christos } 1921 1.8 christos else if (startswith (input_line_pointer, "remove")) 1922 1.1 christos { 1923 1.8 christos input_line_pointer += 6; 1924 1.8 christos sy_obj->visibility = visibility_remove; 1925 1.1 christos } 1926 1.8 christos else 1927 1.8 christos input_line_pointer = save; 1928 1.1 christos } 1929 1.1 christos 1930 1.1 christos demand_empty_rest_of_line (); 1931 1.1 christos } 1932 1.1 christos 1933 1.1 christos /* This handles the .vtable_inherit pseudo-op, which is used to indicate 1934 1.1 christos to the linker the hierarchy in which a particular table resides. The 1935 1.1 christos syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */ 1936 1.1 christos 1937 1.1 christos struct fix * 1938 1.6 christos obj_elf_get_vtable_inherit (void) 1939 1.1 christos { 1940 1.1 christos char *cname, *pname; 1941 1.1 christos symbolS *csym, *psym; 1942 1.1 christos char c, bad = 0; 1943 1.1 christos 1944 1.1 christos if (*input_line_pointer == '#') 1945 1.1 christos ++input_line_pointer; 1946 1.1 christos 1947 1.3 christos c = get_symbol_name (& cname); 1948 1.1 christos csym = symbol_find (cname); 1949 1.1 christos 1950 1.1 christos /* GCFIXME: should check that we don't have two .vtable_inherits for 1951 1.1 christos the same child symbol. Also, we can currently only do this if the 1952 1.1 christos child symbol is already exists and is placed in a fragment. */ 1953 1.1 christos 1954 1.1 christos if (csym == NULL || symbol_get_frag (csym) == NULL) 1955 1.1 christos { 1956 1.1 christos as_bad (_("expected `%s' to have already been set for .vtable_inherit"), 1957 1.1 christos cname); 1958 1.1 christos bad = 1; 1959 1.1 christos } 1960 1.1 christos 1961 1.10 christos restore_line_pointer (c); 1962 1.1 christos 1963 1.10 christos SKIP_WHITESPACE (); 1964 1.1 christos if (*input_line_pointer != ',') 1965 1.1 christos { 1966 1.1 christos as_bad (_("expected comma after name in .vtable_inherit")); 1967 1.1 christos ignore_rest_of_line (); 1968 1.1 christos return NULL; 1969 1.1 christos } 1970 1.1 christos 1971 1.1 christos ++input_line_pointer; 1972 1.1 christos SKIP_WHITESPACE (); 1973 1.1 christos 1974 1.1 christos if (*input_line_pointer == '#') 1975 1.1 christos ++input_line_pointer; 1976 1.1 christos 1977 1.1 christos if (input_line_pointer[0] == '0' 1978 1.10 christos && (is_end_of_stmt (input_line_pointer[1]) 1979 1.10 christos || is_whitespace (input_line_pointer[1]))) 1980 1.1 christos { 1981 1.1 christos psym = section_symbol (absolute_section); 1982 1.1 christos ++input_line_pointer; 1983 1.1 christos } 1984 1.1 christos else 1985 1.1 christos { 1986 1.3 christos c = get_symbol_name (& pname); 1987 1.1 christos psym = symbol_find_or_make (pname); 1988 1.3 christos restore_line_pointer (c); 1989 1.1 christos } 1990 1.1 christos 1991 1.1 christos demand_empty_rest_of_line (); 1992 1.1 christos 1993 1.1 christos if (bad) 1994 1.1 christos return NULL; 1995 1.1 christos 1996 1.1 christos gas_assert (symbol_get_value_expression (csym)->X_op == O_constant); 1997 1.1 christos return fix_new (symbol_get_frag (csym), 1998 1.1 christos symbol_get_value_expression (csym)->X_add_number, 1999 1.1 christos 0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT); 2000 1.1 christos } 2001 1.1 christos 2002 1.6 christos /* This is a version of obj_elf_get_vtable_inherit() that is 2003 1.6 christos suitable for use in struct _pseudo_type tables. */ 2004 1.6 christos 2005 1.6 christos void 2006 1.6 christos obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED) 2007 1.6 christos { 2008 1.6 christos (void) obj_elf_get_vtable_inherit (); 2009 1.6 christos } 2010 1.6 christos 2011 1.1 christos /* This handles the .vtable_entry pseudo-op, which is used to indicate 2012 1.1 christos to the linker that a vtable slot was used. The syntax is 2013 1.1 christos ".vtable_entry tablename, offset". */ 2014 1.1 christos 2015 1.1 christos struct fix * 2016 1.6 christos obj_elf_get_vtable_entry (void) 2017 1.1 christos { 2018 1.1 christos symbolS *sym; 2019 1.1 christos offsetT offset; 2020 1.1 christos 2021 1.1 christos if (*input_line_pointer == '#') 2022 1.1 christos ++input_line_pointer; 2023 1.1 christos 2024 1.1 christos sym = get_sym_from_input_line_and_check (); 2025 1.1 christos if (*input_line_pointer != ',') 2026 1.1 christos { 2027 1.1 christos as_bad (_("expected comma after name in .vtable_entry")); 2028 1.1 christos ignore_rest_of_line (); 2029 1.1 christos return NULL; 2030 1.1 christos } 2031 1.1 christos 2032 1.1 christos ++input_line_pointer; 2033 1.1 christos if (*input_line_pointer == '#') 2034 1.1 christos ++input_line_pointer; 2035 1.1 christos 2036 1.1 christos offset = get_absolute_expression (); 2037 1.1 christos 2038 1.1 christos demand_empty_rest_of_line (); 2039 1.1 christos 2040 1.1 christos return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0, 2041 1.1 christos BFD_RELOC_VTABLE_ENTRY); 2042 1.1 christos } 2043 1.1 christos 2044 1.6 christos /* This is a version of obj_elf_get_vtable_entry() that is 2045 1.6 christos suitable for use in struct _pseudo_type tables. */ 2046 1.6 christos 2047 1.6 christos void 2048 1.6 christos obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED) 2049 1.6 christos { 2050 1.6 christos (void) obj_elf_get_vtable_entry (); 2051 1.6 christos } 2052 1.6 christos 2053 1.10 christos #define skip_whitespace(str) do { if (is_whitespace (*(str))) ++(str); } while (0) 2054 1.3 christos 2055 1.3 christos static inline int 2056 1.3 christos skip_past_char (char ** str, char c) 2057 1.3 christos { 2058 1.3 christos if (**str == c) 2059 1.3 christos { 2060 1.3 christos (*str)++; 2061 1.3 christos return 0; 2062 1.3 christos } 2063 1.3 christos else 2064 1.3 christos return -1; 2065 1.3 christos } 2066 1.3 christos #define skip_past_comma(str) skip_past_char (str, ',') 2067 1.3 christos 2068 1.3 christos /* A list of attributes that have been explicitly set by the assembly code. 2069 1.3 christos VENDOR is the vendor id, BASE is the tag shifted right by the number 2070 1.3 christos of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */ 2071 1.3 christos struct recorded_attribute_info { 2072 1.3 christos struct recorded_attribute_info *next; 2073 1.3 christos int vendor; 2074 1.3 christos unsigned int base; 2075 1.3 christos unsigned long mask; 2076 1.3 christos }; 2077 1.3 christos static struct recorded_attribute_info *recorded_attributes; 2078 1.3 christos 2079 1.3 christos /* Record that we have seen an explicit specification of attribute TAG 2080 1.3 christos for vendor VENDOR. */ 2081 1.3 christos 2082 1.3 christos static void 2083 1.3 christos record_attribute (int vendor, unsigned int tag) 2084 1.3 christos { 2085 1.3 christos unsigned int base; 2086 1.3 christos unsigned long mask; 2087 1.3 christos struct recorded_attribute_info *rai; 2088 1.3 christos 2089 1.3 christos base = tag / (8 * sizeof (rai->mask)); 2090 1.3 christos mask = 1UL << (tag % (8 * sizeof (rai->mask))); 2091 1.3 christos for (rai = recorded_attributes; rai; rai = rai->next) 2092 1.3 christos if (rai->vendor == vendor && rai->base == base) 2093 1.3 christos { 2094 1.3 christos rai->mask |= mask; 2095 1.3 christos return; 2096 1.3 christos } 2097 1.3 christos 2098 1.3 christos rai = XNEW (struct recorded_attribute_info); 2099 1.3 christos rai->next = recorded_attributes; 2100 1.3 christos rai->vendor = vendor; 2101 1.3 christos rai->base = base; 2102 1.3 christos rai->mask = mask; 2103 1.3 christos recorded_attributes = rai; 2104 1.3 christos } 2105 1.3 christos 2106 1.3 christos /* Return true if we have seen an explicit specification of attribute TAG 2107 1.3 christos for vendor VENDOR. */ 2108 1.3 christos 2109 1.8 christos bool 2110 1.3 christos obj_elf_seen_attribute (int vendor, unsigned int tag) 2111 1.3 christos { 2112 1.3 christos unsigned int base; 2113 1.3 christos unsigned long mask; 2114 1.3 christos struct recorded_attribute_info *rai; 2115 1.3 christos 2116 1.3 christos base = tag / (8 * sizeof (rai->mask)); 2117 1.3 christos mask = 1UL << (tag % (8 * sizeof (rai->mask))); 2118 1.3 christos for (rai = recorded_attributes; rai; rai = rai->next) 2119 1.3 christos if (rai->vendor == vendor && rai->base == base) 2120 1.3 christos return (rai->mask & mask) != 0; 2121 1.8 christos return false; 2122 1.3 christos } 2123 1.3 christos 2124 1.3 christos /* Parse an attribute directive for VENDOR. 2125 1.3 christos Returns the attribute number read, or zero on error. */ 2126 1.3 christos 2127 1.3 christos int 2128 1.3 christos obj_elf_vendor_attribute (int vendor) 2129 1.3 christos { 2130 1.3 christos expressionS exp; 2131 1.3 christos int type; 2132 1.3 christos int tag; 2133 1.3 christos unsigned int i = 0; 2134 1.3 christos char *s = NULL; 2135 1.3 christos 2136 1.3 christos /* Read the first number or name. */ 2137 1.3 christos skip_whitespace (input_line_pointer); 2138 1.3 christos s = input_line_pointer; 2139 1.3 christos if (ISDIGIT (*input_line_pointer)) 2140 1.3 christos { 2141 1.3 christos expression (& exp); 2142 1.3 christos if (exp.X_op != O_constant) 2143 1.3 christos goto bad; 2144 1.3 christos tag = exp.X_add_number; 2145 1.3 christos } 2146 1.3 christos else 2147 1.3 christos { 2148 1.3 christos char *name; 2149 1.3 christos 2150 1.3 christos /* A name may contain '_', but no other punctuation. */ 2151 1.3 christos for (; ISALNUM (*input_line_pointer) || *input_line_pointer == '_'; 2152 1.3 christos ++input_line_pointer) 2153 1.3 christos i++; 2154 1.3 christos if (i == 0) 2155 1.3 christos goto bad; 2156 1.3 christos 2157 1.8 christos name = xmemdup0 (s, i); 2158 1.3 christos 2159 1.3 christos #ifndef CONVERT_SYMBOLIC_ATTRIBUTE 2160 1.3 christos #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1 2161 1.3 christos #endif 2162 1.3 christos 2163 1.3 christos tag = CONVERT_SYMBOLIC_ATTRIBUTE (name); 2164 1.3 christos if (tag == -1) 2165 1.3 christos { 2166 1.3 christos as_bad (_("Attribute name not recognised: %s"), name); 2167 1.3 christos ignore_rest_of_line (); 2168 1.5 christos free (name); 2169 1.3 christos return 0; 2170 1.3 christos } 2171 1.5 christos free (name); 2172 1.3 christos } 2173 1.3 christos 2174 1.3 christos type = _bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag); 2175 1.3 christos 2176 1.3 christos if (skip_past_comma (&input_line_pointer) == -1) 2177 1.3 christos goto bad; 2178 1.3 christos if (type & 1) 2179 1.3 christos { 2180 1.3 christos expression (& exp); 2181 1.3 christos if (exp.X_op != O_constant) 2182 1.3 christos { 2183 1.3 christos as_bad (_("expected numeric constant")); 2184 1.3 christos ignore_rest_of_line (); 2185 1.3 christos return 0; 2186 1.3 christos } 2187 1.3 christos i = exp.X_add_number; 2188 1.3 christos } 2189 1.3 christos if ((type & 3) == 3 2190 1.3 christos && skip_past_comma (&input_line_pointer) == -1) 2191 1.3 christos { 2192 1.3 christos as_bad (_("expected comma")); 2193 1.3 christos ignore_rest_of_line (); 2194 1.3 christos return 0; 2195 1.3 christos } 2196 1.3 christos if (type & 2) 2197 1.3 christos { 2198 1.3 christos int len; 2199 1.3 christos 2200 1.3 christos skip_whitespace (input_line_pointer); 2201 1.3 christos if (*input_line_pointer != '"') 2202 1.3 christos goto bad_string; 2203 1.3 christos s = demand_copy_C_string (&len); 2204 1.3 christos } 2205 1.3 christos 2206 1.3 christos record_attribute (vendor, tag); 2207 1.9 christos bool ok = false; 2208 1.3 christos switch (type & 3) 2209 1.3 christos { 2210 1.3 christos case 3: 2211 1.9 christos ok = bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s); 2212 1.3 christos break; 2213 1.3 christos case 2: 2214 1.9 christos ok = bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s); 2215 1.3 christos break; 2216 1.3 christos case 1: 2217 1.9 christos ok = bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i); 2218 1.3 christos break; 2219 1.3 christos default: 2220 1.3 christos abort (); 2221 1.3 christos } 2222 1.9 christos if (!ok) 2223 1.9 christos as_fatal (_("error adding attribute: %s"), 2224 1.9 christos bfd_errmsg (bfd_get_error ())); 2225 1.3 christos 2226 1.3 christos demand_empty_rest_of_line (); 2227 1.3 christos return tag; 2228 1.8 christos bad_string: 2229 1.3 christos as_bad (_("bad string constant")); 2230 1.3 christos ignore_rest_of_line (); 2231 1.3 christos return 0; 2232 1.8 christos bad: 2233 1.3 christos as_bad (_("expected <tag> , <value>")); 2234 1.3 christos ignore_rest_of_line (); 2235 1.3 christos return 0; 2236 1.3 christos } 2237 1.3 christos 2238 1.3 christos /* Parse a .gnu_attribute directive. */ 2239 1.3 christos 2240 1.3 christos static void 2241 1.3 christos obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED) 2242 1.3 christos { 2243 1.3 christos obj_elf_vendor_attribute (OBJ_ATTR_GNU); 2244 1.3 christos } 2245 1.3 christos 2246 1.1 christos void 2247 1.1 christos elf_obj_read_begin_hook (void) 2248 1.1 christos { 2249 1.1 christos #ifdef NEED_ECOFF_DEBUG 2250 1.1 christos if (ECOFF_DEBUGGING) 2251 1.1 christos ecoff_read_begin_hook (); 2252 1.1 christos #endif 2253 1.1 christos } 2254 1.1 christos 2255 1.1 christos void 2256 1.1 christos elf_obj_symbol_new_hook (symbolS *symbolP) 2257 1.1 christos { 2258 1.1 christos struct elf_obj_sy *sy_obj; 2259 1.1 christos 2260 1.1 christos sy_obj = symbol_get_obj (symbolP); 2261 1.1 christos sy_obj->size = NULL; 2262 1.1 christos sy_obj->versioned_name = NULL; 2263 1.1 christos 2264 1.1 christos #ifdef NEED_ECOFF_DEBUG 2265 1.1 christos if (ECOFF_DEBUGGING) 2266 1.1 christos ecoff_symbol_new_hook (symbolP); 2267 1.1 christos #endif 2268 1.1 christos } 2269 1.1 christos 2270 1.10 christos /* If size is unset, copy size from src. Because we don't track whether 2271 1.10 christos .size has been used, we can't differentiate .size dest, 0 from the case 2272 1.10 christos where dest's size is unset. */ 2273 1.8 christos void 2274 1.10 christos elf_copy_symbol_size (symbolS *dest, symbolS *src) 2275 1.8 christos { 2276 1.10 christos struct elf_obj_sy *srcelf = symbol_get_obj (src); 2277 1.10 christos struct elf_obj_sy *destelf = symbol_get_obj (dest); 2278 1.10 christos if (!destelf->size && S_GET_SIZE (dest) == 0) 2279 1.8 christos { 2280 1.10 christos destelf->size = srcelf->size; 2281 1.10 christos S_SET_SIZE (dest, S_GET_SIZE (src)); 2282 1.8 christos } 2283 1.8 christos } 2284 1.1 christos 2285 1.1 christos void 2286 1.1 christos elf_copy_symbol_attributes (symbolS *dest, symbolS *src) 2287 1.1 christos { 2288 1.10 christos elf_copy_symbol_size (dest, src); 2289 1.1 christos /* Don't copy visibility. */ 2290 1.1 christos S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest)) 2291 1.1 christos | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1)))); 2292 1.1 christos } 2293 1.1 christos 2294 1.1 christos void 2295 1.1 christos obj_elf_version (int ignore ATTRIBUTE_UNUSED) 2296 1.1 christos { 2297 1.1 christos char *name; 2298 1.1 christos unsigned int c; 2299 1.1 christos char *p; 2300 1.1 christos asection *seg = now_seg; 2301 1.1 christos subsegT subseg = now_subseg; 2302 1.1 christos Elf_Internal_Note i_note; 2303 1.1 christos Elf_External_Note e_note; 2304 1.1 christos asection *note_secp = NULL; 2305 1.1 christos 2306 1.1 christos SKIP_WHITESPACE (); 2307 1.1 christos if (*input_line_pointer == '\"') 2308 1.1 christos { 2309 1.1 christos unsigned int len; 2310 1.1 christos 2311 1.1 christos ++input_line_pointer; /* -> 1st char of string. */ 2312 1.1 christos name = input_line_pointer; 2313 1.1 christos 2314 1.1 christos while (is_a_char (c = next_char_of_string ())) 2315 1.1 christos ; 2316 1.1 christos c = *input_line_pointer; 2317 1.1 christos *input_line_pointer = '\0'; 2318 1.1 christos *(input_line_pointer - 1) = '\0'; 2319 1.1 christos *input_line_pointer = c; 2320 1.1 christos 2321 1.1 christos /* Create the .note section. */ 2322 1.1 christos note_secp = subseg_new (".note", 0); 2323 1.7 christos bfd_set_section_flags (note_secp, SEC_HAS_CONTENTS | SEC_READONLY); 2324 1.6 christos record_alignment (note_secp, 2); 2325 1.1 christos 2326 1.1 christos /* Process the version string. */ 2327 1.1 christos len = strlen (name) + 1; 2328 1.1 christos 2329 1.1 christos /* PR 3456: Although the name field is padded out to an 4-byte 2330 1.1 christos boundary, the namesz field should not be adjusted. */ 2331 1.1 christos i_note.namesz = len; 2332 1.1 christos i_note.descsz = 0; /* No description. */ 2333 1.1 christos i_note.type = NT_VERSION; 2334 1.1 christos p = frag_more (sizeof (e_note.namesz)); 2335 1.1 christos md_number_to_chars (p, i_note.namesz, sizeof (e_note.namesz)); 2336 1.1 christos p = frag_more (sizeof (e_note.descsz)); 2337 1.1 christos md_number_to_chars (p, i_note.descsz, sizeof (e_note.descsz)); 2338 1.1 christos p = frag_more (sizeof (e_note.type)); 2339 1.1 christos md_number_to_chars (p, i_note.type, sizeof (e_note.type)); 2340 1.1 christos p = frag_more (len); 2341 1.1 christos memcpy (p, name, len); 2342 1.1 christos 2343 1.1 christos frag_align (2, 0, 0); 2344 1.1 christos 2345 1.1 christos subseg_set (seg, subseg); 2346 1.1 christos } 2347 1.1 christos else 2348 1.1 christos as_bad (_("expected quoted string")); 2349 1.1 christos 2350 1.1 christos demand_empty_rest_of_line (); 2351 1.1 christos } 2352 1.1 christos 2353 1.1 christos static void 2354 1.1 christos obj_elf_size (int ignore ATTRIBUTE_UNUSED) 2355 1.1 christos { 2356 1.3 christos char *name; 2357 1.3 christos char c = get_symbol_name (&name); 2358 1.1 christos char *p; 2359 1.1 christos expressionS exp; 2360 1.1 christos symbolS *sym; 2361 1.1 christos 2362 1.1 christos p = input_line_pointer; 2363 1.10 christos restore_line_pointer (c); 2364 1.10 christos SKIP_WHITESPACE (); 2365 1.1 christos if (*input_line_pointer != ',') 2366 1.1 christos { 2367 1.1 christos *p = 0; 2368 1.1 christos as_bad (_("expected comma after name `%s' in .size directive"), name); 2369 1.1 christos *p = c; 2370 1.1 christos ignore_rest_of_line (); 2371 1.1 christos return; 2372 1.1 christos } 2373 1.1 christos input_line_pointer++; 2374 1.1 christos expression (&exp); 2375 1.1 christos if (exp.X_op == O_absent) 2376 1.1 christos { 2377 1.1 christos as_bad (_("missing expression in .size directive")); 2378 1.1 christos exp.X_op = O_constant; 2379 1.1 christos exp.X_add_number = 0; 2380 1.1 christos } 2381 1.1 christos *p = 0; 2382 1.1 christos sym = symbol_find_or_make (name); 2383 1.1 christos *p = c; 2384 1.1 christos if (exp.X_op == O_constant) 2385 1.1 christos { 2386 1.1 christos S_SET_SIZE (sym, exp.X_add_number); 2387 1.8 christos symbol_get_obj (sym)->size = NULL; 2388 1.1 christos } 2389 1.1 christos else 2390 1.1 christos { 2391 1.10 christos symbol_get_obj (sym)->size = notes_alloc (sizeof (exp)); 2392 1.1 christos *symbol_get_obj (sym)->size = exp; 2393 1.1 christos } 2394 1.9 christos 2395 1.9 christos /* If the symbol in the directive matches the current function being 2396 1.9 christos processed, indicate end of the current stream of ginsns. */ 2397 1.9 christos if (flag_synth_cfi 2398 1.9 christos && S_IS_FUNCTION (sym) && sym == ginsn_data_func_symbol ()) 2399 1.9 christos ginsn_data_end (symbol_temp_new_now ()); 2400 1.9 christos 2401 1.1 christos demand_empty_rest_of_line (); 2402 1.1 christos } 2403 1.1 christos 2404 1.1 christos /* Handle the ELF .type pseudo-op. This sets the type of a symbol. 2405 1.1 christos There are six syntaxes: 2406 1.1 christos 2407 1.1 christos The first (used on Solaris) is 2408 1.1 christos .type SYM,#function 2409 1.1 christos The second (used on UnixWare) is 2410 1.1 christos .type SYM,@function 2411 1.1 christos The third (reportedly to be used on Irix 6.0) is 2412 1.1 christos .type SYM STT_FUNC 2413 1.1 christos The fourth (used on NetBSD/Arm and Linux/ARM) is 2414 1.1 christos .type SYM,%function 2415 1.1 christos The fifth (used on SVR4/860) is 2416 1.1 christos .type SYM,"function" 2417 1.1 christos The sixth (emitted by recent SunPRO under Solaris) is 2418 1.1 christos .type SYM,[0-9] 2419 1.1 christos where the integer is the STT_* value. 2420 1.1 christos */ 2421 1.1 christos 2422 1.1 christos static char * 2423 1.1 christos obj_elf_type_name (char *cp) 2424 1.1 christos { 2425 1.1 christos char *p; 2426 1.1 christos 2427 1.1 christos p = input_line_pointer; 2428 1.1 christos if (*input_line_pointer >= '0' 2429 1.1 christos && *input_line_pointer <= '9') 2430 1.1 christos { 2431 1.1 christos while (*input_line_pointer >= '0' 2432 1.1 christos && *input_line_pointer <= '9') 2433 1.1 christos ++input_line_pointer; 2434 1.1 christos *cp = *input_line_pointer; 2435 1.1 christos *input_line_pointer = '\0'; 2436 1.1 christos } 2437 1.1 christos else 2438 1.3 christos *cp = get_symbol_name (&p); 2439 1.1 christos 2440 1.1 christos return p; 2441 1.1 christos } 2442 1.1 christos 2443 1.1 christos static void 2444 1.1 christos obj_elf_type (int ignore ATTRIBUTE_UNUSED) 2445 1.1 christos { 2446 1.1 christos char c; 2447 1.1 christos int type; 2448 1.1 christos const char *type_name; 2449 1.1 christos symbolS *sym; 2450 1.1 christos elf_symbol_type *elfsym; 2451 1.1 christos 2452 1.1 christos sym = get_sym_from_input_line_and_check (); 2453 1.1 christos c = *input_line_pointer; 2454 1.1 christos elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym); 2455 1.1 christos 2456 1.1 christos if (*input_line_pointer == ',') 2457 1.1 christos ++input_line_pointer; 2458 1.1 christos 2459 1.1 christos SKIP_WHITESPACE (); 2460 1.1 christos if ( *input_line_pointer == '#' 2461 1.1 christos || *input_line_pointer == '@' 2462 1.1 christos || *input_line_pointer == '"' 2463 1.1 christos || *input_line_pointer == '%') 2464 1.1 christos ++input_line_pointer; 2465 1.1 christos 2466 1.1 christos type_name = obj_elf_type_name (& c); 2467 1.1 christos 2468 1.1 christos type = 0; 2469 1.1 christos if (strcmp (type_name, "function") == 0 2470 1.1 christos || strcmp (type_name, "2") == 0 2471 1.1 christos || strcmp (type_name, "STT_FUNC") == 0) 2472 1.1 christos type = BSF_FUNCTION; 2473 1.1 christos else if (strcmp (type_name, "object") == 0 2474 1.1 christos || strcmp (type_name, "1") == 0 2475 1.1 christos || strcmp (type_name, "STT_OBJECT") == 0) 2476 1.1 christos type = BSF_OBJECT; 2477 1.1 christos else if (strcmp (type_name, "tls_object") == 0 2478 1.1 christos || strcmp (type_name, "6") == 0 2479 1.1 christos || strcmp (type_name, "STT_TLS") == 0) 2480 1.1 christos type = BSF_OBJECT | BSF_THREAD_LOCAL; 2481 1.1 christos else if (strcmp (type_name, "notype") == 0 2482 1.1 christos || strcmp (type_name, "0") == 0 2483 1.1 christos || strcmp (type_name, "STT_NOTYPE") == 0) 2484 1.1 christos ; 2485 1.1 christos else if (strcmp (type_name, "common") == 0 2486 1.1 christos || strcmp (type_name, "5") == 0 2487 1.1 christos || strcmp (type_name, "STT_COMMON") == 0) 2488 1.1 christos { 2489 1.1 christos type = BSF_OBJECT; 2490 1.1 christos 2491 1.1 christos if (! S_IS_COMMON (sym)) 2492 1.1 christos { 2493 1.1 christos if (S_IS_VOLATILE (sym)) 2494 1.1 christos { 2495 1.1 christos sym = symbol_clone (sym, 1); 2496 1.1 christos S_SET_SEGMENT (sym, bfd_com_section_ptr); 2497 1.1 christos S_SET_VALUE (sym, 0); 2498 1.1 christos S_SET_EXTERNAL (sym); 2499 1.1 christos symbol_set_frag (sym, &zero_address_frag); 2500 1.1 christos S_CLEAR_VOLATILE (sym); 2501 1.1 christos } 2502 1.1 christos else if (S_IS_DEFINED (sym) || symbol_equated_p (sym)) 2503 1.1 christos as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym)); 2504 1.1 christos else 2505 1.1 christos { 2506 1.1 christos /* FIXME: Is it safe to just change the section ? */ 2507 1.1 christos S_SET_SEGMENT (sym, bfd_com_section_ptr); 2508 1.1 christos S_SET_VALUE (sym, 0); 2509 1.1 christos S_SET_EXTERNAL (sym); 2510 1.1 christos } 2511 1.1 christos } 2512 1.1 christos } 2513 1.1 christos else if (strcmp (type_name, "gnu_indirect_function") == 0 2514 1.1 christos || strcmp (type_name, "10") == 0 2515 1.1 christos || strcmp (type_name, "STT_GNU_IFUNC") == 0) 2516 1.1 christos { 2517 1.8 christos const struct elf_backend_data *bed; 2518 1.1 christos 2519 1.8 christos bed = get_elf_backend_data (stdoutput); 2520 1.8 christos if (bed->elf_osabi != ELFOSABI_NONE 2521 1.8 christos && bed->elf_osabi != ELFOSABI_GNU 2522 1.8 christos && bed->elf_osabi != ELFOSABI_FREEBSD) 2523 1.7 christos as_bad (_("symbol type \"%s\" is supported only by GNU " 2524 1.7 christos "and FreeBSD targets"), type_name); 2525 1.8 christos #if 0 2526 1.8 christos /* MIPS targets do not support IFUNCS. */ 2527 1.8 christos else if (bed->target_id == MIPS_ELF_DATA) 2528 1.8 christos as_bad (_("symbol type \"%s\" is not supported by " 2529 1.8 christos "MIPS targets"), type_name); 2530 1.1 christos #endif 2531 1.7 christos elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_ifunc; 2532 1.1 christos type = BSF_FUNCTION | BSF_GNU_INDIRECT_FUNCTION; 2533 1.1 christos } 2534 1.1 christos else if (strcmp (type_name, "gnu_unique_object") == 0) 2535 1.1 christos { 2536 1.8 christos const struct elf_backend_data *bed; 2537 1.1 christos 2538 1.8 christos bed = get_elf_backend_data (stdoutput); 2539 1.8 christos if (bed->elf_osabi != ELFOSABI_NONE 2540 1.8 christos && bed->elf_osabi != ELFOSABI_GNU) 2541 1.1 christos as_bad (_("symbol type \"%s\" is supported only by GNU targets"), 2542 1.1 christos type_name); 2543 1.7 christos elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_unique; 2544 1.1 christos type = BSF_OBJECT | BSF_GNU_UNIQUE; 2545 1.1 christos } 2546 1.1 christos #ifdef md_elf_symbol_type 2547 1.1 christos else if ((type = md_elf_symbol_type (type_name, sym, elfsym)) != -1) 2548 1.1 christos ; 2549 1.1 christos #endif 2550 1.1 christos else 2551 1.1 christos as_bad (_("unrecognized symbol type \"%s\""), type_name); 2552 1.1 christos 2553 1.1 christos *input_line_pointer = c; 2554 1.1 christos 2555 1.1 christos if (*input_line_pointer == '"') 2556 1.1 christos ++input_line_pointer; 2557 1.1 christos 2558 1.7 christos #ifdef md_elf_symbol_type_change 2559 1.7 christos if (!md_elf_symbol_type_change (sym, elfsym, type)) 2560 1.7 christos #endif 2561 1.7 christos { 2562 1.7 christos flagword mask = BSF_FUNCTION | BSF_OBJECT; 2563 1.7 christos 2564 1.7 christos if (type != BSF_FUNCTION) 2565 1.7 christos mask |= BSF_GNU_INDIRECT_FUNCTION; 2566 1.7 christos if (type != BSF_OBJECT) 2567 1.7 christos { 2568 1.7 christos mask |= BSF_GNU_UNIQUE | BSF_THREAD_LOCAL; 2569 1.7 christos 2570 1.7 christos if (S_IS_COMMON (sym)) 2571 1.7 christos { 2572 1.7 christos as_bad (_("cannot change type of common symbol '%s'"), 2573 1.7 christos S_GET_NAME (sym)); 2574 1.7 christos mask = type = 0; 2575 1.7 christos } 2576 1.7 christos } 2577 1.7 christos 2578 1.7 christos /* Don't warn when changing to STT_NOTYPE. */ 2579 1.7 christos if (type) 2580 1.7 christos { 2581 1.7 christos flagword new = (elfsym->symbol.flags & ~mask) | type; 2582 1.7 christos 2583 1.7 christos if (new != (elfsym->symbol.flags | type)) 2584 1.7 christos as_warn (_("symbol '%s' already has its type set"), S_GET_NAME (sym)); 2585 1.7 christos elfsym->symbol.flags = new; 2586 1.7 christos } 2587 1.7 christos else 2588 1.7 christos elfsym->symbol.flags &= ~mask; 2589 1.7 christos } 2590 1.1 christos 2591 1.9 christos if (S_IS_FUNCTION (sym) && flag_synth_cfi) 2592 1.9 christos { 2593 1.9 christos /* When using SCFI, .type directive indicates start of a new FDE for SCFI 2594 1.9 christos processing. So, we must first demarcate the previous block of ginsns, 2595 1.9 christos if any, to mark the end of a previous FDE. */ 2596 1.9 christos if (frchain_now->frch_ginsn_data) 2597 1.9 christos ginsn_data_end (symbol_temp_new_now ()); 2598 1.9 christos ginsn_data_begin (sym); 2599 1.9 christos } 2600 1.9 christos 2601 1.1 christos demand_empty_rest_of_line (); 2602 1.1 christos } 2603 1.1 christos 2604 1.9 christos static segT comment_section; 2605 1.9 christos 2606 1.1 christos static void 2607 1.1 christos obj_elf_ident (int ignore ATTRIBUTE_UNUSED) 2608 1.1 christos { 2609 1.1 christos segT old_section = now_seg; 2610 1.1 christos int old_subsection = now_subseg; 2611 1.1 christos 2612 1.1 christos #ifdef md_flush_pending_output 2613 1.1 christos md_flush_pending_output (); 2614 1.1 christos #endif 2615 1.1 christos 2616 1.1 christos if (!comment_section) 2617 1.1 christos { 2618 1.1 christos char *p; 2619 1.1 christos comment_section = subseg_new (".comment", 0); 2620 1.7 christos bfd_set_section_flags (comment_section, (SEC_READONLY | SEC_HAS_CONTENTS 2621 1.7 christos | SEC_MERGE | SEC_STRINGS)); 2622 1.1 christos comment_section->entsize = 1; 2623 1.1 christos #ifdef md_elf_section_change_hook 2624 1.1 christos md_elf_section_change_hook (); 2625 1.1 christos #endif 2626 1.1 christos p = frag_more (1); 2627 1.1 christos *p = 0; 2628 1.1 christos } 2629 1.1 christos else 2630 1.9 christos { 2631 1.9 christos subseg_set (comment_section, 0); 2632 1.9 christos #ifdef md_elf_section_change_hook 2633 1.9 christos md_elf_section_change_hook (); 2634 1.9 christos #endif 2635 1.9 christos } 2636 1.1 christos stringer (8 + 1); 2637 1.1 christos subseg_set (old_section, old_subsection); 2638 1.9 christos #ifdef md_elf_section_change_hook 2639 1.9 christos md_elf_section_change_hook (); 2640 1.9 christos #endif 2641 1.1 christos } 2642 1.1 christos 2643 1.1 christos #ifdef INIT_STAB_SECTION 2644 1.1 christos 2645 1.1 christos /* The first entry in a .stabs section is special. */ 2646 1.1 christos 2647 1.1 christos void 2648 1.9 christos obj_elf_init_stab_section (segT stab, segT stabstr) 2649 1.1 christos { 2650 1.8 christos char *file; 2651 1.1 christos char *p; 2652 1.1 christos unsigned int stroff; 2653 1.1 christos 2654 1.1 christos /* Force the section to align to a longword boundary. Without this, 2655 1.1 christos UnixWare ar crashes. */ 2656 1.9 christos bfd_set_section_alignment (stab, 2); 2657 1.1 christos 2658 1.1 christos /* Make space for this first symbol. */ 2659 1.1 christos p = frag_more (12); 2660 1.1 christos /* Zero it out. */ 2661 1.1 christos memset (p, 0, 12); 2662 1.8 christos file = remap_debug_filename (as_where (NULL)); 2663 1.9 christos stroff = get_stab_string_offset (file, stabstr); 2664 1.1 christos know (stroff == 1 || (stroff == 0 && file[0] == '\0')); 2665 1.1 christos md_number_to_chars (p, stroff, 4); 2666 1.9 christos seg_info (stab)->stabu.p = p; 2667 1.8 christos free (file); 2668 1.1 christos } 2669 1.1 christos 2670 1.1 christos #endif 2671 1.1 christos 2672 1.10 christos /* Called via bfd_map_over_sections. If SEC's linked_to_symbol_name 2673 1.10 christos isn't NULL, set up its linked-to section. 2674 1.10 christos For .stabs section, fill in the counts in the first entry. */ 2675 1.1 christos 2676 1.1 christos static void 2677 1.10 christos set_additional_section_info (bfd *abfd, 2678 1.10 christos asection *sec, 2679 1.10 christos void *inf ATTRIBUTE_UNUSED) 2680 1.1 christos { 2681 1.10 christos if (sec->map_head.linked_to_symbol_name) 2682 1.10 christos { 2683 1.10 christos symbolS *linked_to_sym; 2684 1.10 christos linked_to_sym = symbol_find (sec->map_head.linked_to_symbol_name); 2685 1.10 christos if (!linked_to_sym || !S_IS_DEFINED (linked_to_sym)) 2686 1.10 christos as_bad (_("undefined linked-to symbol `%s' on section `%s'"), 2687 1.10 christos sec->map_head.linked_to_symbol_name, 2688 1.10 christos bfd_section_name (sec)); 2689 1.10 christos else 2690 1.10 christos elf_linked_to_section (sec) = S_GET_SEGMENT (linked_to_sym); 2691 1.10 christos } 2692 1.10 christos 2693 1.1 christos char *name; 2694 1.1 christos asection *strsec; 2695 1.1 christos char *p; 2696 1.1 christos int strsz, nsyms; 2697 1.1 christos 2698 1.8 christos if (!startswith (sec->name, ".stab")) 2699 1.1 christos return; 2700 1.1 christos if (!strcmp ("str", sec->name + strlen (sec->name) - 3)) 2701 1.1 christos return; 2702 1.1 christos 2703 1.10 christos name = concat (sec->name, "str", (const char *) NULL); 2704 1.1 christos strsec = bfd_get_section_by_name (abfd, name); 2705 1.1 christos if (strsec) 2706 1.7 christos strsz = bfd_section_size (strsec); 2707 1.1 christos else 2708 1.1 christos strsz = 0; 2709 1.7 christos nsyms = bfd_section_size (sec) / 12 - 1; 2710 1.1 christos 2711 1.1 christos p = seg_info (sec)->stabu.p; 2712 1.1 christos gas_assert (p != 0); 2713 1.1 christos 2714 1.1 christos bfd_h_put_16 (abfd, nsyms, p + 6); 2715 1.1 christos bfd_h_put_32 (abfd, strsz, p + 8); 2716 1.5 christos free (name); 2717 1.1 christos } 2718 1.1 christos 2719 1.1 christos #ifdef NEED_ECOFF_DEBUG 2720 1.1 christos 2721 1.1 christos /* This function is called by the ECOFF code. It is supposed to 2722 1.1 christos record the external symbol information so that the backend can 2723 1.1 christos write it out correctly. The ELF backend doesn't actually handle 2724 1.1 christos this at the moment, so we do it ourselves. We save the information 2725 1.1 christos in the symbol. */ 2726 1.1 christos 2727 1.1 christos #ifdef OBJ_MAYBE_ELF 2728 1.1 christos static 2729 1.1 christos #endif 2730 1.1 christos void 2731 1.1 christos elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext) 2732 1.1 christos { 2733 1.1 christos symbol_get_bfdsym (sym)->udata.p = ext; 2734 1.1 christos } 2735 1.1 christos 2736 1.1 christos /* This function is called by bfd_ecoff_debug_externals. It is 2737 1.1 christos supposed to *EXT to the external symbol information, and return 2738 1.1 christos whether the symbol should be used at all. */ 2739 1.1 christos 2740 1.8 christos static bool 2741 1.1 christos elf_get_extr (asymbol *sym, EXTR *ext) 2742 1.1 christos { 2743 1.1 christos if (sym->udata.p == NULL) 2744 1.8 christos return false; 2745 1.1 christos *ext = *(EXTR *) sym->udata.p; 2746 1.8 christos return true; 2747 1.1 christos } 2748 1.1 christos 2749 1.1 christos /* This function is called by bfd_ecoff_debug_externals. It has 2750 1.1 christos nothing to do for ELF. */ 2751 1.1 christos 2752 1.1 christos static void 2753 1.1 christos elf_set_index (asymbol *sym ATTRIBUTE_UNUSED, 2754 1.1 christos bfd_size_type indx ATTRIBUTE_UNUSED) 2755 1.1 christos { 2756 1.1 christos } 2757 1.1 christos 2758 1.1 christos #endif /* NEED_ECOFF_DEBUG */ 2759 1.1 christos 2760 1.1 christos void 2761 1.1 christos elf_frob_symbol (symbolS *symp, int *puntp) 2762 1.1 christos { 2763 1.1 christos struct elf_obj_sy *sy_obj; 2764 1.1 christos expressionS *size; 2765 1.8 christos struct elf_versioned_name_list *versioned_name; 2766 1.1 christos 2767 1.1 christos #ifdef NEED_ECOFF_DEBUG 2768 1.1 christos if (ECOFF_DEBUGGING) 2769 1.1 christos ecoff_frob_symbol (symp); 2770 1.1 christos #endif 2771 1.1 christos 2772 1.1 christos sy_obj = symbol_get_obj (symp); 2773 1.1 christos 2774 1.1 christos size = sy_obj->size; 2775 1.1 christos if (size != NULL) 2776 1.1 christos { 2777 1.1 christos if (resolve_expression (size) 2778 1.1 christos && size->X_op == O_constant) 2779 1.1 christos S_SET_SIZE (symp, size->X_add_number); 2780 1.1 christos else 2781 1.1 christos { 2782 1.5 christos if (!flag_allow_nonconst_size) 2783 1.1 christos as_bad (_(".size expression for %s " 2784 1.1 christos "does not evaluate to a constant"), S_GET_NAME (symp)); 2785 1.1 christos else 2786 1.1 christos as_warn (_(".size expression for %s " 2787 1.1 christos "does not evaluate to a constant"), S_GET_NAME (symp)); 2788 1.1 christos } 2789 1.1 christos sy_obj->size = NULL; 2790 1.1 christos } 2791 1.1 christos 2792 1.8 christos versioned_name = sy_obj->versioned_name; 2793 1.8 christos if (versioned_name) 2794 1.1 christos { 2795 1.1 christos /* This symbol was given a new name with the .symver directive. 2796 1.1 christos If this is an external reference, just rename the symbol to 2797 1.1 christos include the version string. This will make the relocs be 2798 1.8 christos against the correct versioned symbol. */ 2799 1.1 christos 2800 1.8 christos /* We will have already reported an version error. */ 2801 1.8 christos if (sy_obj->bad_version) 2802 1.8 christos *puntp = true; 2803 1.8 christos /* elf_frob_file_before_adjust only allows one version symbol for 2804 1.8 christos renamed symbol. */ 2805 1.8 christos else if (sy_obj->rename) 2806 1.8 christos S_SET_NAME (symp, versioned_name->name); 2807 1.8 christos else if (S_IS_COMMON (symp)) 2808 1.8 christos { 2809 1.8 christos as_bad (_("`%s' can't be versioned to common symbol '%s'"), 2810 1.8 christos versioned_name->name, S_GET_NAME (symp)); 2811 1.8 christos *puntp = true; 2812 1.1 christos } 2813 1.1 christos else 2814 1.1 christos { 2815 1.8 christos asymbol *bfdsym; 2816 1.8 christos elf_symbol_type *elfsym; 2817 1.1 christos 2818 1.8 christos /* This is a definition. Add an alias for each version. 2819 1.8 christos FIXME: Using an alias will permit the debugging information 2820 1.8 christos to refer to the right symbol. However, it's not clear 2821 1.8 christos whether it is the best approach. */ 2822 1.8 christos 2823 1.8 christos /* FIXME: Creating a new symbol here is risky. We're 2824 1.8 christos in the final loop over the symbol table. We can 2825 1.8 christos get away with it only because the symbol goes to 2826 1.8 christos the end of the list, where the loop will still see 2827 1.8 christos it. It would probably be better to do this in 2828 1.8 christos obj_frob_file_before_adjust. */ 2829 1.8 christos for (; versioned_name != NULL; 2830 1.8 christos versioned_name = versioned_name->next) 2831 1.1 christos { 2832 1.8 christos symbolS *symp2 = symbol_find_or_make (versioned_name->name); 2833 1.1 christos 2834 1.1 christos S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp)); 2835 1.1 christos 2836 1.1 christos /* Subtracting out the frag address here is a hack 2837 1.1 christos because we are in the middle of the final loop. */ 2838 1.1 christos S_SET_VALUE (symp2, 2839 1.1 christos (S_GET_VALUE (symp) 2840 1.8 christos - (symbol_get_frag (symp)->fr_address 2841 1.8 christos / OCTETS_PER_BYTE))); 2842 1.1 christos 2843 1.1 christos symbol_set_frag (symp2, symbol_get_frag (symp)); 2844 1.1 christos 2845 1.1 christos /* This will copy over the size information. */ 2846 1.1 christos copy_symbol_attributes (symp2, symp); 2847 1.1 christos 2848 1.1 christos S_SET_OTHER (symp2, S_GET_OTHER (symp)); 2849 1.1 christos 2850 1.1 christos if (S_IS_WEAK (symp)) 2851 1.1 christos S_SET_WEAK (symp2); 2852 1.1 christos 2853 1.1 christos if (S_IS_EXTERNAL (symp)) 2854 1.1 christos S_SET_EXTERNAL (symp2); 2855 1.1 christos } 2856 1.8 christos 2857 1.8 christos switch (sy_obj->visibility) 2858 1.8 christos { 2859 1.8 christos case visibility_unchanged: 2860 1.8 christos break; 2861 1.8 christos case visibility_hidden: 2862 1.8 christos bfdsym = symbol_get_bfdsym (symp); 2863 1.8 christos elfsym = elf_symbol_from (bfdsym); 2864 1.8 christos elfsym->internal_elf_sym.st_other &= ~3; 2865 1.8 christos elfsym->internal_elf_sym.st_other |= STV_HIDDEN; 2866 1.8 christos break; 2867 1.8 christos case visibility_remove: 2868 1.8 christos /* Don't remove the symbol if it is used in relocation. 2869 1.8 christos Instead, mark it as to be removed and issue an error 2870 1.8 christos if the symbol has more than one versioned name. */ 2871 1.8 christos if (symbol_used_in_reloc_p (symp)) 2872 1.8 christos { 2873 1.8 christos if (sy_obj->versioned_name->next != NULL) 2874 1.8 christos as_bad (_("symbol '%s' with multiple versions cannot be used in relocation"), 2875 1.8 christos S_GET_NAME (symp)); 2876 1.8 christos symbol_mark_removed (symp); 2877 1.8 christos } 2878 1.8 christos else 2879 1.8 christos symbol_remove (symp, &symbol_rootP, &symbol_lastP); 2880 1.8 christos break; 2881 1.8 christos case visibility_local: 2882 1.8 christos S_CLEAR_EXTERNAL (symp); 2883 1.8 christos break; 2884 1.8 christos } 2885 1.1 christos } 2886 1.1 christos } 2887 1.1 christos 2888 1.1 christos /* Double check weak symbols. */ 2889 1.1 christos if (S_IS_WEAK (symp)) 2890 1.1 christos { 2891 1.1 christos if (S_IS_COMMON (symp)) 2892 1.1 christos as_bad (_("symbol `%s' can not be both weak and common"), 2893 1.1 christos S_GET_NAME (symp)); 2894 1.1 christos } 2895 1.1 christos } 2896 1.1 christos 2897 1.8 christos /* Fix up SYMPP which has been marked to be removed by .symver. */ 2898 1.8 christos 2899 1.8 christos void 2900 1.8 christos elf_fixup_removed_symbol (symbolS **sympp) 2901 1.8 christos { 2902 1.8 christos symbolS *symp = *sympp; 2903 1.8 christos struct elf_obj_sy *sy_obj = symbol_get_obj (symp); 2904 1.8 christos 2905 1.8 christos /* Replace the removed symbol with the versioned symbol. */ 2906 1.8 christos symp = symbol_find (sy_obj->versioned_name->name); 2907 1.8 christos *sympp = symp; 2908 1.8 christos } 2909 1.8 christos 2910 1.6 christos /* Create symbols for group signature. */ 2911 1.6 christos 2912 1.1 christos void 2913 1.1 christos elf_adjust_symtab (void) 2914 1.1 christos { 2915 1.1 christos unsigned int i; 2916 1.1 christos 2917 1.1 christos /* Make the SHT_GROUP sections that describe each section group. We 2918 1.1 christos can't set up the section contents here yet, because elf section 2919 1.1 christos indices have yet to be calculated. elf.c:set_group_contents does 2920 1.1 christos the rest of the work. */ 2921 1.6 christos for (i = 0; i < groups.num_group; i++) 2922 1.1 christos { 2923 1.6 christos const char *group_name = elf_group_name (groups.head[i]); 2924 1.1 christos const char *sec_name; 2925 1.1 christos asection *s; 2926 1.1 christos flagword flags; 2927 1.1 christos struct symbol *sy; 2928 1.1 christos 2929 1.1 christos flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP; 2930 1.6 christos for (s = groups.head[i]; s != NULL; s = elf_next_in_group (s)) 2931 1.1 christos if ((s->flags ^ flags) & SEC_LINK_ONCE) 2932 1.1 christos { 2933 1.1 christos flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; 2934 1.6 christos if (s != groups.head[i]) 2935 1.1 christos { 2936 1.1 christos as_warn (_("assuming all members of group `%s' are COMDAT"), 2937 1.1 christos group_name); 2938 1.1 christos break; 2939 1.1 christos } 2940 1.1 christos } 2941 1.1 christos 2942 1.1 christos sec_name = ".group"; 2943 1.1 christos s = subseg_force_new (sec_name, 0); 2944 1.1 christos if (s == NULL 2945 1.7 christos || !bfd_set_section_flags (s, flags) 2946 1.7 christos || !bfd_set_section_alignment (s, 2)) 2947 1.1 christos { 2948 1.1 christos as_fatal (_("can't create group: %s"), 2949 1.1 christos bfd_errmsg (bfd_get_error ())); 2950 1.1 christos } 2951 1.1 christos elf_section_type (s) = SHT_GROUP; 2952 1.1 christos 2953 1.1 christos /* Pass a pointer to the first section in this group. */ 2954 1.6 christos elf_next_in_group (s) = groups.head[i]; 2955 1.6 christos elf_sec_group (groups.head[i]) = s; 2956 1.1 christos /* Make sure that the signature symbol for the group has the 2957 1.1 christos name of the group. */ 2958 1.1 christos sy = symbol_find_exact (group_name); 2959 1.7 christos if (!sy || !symbol_on_chain (sy, symbol_rootP, symbol_lastP)) 2960 1.1 christos { 2961 1.1 christos /* Create the symbol now. */ 2962 1.8 christos sy = symbol_new (group_name, now_seg, frag_now, 0); 2963 1.1 christos #ifdef TE_SOLARIS 2964 1.1 christos /* Before Solaris 11 build 154, Sun ld rejects local group 2965 1.1 christos signature symbols, so make them weak hidden instead. */ 2966 1.1 christos symbol_get_bfdsym (sy)->flags |= BSF_WEAK; 2967 1.1 christos S_SET_OTHER (sy, STV_HIDDEN); 2968 1.1 christos #else 2969 1.1 christos symbol_get_obj (sy)->local = 1; 2970 1.1 christos #endif 2971 1.1 christos symbol_table_insert (sy); 2972 1.1 christos } 2973 1.1 christos elf_group_id (s) = symbol_get_bfdsym (sy); 2974 1.8 christos /* Mark the group signature symbol as used so that it will be 2975 1.8 christos included in the symbol table. */ 2976 1.8 christos symbol_mark_used_in_reloc (sy); 2977 1.1 christos } 2978 1.1 christos } 2979 1.1 christos 2980 1.1 christos void 2981 1.1 christos elf_frob_file (void) 2982 1.1 christos { 2983 1.10 christos bfd_map_over_sections (stdoutput, set_additional_section_info, NULL); 2984 1.1 christos 2985 1.1 christos #ifdef elf_tc_final_processing 2986 1.1 christos elf_tc_final_processing (); 2987 1.1 christos #endif 2988 1.1 christos } 2989 1.1 christos 2990 1.1 christos /* It removes any unneeded versioned symbols from the symbol table. */ 2991 1.1 christos 2992 1.1 christos void 2993 1.1 christos elf_frob_file_before_adjust (void) 2994 1.1 christos { 2995 1.1 christos if (symbol_rootP) 2996 1.1 christos { 2997 1.1 christos symbolS *symp; 2998 1.1 christos 2999 1.1 christos for (symp = symbol_rootP; symp; symp = symbol_next (symp)) 3000 1.8 christos { 3001 1.8 christos struct elf_obj_sy *sy_obj = symbol_get_obj (symp); 3002 1.8 christos int is_defined = !!S_IS_DEFINED (symp); 3003 1.8 christos 3004 1.8 christos if (sy_obj->versioned_name) 3005 1.8 christos { 3006 1.8 christos char *p = strchr (sy_obj->versioned_name->name, 3007 1.8 christos ELF_VER_CHR); 3008 1.8 christos 3009 1.8 christos if (sy_obj->rename) 3010 1.8 christos { 3011 1.8 christos /* The @@@ syntax is a special case. If the symbol is 3012 1.8 christos not defined, 2 `@'s will be removed from the 3013 1.8 christos versioned_name. Otherwise, 1 `@' will be removed. */ 3014 1.8 christos size_t l = strlen (&p[3]) + 1; 3015 1.8 christos memmove (&p[1 + is_defined], &p[3], l); 3016 1.8 christos } 3017 1.8 christos 3018 1.8 christos if (!is_defined) 3019 1.8 christos { 3020 1.8 christos /* Verify that the name isn't using the @@ syntax--this 3021 1.8 christos is reserved for definitions of the default version 3022 1.8 christos to link against. */ 3023 1.8 christos if (!sy_obj->rename && p[1] == ELF_VER_CHR) 3024 1.8 christos { 3025 1.8 christos as_bad (_("invalid attempt to declare external " 3026 1.8 christos "version name as default in symbol `%s'"), 3027 1.8 christos sy_obj->versioned_name->name); 3028 1.8 christos return; 3029 1.8 christos } 3030 1.1 christos 3031 1.8 christos /* Only one version symbol is allowed for undefined 3032 1.8 christos symbol. */ 3033 1.8 christos if (sy_obj->versioned_name->next) 3034 1.8 christos { 3035 1.8 christos as_bad (_("multiple versions [`%s'|`%s'] for " 3036 1.8 christos "symbol `%s'"), 3037 1.8 christos sy_obj->versioned_name->name, 3038 1.8 christos sy_obj->versioned_name->next->name, 3039 1.8 christos S_GET_NAME (symp)); 3040 1.8 christos return; 3041 1.8 christos } 3042 1.1 christos 3043 1.8 christos sy_obj->rename = true; 3044 1.8 christos } 3045 1.8 christos } 3046 1.1 christos 3047 1.8 christos /* If there was .symver or .weak, but symbol was neither 3048 1.8 christos defined nor used anywhere, remove it. */ 3049 1.8 christos if (!is_defined 3050 1.8 christos && (sy_obj->versioned_name || S_IS_WEAK (symp)) 3051 1.8 christos && symbol_used_p (symp) == 0 3052 1.8 christos && symbol_used_in_reloc_p (symp) == 0) 3053 1.8 christos symbol_remove (symp, &symbol_rootP, &symbol_lastP); 3054 1.8 christos } 3055 1.1 christos } 3056 1.1 christos } 3057 1.1 christos 3058 1.1 christos /* It is required that we let write_relocs have the opportunity to 3059 1.1 christos optimize away fixups before output has begun, since it is possible 3060 1.1 christos to eliminate all fixups for a section and thus we never should 3061 1.1 christos have generated the relocation section. */ 3062 1.1 christos 3063 1.1 christos void 3064 1.1 christos elf_frob_file_after_relocs (void) 3065 1.1 christos { 3066 1.6 christos unsigned int i; 3067 1.6 christos 3068 1.6 christos /* Set SHT_GROUP section size. */ 3069 1.6 christos for (i = 0; i < groups.num_group; i++) 3070 1.6 christos { 3071 1.6 christos asection *s, *head, *group; 3072 1.6 christos bfd_size_type size; 3073 1.6 christos 3074 1.6 christos head = groups.head[i]; 3075 1.6 christos size = 4; 3076 1.6 christos for (s = head; s != NULL; s = elf_next_in_group (s)) 3077 1.6 christos size += (s->flags & SEC_RELOC) != 0 ? 8 : 4; 3078 1.6 christos 3079 1.6 christos group = elf_sec_group (head); 3080 1.6 christos subseg_set (group, 0); 3081 1.7 christos bfd_set_section_size (group, size); 3082 1.6 christos group->contents = (unsigned char *) frag_more (size); 3083 1.10 christos group->alloced = 1; 3084 1.6 christos frag_now->fr_fix = frag_now_fix_octets (); 3085 1.6 christos frag_wane (frag_now); 3086 1.6 christos } 3087 1.6 christos 3088 1.1 christos #ifdef NEED_ECOFF_DEBUG 3089 1.1 christos if (ECOFF_DEBUGGING) 3090 1.1 christos /* Generate the ECOFF debugging information. */ 3091 1.1 christos { 3092 1.1 christos const struct ecoff_debug_swap *debug_swap; 3093 1.1 christos struct ecoff_debug_info debug; 3094 1.1 christos char *buf; 3095 1.1 christos asection *sec; 3096 1.1 christos 3097 1.1 christos debug_swap 3098 1.1 christos = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap; 3099 1.1 christos know (debug_swap != NULL); 3100 1.1 christos ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap); 3101 1.1 christos 3102 1.1 christos /* Set up the pointers in debug. */ 3103 1.9 christos debug.alloc_syments = true; 3104 1.1 christos #define SET(ptr, offset, type) \ 3105 1.1 christos debug.ptr = (type) (buf + debug.symbolic_header.offset) 3106 1.1 christos 3107 1.1 christos SET (line, cbLineOffset, unsigned char *); 3108 1.1 christos SET (external_dnr, cbDnOffset, void *); 3109 1.1 christos SET (external_pdr, cbPdOffset, void *); 3110 1.1 christos SET (external_sym, cbSymOffset, void *); 3111 1.1 christos SET (external_opt, cbOptOffset, void *); 3112 1.1 christos SET (external_aux, cbAuxOffset, union aux_ext *); 3113 1.1 christos SET (ss, cbSsOffset, char *); 3114 1.1 christos SET (external_fdr, cbFdOffset, void *); 3115 1.1 christos SET (external_rfd, cbRfdOffset, void *); 3116 1.1 christos /* ssext and external_ext are set up just below. */ 3117 1.1 christos 3118 1.1 christos #undef SET 3119 1.1 christos 3120 1.1 christos /* Set up the external symbols. */ 3121 1.1 christos debug.ssext = debug.ssext_end = NULL; 3122 1.1 christos debug.external_ext = debug.external_ext_end = NULL; 3123 1.8 christos if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, true, 3124 1.1 christos elf_get_extr, elf_set_index)) 3125 1.1 christos as_fatal (_("failed to set up debugging information: %s"), 3126 1.1 christos bfd_errmsg (bfd_get_error ())); 3127 1.1 christos 3128 1.1 christos sec = bfd_get_section_by_name (stdoutput, ".mdebug"); 3129 1.1 christos gas_assert (sec != NULL); 3130 1.1 christos 3131 1.1 christos know (!stdoutput->output_has_begun); 3132 1.1 christos 3133 1.1 christos /* We set the size of the section, call bfd_set_section_contents 3134 1.1 christos to force the ELF backend to allocate a file position, and then 3135 1.1 christos write out the data. FIXME: Is this really the best way to do 3136 1.1 christos this? */ 3137 1.7 christos bfd_set_section_size (sec, bfd_ecoff_debug_size (stdoutput, &debug, 3138 1.7 christos debug_swap)); 3139 1.1 christos 3140 1.1 christos /* Pass BUF to bfd_set_section_contents because this will 3141 1.1 christos eventually become a call to fwrite, and ISO C prohibits 3142 1.1 christos passing a NULL pointer to a stdio function even if the 3143 1.1 christos pointer will not be used. */ 3144 1.1 christos if (! bfd_set_section_contents (stdoutput, sec, buf, 0, 0)) 3145 1.1 christos as_fatal (_("can't start writing .mdebug section: %s"), 3146 1.1 christos bfd_errmsg (bfd_get_error ())); 3147 1.1 christos 3148 1.1 christos know (stdoutput->output_has_begun); 3149 1.1 christos know (sec->filepos != 0); 3150 1.1 christos 3151 1.1 christos if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap, 3152 1.1 christos sec->filepos)) 3153 1.1 christos as_fatal (_("could not write .mdebug section: %s"), 3154 1.1 christos bfd_errmsg (bfd_get_error ())); 3155 1.1 christos } 3156 1.1 christos #endif /* NEED_ECOFF_DEBUG */ 3157 1.1 christos } 3158 1.1 christos 3159 1.9 christos /* This is called when the assembler starts. */ 3160 1.9 christos 3161 1.9 christos void 3162 1.9 christos elf_begin (void) 3163 1.9 christos { 3164 1.9 christos asection *s; 3165 1.9 christos 3166 1.9 christos /* Add symbols for the known sections to the symbol table. */ 3167 1.9 christos s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME); 3168 1.9 christos symbol_table_insert (section_symbol (s)); 3169 1.9 christos s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME); 3170 1.9 christos symbol_table_insert (section_symbol (s)); 3171 1.9 christos s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME); 3172 1.9 christos symbol_table_insert (section_symbol (s)); 3173 1.9 christos elf_com_section_ptr = bfd_com_section_ptr; 3174 1.9 christos previous_section = NULL; 3175 1.9 christos previous_subsection = 0; 3176 1.9 christos comment_section = NULL; 3177 1.9 christos memset (&groups, 0, sizeof (groups)); 3178 1.9 christos } 3179 1.9 christos 3180 1.9 christos void 3181 1.9 christos elf_end (void) 3182 1.9 christos { 3183 1.9 christos while (section_stack) 3184 1.9 christos { 3185 1.9 christos struct section_stack *top = section_stack; 3186 1.9 christos section_stack = top->next; 3187 1.9 christos free (top); 3188 1.9 christos } 3189 1.9 christos while (recorded_attributes) 3190 1.9 christos { 3191 1.9 christos struct recorded_attribute_info *rai = recorded_attributes; 3192 1.9 christos recorded_attributes = rai->next; 3193 1.9 christos free (rai); 3194 1.9 christos } 3195 1.9 christos if (groups.indexes) 3196 1.9 christos { 3197 1.9 christos htab_delete (groups.indexes); 3198 1.9 christos free (groups.head); 3199 1.9 christos } 3200 1.1 christos } 3201 1.1 christos 3202 1.10 christos #ifdef USE_EMULATIONS 3203 1.10 christos 3204 1.10 christos static bfd_vma 3205 1.10 christos elf_s_get_size (symbolS *sym) 3206 1.10 christos { 3207 1.10 christos return S_GET_SIZE (sym); 3208 1.10 christos } 3209 1.10 christos 3210 1.10 christos static void 3211 1.10 christos elf_s_set_size (symbolS *sym, bfd_vma sz) 3212 1.10 christos { 3213 1.10 christos S_SET_SIZE (sym, sz); 3214 1.10 christos } 3215 1.10 christos 3216 1.10 christos static bfd_vma 3217 1.10 christos elf_s_get_align (symbolS *sym) 3218 1.10 christos { 3219 1.10 christos return S_GET_ALIGN (sym); 3220 1.10 christos } 3221 1.10 christos 3222 1.10 christos static void 3223 1.10 christos elf_s_set_align (symbolS *sym, bfd_vma align) 3224 1.10 christos { 3225 1.10 christos S_SET_ALIGN (sym, align); 3226 1.10 christos } 3227 1.10 christos 3228 1.10 christos int 3229 1.10 christos elf_s_get_other (symbolS *sym) 3230 1.10 christos { 3231 1.10 christos return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other; 3232 1.10 christos } 3233 1.10 christos 3234 1.10 christos static void 3235 1.10 christos elf_s_set_other (symbolS *sym, int other) 3236 1.10 christos { 3237 1.10 christos S_SET_OTHER (sym, other); 3238 1.10 christos } 3239 1.10 christos 3240 1.10 christos static int 3241 1.10 christos elf_sec_sym_ok_for_reloc (asection *sec) 3242 1.10 christos { 3243 1.10 christos return obj_sec_sym_ok_for_reloc (sec); 3244 1.10 christos } 3245 1.10 christos 3246 1.10 christos #ifdef NEED_ECOFF_DEBUG 3247 1.10 christos static void 3248 1.10 christos elf_process_stab (int what ATTRIBUTE_UNUSED, 3249 1.10 christos const char *string ATTRIBUTE_UNUSED, 3250 1.10 christos int type ATTRIBUTE_UNUSED, 3251 1.10 christos int other ATTRIBUTE_UNUSED, 3252 1.10 christos int desc ATTRIBUTE_UNUSED) 3253 1.10 christos { 3254 1.10 christos if (ECOFF_DEBUGGING) 3255 1.10 christos ecoff_stab (what, string, type, other, desc); 3256 1.10 christos } 3257 1.10 christos #else 3258 1.10 christos # define elf_process_stab NULL 3259 1.10 christos #endif 3260 1.10 christos 3261 1.10 christos static int 3262 1.10 christos elf_separate_stab_sections (void) 3263 1.10 christos { 3264 1.10 christos #ifdef NEED_ECOFF_DEBUG 3265 1.10 christos return (!ECOFF_DEBUGGING); 3266 1.10 christos #else 3267 1.10 christos return 1; 3268 1.10 christos #endif 3269 1.10 christos } 3270 1.10 christos 3271 1.10 christos #ifdef NEED_ECOFF_DEBUG 3272 1.10 christos static void 3273 1.10 christos elf_init_stab_section (segT stab, segT stabstr) 3274 1.10 christos { 3275 1.10 christos if (!ECOFF_DEBUGGING) 3276 1.10 christos obj_elf_init_stab_section (stab, stabstr); 3277 1.10 christos } 3278 1.10 christos #endif 3279 1.10 christos 3280 1.1 christos const struct format_ops elf_format_ops = 3281 1.1 christos { 3282 1.1 christos bfd_target_elf_flavour, 3283 1.1 christos 0, /* dfl_leading_underscore */ 3284 1.1 christos 1, /* emit_section_symbols */ 3285 1.1 christos elf_begin, 3286 1.9 christos elf_end, 3287 1.1 christos elf_file_symbol, 3288 1.10 christos NULL, /* assign_symbol */ 3289 1.1 christos elf_frob_symbol, 3290 1.1 christos elf_frob_file, 3291 1.1 christos elf_frob_file_before_adjust, 3292 1.1 christos 0, /* obj_frob_file_before_fix */ 3293 1.1 christos elf_frob_file_after_relocs, 3294 1.1 christos elf_s_get_size, elf_s_set_size, 3295 1.1 christos elf_s_get_align, elf_s_set_align, 3296 1.1 christos elf_s_get_other, 3297 1.1 christos elf_s_set_other, 3298 1.1 christos 0, /* s_get_desc */ 3299 1.1 christos 0, /* s_set_desc */ 3300 1.1 christos 0, /* s_get_type */ 3301 1.1 christos 0, /* s_set_type */ 3302 1.1 christos elf_copy_symbol_attributes, 3303 1.1 christos elf_process_stab, 3304 1.1 christos elf_separate_stab_sections, 3305 1.10 christos #ifdef NEED_ECOFF_DEBUG 3306 1.1 christos elf_init_stab_section, 3307 1.10 christos #else 3308 1.10 christos obj_elf_init_stab_section, 3309 1.10 christos #endif 3310 1.1 christos elf_sec_sym_ok_for_reloc, 3311 1.1 christos elf_pop_insert, 3312 1.1 christos #ifdef NEED_ECOFF_DEBUG 3313 1.1 christos elf_ecoff_set_ext, 3314 1.1 christos #else 3315 1.1 christos 0, /* ecoff_set_ext */ 3316 1.1 christos #endif 3317 1.1 christos elf_obj_read_begin_hook, 3318 1.1 christos elf_obj_symbol_new_hook, 3319 1.10 christos 0, 3320 1.1 christos elf_adjust_symtab 3321 1.1 christos }; 3322 1.10 christos 3323 1.10 christos #endif /* USE_EMULATIONS */ 3324