2010-10-01 Thomas Schwinge <thomas@codesourcery.com>
authorThomas Schwinge <tschwinge@gnu.org>
Fri, 1 Oct 2010 11:22:40 +0000 (11:22 +0000)
committerThomas Schwinge <tschwinge@gnu.org>
Fri, 1 Oct 2010 11:22:40 +0000 (11:22 +0000)
* elf32-arm.c (elf32_arm_size_stubs): Don't choke on local symbols in
SHN_UNDEF, SHN_ABS, SHN_COMMON.

bfd/ChangeLog
bfd/elf32-arm.c

index 2b0b5b0ad200b00384042ac0bf784542e0285284..f9aba1cddf46012571949df6bd1fd24355890fa9 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-01  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * elf32-arm.c (elf32_arm_size_stubs): Don't choke on local symbols in
+       SHN_UNDEF, SHN_ABS, SHN_COMMON.
+
 2010-09-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/11812
index 2125582ee8a87340ac6f711e929f8776a8ad5581..fb3e0a3a2340a9a842818f0424bde5388c6fa0b1 100644 (file)
@@ -4486,7 +4486,6 @@ elf32_arm_size_stubs (bfd *output_bfd,
                    {
                      /* It's a local symbol.  */
                      Elf_Internal_Sym *sym;
-                     Elf_Internal_Shdr *hdr;
 
                      if (local_syms == NULL)
                        {
@@ -4502,8 +4501,16 @@ elf32_arm_size_stubs (bfd *output_bfd,
                        }
 
                      sym = local_syms + r_indx;
-                     hdr = elf_elfsections (input_bfd)[sym->st_shndx];
-                     sym_sec = hdr->bfd_section;
+                     if (sym->st_shndx == SHN_UNDEF)
+                       sym_sec = bfd_und_section_ptr;
+                     else if (sym->st_shndx == SHN_ABS)
+                       sym_sec = bfd_abs_section_ptr;
+                     else if (sym->st_shndx == SHN_COMMON)
+                       sym_sec = bfd_com_section_ptr;
+                     else
+                       sym_sec =
+                         bfd_section_from_elf_index (input_bfd, sym->st_shndx);
+
                      if (!sym_sec)
                        /* This is an undefined symbol.  It can never
                           be resolved. */