diff options
author | Alan Modra <amodra@gmail.com> | 2009-05-21 14:15:50 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2009-05-21 14:15:50 +0000 |
commit | 6e0b88f1b8d24ad0c318a989dd582e0d2205e03f (patch) | |
tree | 5d5f15d944c47e24ccc89a52398f5e7ff7dea0ba /bfd/elflink.c | |
parent | 5ef11c0214f8a01a6bc0a5dd9c51383012c372c5 (diff) | |
download | gdb-6e0b88f1b8d24ad0c318a989dd582e0d2205e03f.zip gdb-6e0b88f1b8d24ad0c318a989dd582e0d2205e03f.tar.gz gdb-6e0b88f1b8d24ad0c318a989dd582e0d2205e03f.tar.bz2 |
* elf-bfd.h (struct elf_backend_data
<elf_backend_link_output_symbol_hook>): Return an int.
* elf64-ppc.c (ppc64_elf_output_symbol_hook): Return 2 to drop
symbols on deleted .opd entries.
* elflink.c (elf_link_output_sym): Return without outputting sym
if output_symbol_hook returns 2.
(elf_link_output_extsym): Don't assign h->indx when symbol discarded.
Abort if we must not discard sym.
(elf_link_input_bfd): Similarly, don't set finfo->indices for
local syms.
(bfd_elf_final_link): Adjust elf_link_output_sym calls.
* elf-vxworks.c (elf_vxworks_link_output_symbol_hook): Adjust for
elf_backend_link_output_symbol_hook return type change.
* elf32-arm.c (output_arch_syminfo): Likewise.
(elf32_arm_output_map_sym, elf32_arm_output_stub_sym): Likewise.
(elf32_arm_output_arch_local_syms): Likewise.
* elf32-cr16c.c (elf32_cr16c_link_output_symbol_hook): Likewise.
* elf32-score.c (s3_bfd_score_elf_link_output_symbol_hook): Likewise.
(bfd_score_elf_link_output_symbol_hook): Likewise.
* elf32-score.h (s7_bfd_score_elf_link_output_symbol_hook): Likewise.
* elf32-score7.c (s7_bfd_score_elf_link_output_symbol_hook): Likewise.
* elf32-sh64.c (sh64_elf_link_output_symbol_hook): Likewise.
* elf32-spu.c (spu_elf_output_symbol_hook): Likewise.
* elf32-v850.c (v850_elf_link_output_symbol_hook): Likewise.
* elf64-hppa.c (elf64_hppa_link_output_symbol_hook): Likewise.
* elf64-mmix.c (mmix_elf_link_output_symbol_hook): Likewise.
* elf64-sh64.c (sh64_elf64_link_output_symbol_hook): Likewise.
* elf64-sparc.c (elf64_sparc_output_arch_syms): Likewise.
* elfxx-mips.c (_bfd_mips_elf_link_output_symbol_hook): Likewise.
* elfxx-mips.h (_bfd_mips_elf_link_output_symbol_hook): Likewise.
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 *); |