aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-sparc.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf32-sparc.c')
-rw-r--r--bfd/elf32-sparc.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c
index 1db5f3a..905b567 100644
--- a/bfd/elf32-sparc.c
+++ b/bfd/elf32-sparc.c
@@ -896,26 +896,34 @@ elf32_sparc_size_dynamic_sections (output_bfd, info)
}
/* If we are generating a shared library, we generate a section
- symbol for each output section. These are local symbols, which
- means that they must come first in the dynamic symbol table.
- That means we must increment the dynamic symbol index of every
- other dynamic symbol. */
+ symbol for each output section for which we might need to copy
+ relocs. These are local symbols, which means that they must come
+ first in the dynamic symbol table. That means we must increment
+ the dynamic symbol index of every other dynamic symbol. */
if (info->shared)
{
- int c, i;
+ int c;
- c = bfd_count_sections (output_bfd);
- elf_link_hash_traverse (elf_hash_table (info),
- elf32_sparc_adjust_dynindx,
- (PTR) &c);
- elf_hash_table (info)->dynsymcount += c;
-
- for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++)
+ c = 0;
+ for (s = output_bfd->sections; s != NULL; s = s->next)
{
- elf_section_data (s)->dynindx = i;
+ if ((s->flags & SEC_LINKER_CREATED) != 0
+ || (s->flags & SEC_ALLOC) == 0
+ || (s->flags & SEC_LOAD) == 0)
+ continue;
+
+ elf_section_data (s)->dynindx = c + 1;
+
/* These symbols will have no names, so we don't need to
fiddle with dynstr_index. */
+
+ ++c;
}
+
+ elf_link_hash_traverse (elf_hash_table (info),
+ elf32_sparc_adjust_dynindx,
+ (PTR) &c);
+ elf_hash_table (info)->dynsymcount += c;
}
return true;
@@ -1630,6 +1638,7 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info)
asection *sdynsym;
asection *s;
Elf_Internal_Sym sym;
+ int c;
/* Set up the section symbols for the output sections. */
@@ -1641,10 +1650,14 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info)
sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
sym.st_other = 0;
+ c = 0;
for (s = output_bfd->sections; s != NULL; s = s->next)
{
int indx;
+ if (elf_section_data (s)->dynindx == 0)
+ continue;
+
sym.st_value = s->vma;
indx = elf_section_data (s)->this_idx;
@@ -1655,12 +1668,13 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info)
(PTR) (((Elf32_External_Sym *)
sdynsym->contents)
+ elf_section_data (s)->dynindx));
+
+ ++c;
}
/* Set the sh_info field of the output .dynsym section to the
index of the first global symbol. */
- elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
- bfd_count_sections (output_bfd) + 1;
+ elf_section_data (sdynsym->output_section)->this_hdr.sh_info = c + 1;
}
return true;