diff options
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r-- | bfd/elfcode.h | 159 |
1 files changed, 77 insertions, 82 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 5249ad3..67d5244 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -179,7 +179,6 @@ static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *)); #define elf_string_from_elf_strtab(abfd,strindex) \ elf_string_from_elf_section(abfd,elf_elfheader(abfd)->e_shstrndx,strindex) - /* Structure swapping routines */ /* Should perhaps use put_offset, put_word, etc. For now, the two versions @@ -1461,19 +1460,17 @@ elf_map_symbols (abfd) int num_globals2 = 0; int max_index = 0; int num_sections = 0; - Elf_Sym_Extra *sym_extra; int idx; asection *asect; + asymbol **new_syms; #ifdef DEBUG fprintf (stderr, "elf_map_symbols\n"); fflush (stderr); #endif - /* Add local symbols for each section for which there are relocs. - FIXME: How can we tell which sections have relocs at this point? - Will reloc_count always be accurate? Actually, I think most ELF - targets create section symbols for all sections anyhow. */ + /* Add a section symbol for each BFD section. FIXME: Is this really + necessary? */ for (asect = abfd->sections; asect; asect = asect->next) { if (max_index < asect->index) @@ -1482,13 +1479,12 @@ elf_map_symbols (abfd) max_index++; sect_syms = (asymbol **) bfd_zalloc (abfd, max_index * sizeof (asymbol *)); - elf_section_syms (abfd) = sect_syms; - - if (sect_syms == 0) + if (sect_syms == NULL) { bfd_set_error (bfd_error_no_memory); return false; } + elf_section_syms (abfd) = sect_syms; for (idx = 0; idx < symcount; idx++) { @@ -1497,7 +1493,7 @@ elf_map_symbols (abfd) asection *sec; sec = syms[idx]->section; - if (! bfd_is_abs_section (sec)) + if (sec->owner != NULL) { if (sec->owner != abfd) { @@ -1534,67 +1530,70 @@ elf_map_symbols (abfd) #endif } - if (num_sections) + /* Classify all of the symbols. */ + for (idx = 0; idx < symcount; idx++) { - if (syms) - { - asymbol **osyms = syms; - syms = (asymbol **) bfd_alloc (abfd, - ((symcount + num_sections + 1) - * sizeof (asymbol *))); - memcpy (syms, osyms, symcount * sizeof (asymbol *)); - } + if (!sym_is_global (abfd, syms[idx])) + num_locals++; else - syms = (asymbol **) bfd_alloc (abfd, - (num_sections + 1) * sizeof (asymbol *)); - if (!syms) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - - for (asect = abfd->sections; asect; asect = asect->next) + num_globals++; + } + for (asect = abfd->sections; asect; asect = asect->next) + { + if (sect_syms[asect->index] != NULL + && sect_syms[asect->index]->flags == 0) { - if (sect_syms[asect->index] != NULL - && sect_syms[asect->index]->flags == 0) - { - sect_syms[asect->index]->flags = BSF_SECTION_SYM; - syms[symcount++] = sect_syms[asect->index]; - } + sect_syms[asect->index]->flags = BSF_SECTION_SYM; + if (!sym_is_global (abfd, sect_syms[asect->index])) + num_locals++; + else + num_globals++; + sect_syms[asect->index]->flags = 0; } - - syms[symcount] = (asymbol *) 0; - bfd_set_symtab (abfd, syms, symcount); } - elf_sym_extra (abfd) = sym_extra - = (Elf_Sym_Extra *) bfd_alloc (abfd, symcount * sizeof (Elf_Sym_Extra)); - if (!sym_extra) + /* Now sort the symbols so the local symbols are first. */ + new_syms = ((asymbol **) + bfd_alloc (abfd, + (num_locals + num_globals) * sizeof (asymbol *))); + if (new_syms == NULL) { bfd_set_error (bfd_error_no_memory); return false; } - /* Identify and classify all of the symbols. */ for (idx = 0; idx < symcount; idx++) { - if (!sym_is_global (abfd, syms[idx])) - num_locals++; + asymbol *sym = syms[idx]; + int i; + + if (!sym_is_global (abfd, sym)) + i = num_locals2++; else - num_globals++; + i = num_locals + num_globals2++; + new_syms[i] = sym; + sym->udata.i = i + 1; } - - /* Now provide mapping information. Add +1 for skipping over the - dummy symbol. */ - for (idx = 0; idx < symcount; idx++) + for (asect = abfd->sections; asect; asect = asect->next) { - syms[idx]->udata = (PTR) & sym_extra[idx]; - if (!sym_is_global (abfd, syms[idx])) - sym_extra[idx].elf_sym_num = 1 + num_locals2++; - else - sym_extra[idx].elf_sym_num = 1 + num_locals + num_globals2++; + if (sect_syms[asect->index] != NULL + && sect_syms[asect->index]->flags == 0) + { + asymbol *sym = sect_syms[asect->index]; + int i; + + sym->flags = BSF_SECTION_SYM; + if (!sym_is_global (abfd, sym)) + i = num_locals2++; + else + i = num_locals + num_globals2++; + new_syms[i] = sym; + sym->udata.i = i + 1; + } } + bfd_set_symtab (abfd, new_syms, num_locals + num_globals); + elf_num_locals (abfd) = num_locals; elf_num_globals (abfd) = num_globals; return true; @@ -2271,13 +2270,16 @@ swap_out_syms (abfd, sttp) symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr; symstrtab_hdr->sh_type = SHT_STRTAB; - outbound_syms = (Elf_External_Sym *) - bfd_alloc (abfd, (1 + symcount) * sizeof (Elf_External_Sym)); - if (!outbound_syms) + outbound_syms = ((Elf_External_Sym *) + bfd_alloc (abfd, + (1 + symcount) * sizeof (Elf_External_Sym))); + if (outbound_syms == NULL) { bfd_set_error (bfd_error_no_memory); return false; } + symtab_hdr->contents = (PTR) outbound_syms; + /* now generate the data (for "contents") */ { /* Fill in zeroth symbol and swap it out. */ @@ -2289,6 +2291,7 @@ swap_out_syms (abfd, sttp) sym.st_other = 0; sym.st_shndx = SHN_UNDEF; elf_swap_symbol_out (abfd, &sym, outbound_syms); + ++outbound_syms; } for (idx = 0; idx < symcount; idx++) { @@ -2385,13 +2388,10 @@ swap_out_syms (abfd, sttp) } sym.st_other = 0; - elf_swap_symbol_out (abfd, &sym, - (outbound_syms - + elf_sym_extra (abfd)[idx].elf_sym_num)); + elf_swap_symbol_out (abfd, &sym, outbound_syms); + ++outbound_syms; } - symtab_hdr->contents = (PTR) outbound_syms; - *sttp = stt; symstrtab_hdr->sh_size = _bfd_stringtab_size (stt); symstrtab_hdr->sh_type = SHT_STRTAB; @@ -2558,29 +2558,27 @@ elf_section_from_bfd_section (abfd, asect) Elf_Internal_Shdr *hdr; int maxindex = elf_elfheader (abfd)->e_shnum; - if (asect->owner == NULL) - { - if (bfd_is_abs_section (asect)) - return SHN_ABS; - if (bfd_is_com_section (asect)) - return SHN_COMMON; - if (bfd_is_und_section (asect)) - return SHN_UNDEF; - return -1; - } - - BFD_ASSERT (asect->owner == abfd); + if (bfd_is_abs_section (asect)) + return SHN_ABS; + if (bfd_is_com_section (asect)) + return SHN_COMMON; + if (bfd_is_und_section (asect)) + return SHN_UNDEF; for (index = 0; index < maxindex; index++) { hdr = i_shdrp[index]; if (hdr->bfd_section == asect) return index; + } - if (bed->elf_backend_section_from_bfd_section) + if (bed->elf_backend_section_from_bfd_section) + { + for (index = 0; index < maxindex; index++) { int retval; + hdr = i_shdrp[index]; retval = index; if ((*bed->elf_backend_section_from_bfd_section) (abfd, hdr, asect, &retval)) @@ -2606,7 +2604,7 @@ elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr) symbol chain, so udata is 0. When the linker is generating relocatable output, this section symbol may be for one of the input sections rather than the output section. */ - if (asym_ptr->udata == (PTR) 0 + if (asym_ptr->udata.i == 0 && (flags & BSF_SECTION_SYM) && asym_ptr->section) { @@ -2617,15 +2615,12 @@ elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr) else indx = asym_ptr->section->index; if (elf_section_syms (abfd)[indx]) - asym_ptr->udata = elf_section_syms (abfd)[indx]->udata; + asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i; } - if (asym_ptr->udata) - idx = ((Elf_Sym_Extra *) asym_ptr->udata)->elf_sym_num; - else - { - abort (); - } + idx = asym_ptr->udata.i; + if (idx == 0) + abort (); #if DEBUG & 4 { |