X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Fobj-elf.c;h=e93d59cb081c1ac180dc72d6c226cad4bac44f6c;hb=9a01ec4c0368048fb5ea1ba1b3af9afbd651b529;hp=93eb81e98a422cc2de10a2d449429b131f974145;hpb=05862db73fb5cad8bdae85e240b7b4713aad327e;p=binutils-gdb.git diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 93eb81e98a4..e93d59cb081 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -1,5 +1,5 @@ /* ELF object file format - Copyright (C) 1992-2020 Free Software Foundation, Inc. + Copyright (C) 1992-2021 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -121,10 +121,6 @@ static const pseudo_typeS elf_pseudo_table[] = /* A GNU extension for object attributes. */ {"gnu_attribute", obj_elf_gnu_attribute, 0}, - /* These are used for dwarf. */ - {"2byte", cons, 2}, - {"4byte", cons, 4}, - {"8byte", cons, 8}, /* These are used for dwarf2. */ { "file", dwarf2_directive_file, 0 }, { "loc", dwarf2_directive_loc, 0 }, @@ -135,6 +131,7 @@ static const pseudo_typeS elf_pseudo_table[] = {"offset", obj_elf_struct, 0}, {"struct", obj_elf_struct, 0}, {"text", obj_elf_text, 0}, + {"bss", obj_elf_bss, 0}, {"tls_common", obj_elf_tls_common, 0}, @@ -328,9 +325,9 @@ elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size) if (*input_line_pointer == '.') input_line_pointer++; /* Some say data, some say bss. */ - if (strncmp (input_line_pointer, "bss\"", 4) == 0) + if (startswith (input_line_pointer, "bss\"")) input_line_pointer += 4; - else if (strncmp (input_line_pointer, "data\"", 5) == 0) + else if (startswith (input_line_pointer, "data\"")) input_line_pointer += 5; else { @@ -519,9 +516,12 @@ struct section_stack static struct section_stack *section_stack; +/* ELF section flags for unique sections. */ +#define SEC_ASSEMBLER_SHF_MASK SHF_GNU_RETAIN + /* Return TRUE iff SEC matches the section info INF. */ -static bfd_boolean +static bool get_section_by_match (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf) { struct elf_section_match *match = (struct elf_section_match *) inf; @@ -529,9 +529,12 @@ get_section_by_match (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf) const char *group_name = elf_group_name (sec); const char *linked_to_symbol_name = sec->map_head.linked_to_symbol_name; - unsigned int info = elf_section_data (sec)->this_hdr.sh_info; + unsigned int sh_info = elf_section_data (sec)->this_hdr.sh_info; + bfd_vma sh_flags = (elf_section_data (sec)->this_hdr.sh_flags + & SEC_ASSEMBLER_SHF_MASK); - return (info == match->info + return (sh_info == match->sh_info + && sh_flags == match->sh_flags && ((bfd_section_flags (sec) & SEC_ASSEMBLER_SECTION_ID) == (match->flags & SEC_ASSEMBLER_SECTION_ID)) && sec->section_id == match->section_id @@ -601,8 +604,8 @@ obj_elf_change_section (const char *name, elt->prev_subseg = previous_subsection; section_stack = elt; } - previous_section = now_seg; - previous_subsection = now_subseg; + + obj_elf_section_change_hook (); old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section_by_match, (void *) match_p); @@ -619,7 +622,7 @@ obj_elf_change_section (const char *name, if (ssect != NULL) { - bfd_boolean override = FALSE; + bool override = false; if (type == SHT_NULL) type = ssect->type; @@ -660,42 +663,50 @@ obj_elf_change_section (const char *name, } } - if (old_sec == NULL && ((attr & ~(SHF_MASKOS | SHF_MASKPROC)) + if (old_sec == NULL && ((attr & ~(SHF_LINK_ORDER + | SHF_MASKOS + | SHF_MASKPROC)) & ~ssect->attr) != 0) { + /* Strip SHF_GNU_RETAIN. */ + bfd_vma generic_attr = attr; + if (elf_tdata (stdoutput)->has_gnu_osabi) + generic_attr &= ~SHF_GNU_RETAIN; + /* As a GNU extension, we permit a .note section to be allocatable. If the linker sees an allocatable .note section, it will create a PT_NOTE segment in the output file. We also allow "x" for .note.GNU-stack. */ if (ssect->type == SHT_NOTE - && (attr == SHF_ALLOC || attr == SHF_EXECINSTR)) + && (generic_attr == SHF_ALLOC + || generic_attr == SHF_EXECINSTR)) ; /* Allow different SHF_MERGE and SHF_STRINGS if we have something like .rodata.str. */ else if (ssect->suffix_length == -2 && name[ssect->prefix_length] == '.' - && (attr + && (generic_attr & ~ssect->attr & ~SHF_MERGE & ~SHF_STRINGS) == 0) ; /* .interp, .strtab and .symtab can have SHF_ALLOC. */ - else if (attr == SHF_ALLOC + else if (generic_attr == SHF_ALLOC && (strcmp (name, ".interp") == 0 || strcmp (name, ".strtab") == 0 || strcmp (name, ".symtab") == 0)) - override = TRUE; + override = true; /* .note.GNU-stack can have SHF_EXECINSTR. */ - else if (attr == SHF_EXECINSTR + else if (generic_attr == SHF_EXECINSTR && strcmp (name, ".note.GNU-stack") == 0) - override = TRUE; + override = true; #ifdef TC_ALPHA /* A section on Alpha may have SHF_ALPHA_GPREL. */ - else if ((attr & ~ssect->attr) == SHF_ALPHA_GPREL) - override = TRUE; + else if ((generic_attr & ~ssect->attr) == SHF_ALPHA_GPREL) + override = true; #endif #ifdef TC_RX - else if (attr == (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC) + else if (generic_attr == (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC) && (ssect->type == SHT_INIT_ARRAY || ssect->type == SHT_FINI_ARRAY || ssect->type == SHT_PREINIT_ARRAY)) @@ -707,7 +718,7 @@ obj_elf_change_section (const char *name, if (match_p->group_name == NULL) as_warn (_("setting incorrect section attributes for %s"), name); - override = TRUE; + override = true; } } @@ -740,7 +751,7 @@ obj_elf_change_section (const char *name, type = bfd_elf_get_default_section_type (flags); elf_section_type (sec) = type; elf_section_flags (sec) = attr; - elf_section_data (sec)->this_hdr.sh_info = match_p->info; + elf_section_data (sec)->this_hdr.sh_info = match_p->sh_info; /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */ if (type == SHT_NOBITS) @@ -807,7 +818,7 @@ obj_elf_change_section (const char *name, } else /* FIXME: Maybe we should consider removing a previously set - processor or application specific attribute as suspicious ? */ + processor or application specific attribute as suspicious? */ elf_section_flags (sec) = attr; if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize) @@ -822,10 +833,10 @@ obj_elf_change_section (const char *name, static bfd_vma obj_elf_parse_section_letters (char *str, size_t len, - bfd_boolean *is_clone, bfd_vma *gnu_attr) + bool *is_clone, bfd_vma *gnu_attr) { bfd_vma attr = 0; - *is_clone = FALSE; + *is_clone = false; while (len > 0) { @@ -861,8 +872,11 @@ obj_elf_parse_section_letters (char *str, size_t len, case 'd': *gnu_attr |= SHF_GNU_MBIND; break; + case 'R': + *gnu_attr |= SHF_GNU_RETAIN; + break; case '?': - *is_clone = TRUE; + *is_clone = true; break; /* Compatibility. */ case 'm': @@ -890,8 +904,32 @@ obj_elf_parse_section_letters (char *str, size_t len, if (ISDIGIT (*str)) { char * end; + struct elf_backend_data *bed; + bfd_vma numeric_flags = strtoul (str, &end, 0); + + attr |= numeric_flags; + + bed = (struct elf_backend_data *) + get_elf_backend_data (stdoutput); + + if (bed->elf_osabi == ELFOSABI_NONE + || bed->elf_osabi == ELFOSABI_STANDALONE + || bed->elf_osabi == ELFOSABI_GNU + || bed->elf_osabi == ELFOSABI_FREEBSD) + { + /* Add flags in the SHF_MASKOS range to gnu_attr for + OSABIs that support those flags. + Also adding the flags for ELFOSABI_{NONE,STANDALONE} + allows them to be validated later in obj_elf_section. + We can't just always set these bits in gnu_attr for + all OSABIs, since Binutils does not recognize all + SHF_MASKOS bits for non-GNU OSABIs. It's therefore + possible that numeric flags are being used to set bits + in the SHF_MASKOS range for those targets, and we + don't want assembly to fail in those situations. */ + *gnu_attr |= (numeric_flags & SHF_MASKOS); + } - attr |= strtoul (str, & end, 0); /* Update str and len, allowing for the fact that we will execute str++ and len-- below. */ end --; @@ -910,19 +948,19 @@ obj_elf_parse_section_letters (char *str, size_t len, } static int -obj_elf_section_type (char *str, size_t len, bfd_boolean warn) +obj_elf_section_type (char *str, size_t len, bool warn) { - if (len == 8 && strncmp (str, "progbits", 8) == 0) + if (len == 8 && startswith (str, "progbits")) return SHT_PROGBITS; - if (len == 6 && strncmp (str, "nobits", 6) == 0) + if (len == 6 && startswith (str, "nobits")) return SHT_NOBITS; - if (len == 4 && strncmp (str, "note", 4) == 0) + if (len == 4 && startswith (str, "note")) return SHT_NOTE; - if (len == 10 && strncmp (str, "init_array", 10) == 0) + if (len == 10 && startswith (str, "init_array")) return SHT_INIT_ARRAY; - if (len == 10 && strncmp (str, "fini_array", 10) == 0) + if (len == 10 && startswith (str, "fini_array")) return SHT_FINI_ARRAY; - if (len == 13 && strncmp (str, "preinit_array", 13) == 0) + if (len == 13 && startswith (str, "preinit_array")) return SHT_PREINIT_ARRAY; #ifdef md_elf_section_type @@ -954,15 +992,15 @@ obj_elf_section_word (char *str, size_t len, int *type) { int ret; - if (len == 5 && strncmp (str, "write", 5) == 0) + if (len == 5 && startswith (str, "write")) return SHF_WRITE; - if (len == 5 && strncmp (str, "alloc", 5) == 0) + if (len == 5 && startswith (str, "alloc")) return SHF_ALLOC; - if (len == 9 && strncmp (str, "execinstr", 9) == 0) + if (len == 9 && startswith (str, "execinstr")) return SHF_EXECINSTR; - if (len == 7 && strncmp (str, "exclude", 7) == 0) + if (len == 7 && startswith (str, "exclude")) return SHF_EXCLUDE; - if (len == 3 && strncmp (str, "tls", 3) == 0) + if (len == 3 && startswith (str, "tls")) return SHF_TLS; #ifdef md_elf_section_word @@ -973,7 +1011,7 @@ obj_elf_section_word (char *str, size_t len, int *type) } #endif - ret = obj_elf_section_type (str, len, FALSE); + ret = obj_elf_section_type (str, len, false); if (ret != 0) *type = ret; else @@ -1088,8 +1126,7 @@ obj_elf_section (int push) md_flush_pending_output (); #endif - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); s_mri_sect (&mri_type); @@ -1147,7 +1184,7 @@ obj_elf_section (int push) if (*input_line_pointer == '"') { - bfd_boolean is_clone; + bool is_clone; beg = demand_copy_C_string (&dummy); if (beg == NULL) @@ -1175,7 +1212,7 @@ obj_elf_section (int push) ignore_rest_of_line (); return; } - type = obj_elf_section_type (beg, strlen (beg), TRUE); + type = obj_elf_section_type (beg, strlen (beg), true); } else if (c == '@' || c == '%') { @@ -1189,7 +1226,7 @@ obj_elf_section (int push) (void) restore_line_pointer (c); type = obj_elf_section_type (beg, input_line_pointer - beg, - TRUE); + true); } } else @@ -1241,7 +1278,7 @@ obj_elf_section (int push) if ((attr & SHF_GROUP) != 0 && is_clone) { as_warn (_("? section flag ignored with G present")); - is_clone = FALSE; + is_clone = false; } if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',') @@ -1254,13 +1291,13 @@ obj_elf_section (int push) { ++input_line_pointer; SKIP_WHITESPACE (); - if (strncmp (input_line_pointer, "comdat", 6) == 0) + if (startswith (input_line_pointer, "comdat")) { input_line_pointer += 6; linkonce = 1; } } - else if (strncmp (name, ".gnu.linkonce", 13) == 0) + else if (startswith (name, ".gnu.linkonce")) linkonce = 1; } else if ((attr & SHF_GROUP) != 0) @@ -1287,25 +1324,28 @@ obj_elf_section (int push) if (ISDIGIT (* input_line_pointer)) { char *t = input_line_pointer; - match.info = strtoul (input_line_pointer, + match.sh_info = strtoul (input_line_pointer, &input_line_pointer, 0); - if (match.info == (unsigned int) -1) + if (match.sh_info == (unsigned int) -1) { as_warn (_("unsupported mbind section info: %s"), t); - match.info = 0; + match.sh_info = 0; } } else input_line_pointer = save; } + if ((gnu_attr & SHF_GNU_RETAIN) != 0) + match.sh_flags |= SHF_GNU_RETAIN; + if (*input_line_pointer == ',') { char *save = input_line_pointer; ++input_line_pointer; SKIP_WHITESPACE (); - if (strncmp (input_line_pointer, "unique", 6) == 0) + if (startswith (input_line_pointer, "unique")) { input_line_pointer += 6; SKIP_WHITESPACE (); @@ -1316,7 +1356,7 @@ obj_elf_section (int push) if (ISDIGIT (* input_line_pointer)) { bfd_vma id; - bfd_boolean overflow; + bool overflow; char *t = input_line_pointer; if (sizeof (bfd_vma) <= sizeof (unsigned long)) { @@ -1387,26 +1427,34 @@ obj_elf_section (int push) done: demand_empty_rest_of_line (); - obj_elf_change_section (name, type, attr, entsize, &match, linkonce, - push); - - if ((gnu_attr & SHF_GNU_MBIND) != 0) + if ((gnu_attr & (SHF_GNU_MBIND | SHF_GNU_RETAIN)) != 0) { - struct elf_backend_data *bed; + const struct elf_backend_data *bed; + bool mbind_p = (gnu_attr & SHF_GNU_MBIND) != 0; - if ((attr & SHF_ALLOC) == 0) + if (mbind_p && (attr & SHF_ALLOC) == 0) as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name); - bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput); - if (bed->elf_osabi == ELFOSABI_NONE) - bed->elf_osabi = ELFOSABI_GNU; - else if (bed->elf_osabi != ELFOSABI_GNU - && bed->elf_osabi != ELFOSABI_FREEBSD) - as_bad (_("GNU_MBIND section is supported only by GNU " - "and FreeBSD targets")); - elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_mbind; + bed = get_elf_backend_data (stdoutput); + + if (bed->elf_osabi != ELFOSABI_GNU + && bed->elf_osabi != ELFOSABI_FREEBSD + && bed->elf_osabi != ELFOSABI_NONE) + as_bad (_("%s section is supported only by GNU and FreeBSD targets"), + mbind_p ? "GNU_MBIND" : "GNU_RETAIN"); + else + { + if (mbind_p) + elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_mbind; + if ((gnu_attr & SHF_GNU_RETAIN) != 0) + elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_retain; + + attr |= gnu_attr; + } } - elf_section_flags (now_seg) |= gnu_attr; + + obj_elf_change_section (name, type, attr, entsize, &match, linkonce, + push); if (linked_to_section_index != -1UL) { @@ -1419,6 +1467,28 @@ obj_elf_section (int push) subseg_set (now_seg, new_subsection); } +/* Change to the .bss section. */ + +void +obj_elf_bss (int i ATTRIBUTE_UNUSED) +{ + int temp; + +#ifdef md_flush_pending_output + md_flush_pending_output (); +#endif + + obj_elf_section_change_hook (); + + temp = get_absolute_expression (); + subseg_set (bss_section, (subsegT) temp); + demand_empty_rest_of_line (); + +#ifdef md_elf_section_change_hook + md_elf_section_change_hook (); +#endif +} + /* Change to the .data section. */ void @@ -1428,8 +1498,8 @@ obj_elf_data (int i) md_flush_pending_output (); #endif - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); + s_data (i); #ifdef md_elf_section_change_hook @@ -1446,8 +1516,8 @@ obj_elf_text (int i) md_flush_pending_output (); #endif - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); + s_text (i); #ifdef md_elf_section_change_hook @@ -1464,8 +1534,8 @@ obj_elf_struct (int i) md_flush_pending_output (); #endif - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); + s_struct (i); #ifdef md_elf_section_change_hook @@ -1482,8 +1552,7 @@ obj_elf_subsection (int ignore ATTRIBUTE_UNUSED) md_flush_pending_output (); #endif - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); temp = get_absolute_expression (); subseg_set (now_seg, (subsegT) temp); @@ -1522,8 +1591,8 @@ obj_elf_previous (int ignore ATTRIBUTE_UNUSED) new_section = previous_section; new_subsection = previous_subsection; - previous_section = now_seg; - previous_subsection = now_subseg; + obj_elf_section_change_hook (); + subseg_set (new_section, new_subsection); #ifdef md_elf_section_change_hook @@ -1606,7 +1675,7 @@ obj_elf_find_and_add_versioned_name (const char *version_name, return NULL; } } - sy_obj->rename = TRUE; + sy_obj->rename = true; break; default: as_bad (_("invalid version name '%s' for symbol `%s'"), @@ -1687,7 +1756,7 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED) if (obj_elf_find_and_add_versioned_name (name, sym_name, p, sy_obj) == NULL) { - sy_obj->bad_version = TRUE; + sy_obj->bad_version = true; ignore_rest_of_line (); return; } @@ -1700,17 +1769,17 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED) ++input_line_pointer; SKIP_WHITESPACE (); - if (strncmp (input_line_pointer, "local", 5) == 0) + if (startswith (input_line_pointer, "local")) { input_line_pointer += 5; sy_obj->visibility = visibility_local; } - else if (strncmp (input_line_pointer, "hidden", 6) == 0) + else if (startswith (input_line_pointer, "hidden")) { input_line_pointer += 6; sy_obj->visibility = visibility_hidden; } - else if (strncmp (input_line_pointer, "remove", 6) == 0) + else if (startswith (input_line_pointer, "remove")) { input_line_pointer += 6; sy_obj->visibility = visibility_remove; @@ -1898,7 +1967,7 @@ record_attribute (int vendor, unsigned int tag) /* Return true if we have seen an explicit specification of attribute TAG for vendor VENDOR. */ -bfd_boolean +bool obj_elf_seen_attribute (int vendor, unsigned int tag) { unsigned int base; @@ -1910,7 +1979,7 @@ obj_elf_seen_attribute (int vendor, unsigned int tag) for (rai = recorded_attributes; rai; rai = rai->next) if (rai->vendor == vendor && rai->base == base) return (rai->mask & mask) != 0; - return FALSE; + return false; } /* Parse an attribute directive for VENDOR. @@ -2055,6 +2124,22 @@ elf_obj_symbol_new_hook (symbolS *symbolP) #endif } +/* Deduplicate size expressions. We might get into trouble with + multiple freeing or use after free if we leave them pointing to the + same expressionS. */ + +void +elf_obj_symbol_clone_hook (symbolS *newsym, symbolS *orgsym ATTRIBUTE_UNUSED) +{ + struct elf_obj_sy *newelf = symbol_get_obj (newsym); + if (newelf->size) + { + expressionS *exp = XNEW (expressionS); + *exp = *newelf->size; + newelf->size = exp; + } +} + /* When setting one symbol equal to another, by default we probably want them to have the same "size", whatever it means in the current context. */ @@ -2298,13 +2383,12 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED) || strcmp (type_name, "10") == 0 || strcmp (type_name, "STT_GNU_IFUNC") == 0) { - struct elf_backend_data *bed; + const struct elf_backend_data *bed; - bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput); - if (bed->elf_osabi == ELFOSABI_NONE) - bed->elf_osabi = ELFOSABI_GNU; - else if (bed->elf_osabi != ELFOSABI_GNU - && bed->elf_osabi != ELFOSABI_FREEBSD) + bed = get_elf_backend_data (stdoutput); + if (bed->elf_osabi != ELFOSABI_NONE + && bed->elf_osabi != ELFOSABI_GNU + && bed->elf_osabi != ELFOSABI_FREEBSD) as_bad (_("symbol type \"%s\" is supported only by GNU " "and FreeBSD targets"), type_name); /* MIPS targets do not support IFUNCS. */ @@ -2316,12 +2400,11 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED) } else if (strcmp (type_name, "gnu_unique_object") == 0) { - struct elf_backend_data *bed; + const struct elf_backend_data *bed; - bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput); - if (bed->elf_osabi == ELFOSABI_NONE) - bed->elf_osabi = ELFOSABI_GNU; - else if (bed->elf_osabi != ELFOSABI_GNU) + bed = get_elf_backend_data (stdoutput); + if (bed->elf_osabi != ELFOSABI_NONE + && bed->elf_osabi != ELFOSABI_GNU) as_bad (_("symbol type \"%s\" is supported only by GNU targets"), type_name); elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_unique; @@ -2425,12 +2508,13 @@ obj_elf_init_stab_section (segT seg) p = frag_more (12); /* Zero it out. */ memset (p, 0, 12); - file = as_where (NULL); + file = remap_debug_filename (as_where (NULL)); stabstr_name = concat (segment_name (seg), "str", (char *) NULL); - stroff = get_stab_string_offset (file, stabstr_name, TRUE); + stroff = get_stab_string_offset (file, stabstr_name, true); know (stroff == 1 || (stroff == 0 && file[0] == '\0')); md_number_to_chars (p, stroff, 4); seg_info (seg)->stabu.p = p; + xfree ((char *) file); } #endif @@ -2445,7 +2529,7 @@ adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) char *p; int strsz, nsyms; - if (strncmp (".stab", sec->name, 5)) + if (!startswith (sec->name, ".stab")) return; if (!strcmp ("str", sec->name + strlen (sec->name) - 3)) return; @@ -2487,13 +2571,13 @@ elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext) supposed to *EXT to the external symbol information, and return whether the symbol should be used at all. */ -static bfd_boolean +static bool elf_get_extr (asymbol *sym, EXTR *ext) { if (sym->udata.p == NULL) - return FALSE; + return false; *ext = *(EXTR *) sym->udata.p; - return TRUE; + return true; } /* This function is called by bfd_ecoff_debug_externals. It has @@ -2550,7 +2634,7 @@ elf_frob_symbol (symbolS *symp, int *puntp) /* We will have already reported an version error. */ if (sy_obj->bad_version) - *puntp = TRUE; + *puntp = true; /* elf_frob_file_before_adjust only allows one version symbol for renamed symbol. */ else if (sy_obj->rename) @@ -2559,7 +2643,7 @@ elf_frob_symbol (symbolS *symp, int *puntp) { as_bad (_("`%s' can't be versioned to common symbol '%s'"), versioned_name->name, S_GET_NAME (symp)); - *puntp = TRUE; + *puntp = true; } else { @@ -2780,6 +2864,9 @@ elf_adjust_symtab (void) symbol_table_insert (sy); } elf_group_id (s) = symbol_get_bfdsym (sy); + /* Mark the group signature symbol as used so that it will be + included in the symbol table. */ + symbol_mark_used_in_reloc (sy); } } @@ -2846,7 +2933,7 @@ elf_frob_file_before_adjust (void) return; } - sy_obj->rename = TRUE; + sy_obj->rename = true; } } @@ -2928,7 +3015,7 @@ elf_frob_file_after_relocs (void) /* Set up the external symbols. */ debug.ssext = debug.ssext_end = NULL; debug.external_ext = debug.external_ext_end = NULL; - if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE, + if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, true, elf_get_extr, elf_set_index)) as_fatal (_("failed to set up debugging information: %s"), bfd_errmsg (bfd_get_error ())); @@ -3040,6 +3127,6 @@ const struct format_ops elf_format_ops = #endif elf_obj_read_begin_hook, elf_obj_symbol_new_hook, - 0, + elf_obj_symbol_clone_hook, elf_adjust_symtab };