diff options
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index bfbf79a..61c510f 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -8196,7 +8196,7 @@ elf_link_flush_output_syms (struct elf_final_link_info *finfo, /* Add a symbol to the output symbol table. */ -static bfd_boolean +static int elf_link_output_sym (struct elf_final_link_info *finfo, const char *name, Elf_Internal_Sym *elfsym, @@ -8205,7 +8205,7 @@ elf_link_output_sym (struct elf_final_link_info *finfo, { bfd_byte *dest; Elf_External_Sym_Shndx *destshndx; - bfd_boolean (*output_symbol_hook) + int (*output_symbol_hook) (struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *, struct elf_link_hash_entry *); const struct elf_backend_data *bed; @@ -8214,8 +8214,9 @@ elf_link_output_sym (struct elf_final_link_info *finfo, output_symbol_hook = bed->elf_backend_link_output_symbol_hook; if (output_symbol_hook != NULL) { - if (! (*output_symbol_hook) (finfo->info, name, elfsym, input_sec, h)) - return FALSE; + int ret = (*output_symbol_hook) (finfo->info, name, elfsym, input_sec, h); + if (ret != 1) + return ret; } if (name == NULL || *name == '\0') @@ -8227,13 +8228,13 @@ elf_link_output_sym (struct elf_final_link_info *finfo, elfsym->st_name = (unsigned long) _bfd_stringtab_add (finfo->symstrtab, name, TRUE, FALSE); if (elfsym->st_name == (unsigned long) -1) - return FALSE; + return 0; } if (finfo->symbuf_count >= finfo->symbuf_size) { if (! elf_link_flush_output_syms (finfo, bed)) - return FALSE; + return 0; } dest = finfo->symbuf + finfo->symbuf_count * bed->s->sizeof_sym; @@ -8247,7 +8248,7 @@ elf_link_output_sym (struct elf_final_link_info *finfo, amt = finfo->shndxbuf_size * sizeof (Elf_External_Sym_Shndx); destshndx = bfd_realloc (destshndx, amt * 2); if (destshndx == NULL) - return FALSE; + return 0; finfo->symshndxbuf = destshndx; memset ((char *) destshndx + amt, 0, amt); finfo->shndxbuf_size *= 2; @@ -8259,7 +8260,7 @@ elf_link_output_sym (struct elf_final_link_info *finfo, finfo->symbuf_count += 1; bfd_get_symcount (finfo->output_bfd) += 1; - return TRUE; + return 1; } /* Return TRUE if the dynamic symbol SYM in ABFD is supported. */ @@ -8445,6 +8446,8 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) Elf_Internal_Sym sym; asection *input_sec; const struct elf_backend_data *bed; + long indx; + int ret; if (h->root.type == bfd_link_hash_warning) { @@ -8787,13 +8790,17 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) if (strip || (input_sec->flags & SEC_EXCLUDE) != 0) return TRUE; - h->indx = bfd_get_symcount (finfo->output_bfd); - - if (! elf_link_output_sym (finfo, h->root.root.string, &sym, input_sec, h)) + indx = bfd_get_symcount (finfo->output_bfd); + ret = elf_link_output_sym (finfo, h->root.root.string, &sym, input_sec, h); + if (ret == 0) { eoinfo->failed = TRUE; return FALSE; } + else if (ret == 1) + h->indx = indx; + else if (h->indx == -2) + abort(); return TRUE; } @@ -8961,6 +8968,8 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) asection *isec; const char *name; Elf_Internal_Sym osym; + long indx; + int ret; *pindex = -1; @@ -9048,8 +9057,6 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) && bfd_is_local_label_name (input_bfd, name))) continue; - /* If we get here, we are going to output this symbol. */ - osym = *isym; /* Adjust the section index for the output file. */ @@ -9079,8 +9086,12 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) } } - if (! elf_link_output_sym (finfo, name, &osym, isec, NULL)) + indx = bfd_get_symcount (output_bfd); + ret = elf_link_output_sym (finfo, name, &osym, isec, NULL); + if (ret == 0) return FALSE; + else if (ret == 1) + *pindex = indx; } /* Relocate the contents of each section. */ @@ -9129,6 +9140,8 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) Elf_Internal_Sym sym = isymbuf[symndx]; asection *sec = finfo->sections[symndx]->output_section; const char *name; + long indx; + int ret; name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, @@ -9143,9 +9156,14 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) sym.st_value += o->output_offset; - finfo->indices[symndx] = bfd_get_symcount (output_bfd); - if (! elf_link_output_sym (finfo, name, &sym, o, NULL)) + indx = bfd_get_symcount (output_bfd); + ret = elf_link_output_sym (finfo, name, &sym, o, NULL); + if (ret == 0) return FALSE; + else if (ret == 1) + finfo->indices[symndx] = indx; + else + abort (); } elf_section_data (osec)->this_hdr.sh_info = finfo->indices[symndx]; @@ -9536,6 +9554,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) unsigned long shlink; const char *name; asection *osec; + long indx; if (finfo->info->strip == strip_all) { @@ -9575,12 +9594,15 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) } } - finfo->indices[r_symndx] - = bfd_get_symcount (output_bfd); - - if (! elf_link_output_sym (finfo, name, &sym, sec, - NULL)) + indx = bfd_get_symcount (output_bfd); + ret = elf_link_output_sym (finfo, name, &sym, sec, + NULL); + if (ret == 0) return FALSE; + else if (ret == 1) + finfo->indices[r_symndx] = indx; + else + abort (); } r_symndx = finfo->indices[r_symndx]; @@ -10332,8 +10354,8 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) elfsym.st_info = 0; elfsym.st_other = 0; elfsym.st_shndx = SHN_UNDEF; - if (! elf_link_output_sym (&finfo, NULL, &elfsym, bfd_und_section_ptr, - NULL)) + if (elf_link_output_sym (&finfo, NULL, &elfsym, bfd_und_section_ptr, + NULL) != 1) goto error_return; } @@ -10358,7 +10380,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) elfsym.st_shndx = i; if (!info->relocatable) elfsym.st_value = o->vma; - if (!elf_link_output_sym (&finfo, NULL, &elfsym, o, NULL)) + if (elf_link_output_sym (&finfo, NULL, &elfsym, o, NULL) != 1) goto error_return; } } @@ -10534,7 +10556,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) table, do it now. */ if (bed->elf_backend_output_arch_local_syms) { - typedef bfd_boolean (*out_sym_func) + typedef int (*out_sym_func) (void *, const char *, Elf_Internal_Sym *, asection *, struct elf_link_hash_entry *); @@ -10645,7 +10667,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) table, do it now. */ if (bed->elf_backend_output_arch_syms) { - typedef bfd_boolean (*out_sym_func) + typedef int (*out_sym_func) (void *, const char *, Elf_Internal_Sym *, asection *, struct elf_link_hash_entry *); |