* elf32-cris.c (cris_elf_relocate_section): <case
authorHans-Peter Nilsson <hp@axis.com>
Tue, 24 Mar 2009 07:57:21 +0000 (07:57 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Tue, 24 Mar 2009 07:57:21 +0000 (07:57 +0000)
R_CRIS_16_DTPREL, R_CRIS_32_DTPREL>: Allow use of non-local
symbols for non-allocated sections.  Don't check whether to
generate R_CRIS_DTPMOD for non-allocated sections.
(cris_elf_gc_sweep_hook) <case R_CRIS_32_DTPREL>: Don't
handle relocation GC:ing if applied to non-allocated section.
(cris_elf_check_relocs): Similar.

bfd/ChangeLog
bfd/elf32-cris.c

index 8336ac4292881b5f09e1ddf6d4302f9f06ea1f23..ea96f891e580a41b6cf3e68d53c0aa1b8ae77281 100644 (file)
@@ -1,5 +1,13 @@
 2009-03-24  Hans-Peter Nilsson  <hp@axis.com>
 
+       * elf32-cris.c (cris_elf_relocate_section): <case
+       R_CRIS_16_DTPREL, R_CRIS_32_DTPREL>: Allow use of non-local
+       symbols for non-allocated sections.  Don't check whether to
+       generate R_CRIS_DTPMOD for non-allocated sections.
+       (cris_elf_gc_sweep_hook) <case R_CRIS_32_DTPREL>: Don't
+       handle relocation GC:ing if applied to non-allocated section.
+       (cris_elf_check_relocs): Similar.
+
        * elf32-cris.c (cris_elf_relocate_section) <case R_CRIS_32_GD>
        <R_CRIS_16_GOT_GD, R_CRIS_32_GOT_GD>: Don't include the TLS size
        when emitting a known TP offset in the GOT.
index 6dc669a493962a4947d0a866436afeec7777b6cb..ed1f3e8d503fe427968ff67cedb12cd6cc21ca87 100644 (file)
@@ -1615,10 +1615,12 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_CRIS_16_DTPREL:
        case R_CRIS_32_DTPREL:
          /* This relocation must only be performed against local
-            symbols.  It's also ok when we link a program and the
-            symbol is defined in an ordinary (non-DSO) object (if
-            it's undefined there, we've already seen an error).  */
+            symbols, or to sections that are not loadable.  It's also
+            ok when we link a program and the symbol is defined in an
+            ordinary (non-DSO) object (if it's undefined there, we've
+            already seen an error).  */
          if (h != NULL
+             && (input_section->flags & SEC_ALLOC) != 0
              && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
              && (info->shared
                  || (!h->def_regular
@@ -1641,14 +1643,16 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              return FALSE;
            }
 
-         BFD_ASSERT (elf_cris_hash_table (info)->dtpmod_refcount != 0);
+         BFD_ASSERT ((input_section->flags & SEC_ALLOC) == 0
+                     || elf_cris_hash_table (info)->dtpmod_refcount != 0);
 
          /* Fill in a R_CRIS_DTPMOD reloc at offset 3 if we haven't
             already done so.  Note that we do this in .got.plt, not
             in .got, as .got.plt contains the first part, still the
             reloc is against .got, because the linker script directs
             (is required to direct) them both into .got.  */
-         if (elf_cris_hash_table (info)->dtpmod_refcount > 0)
+         if (elf_cris_hash_table (info)->dtpmod_refcount > 0
+             && (input_section->flags & SEC_ALLOC) != 0)
            {
              asection *sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
              BFD_ASSERT (sgotplt != NULL);
@@ -2684,6 +2688,10 @@ cris_elf_gc_sweep_hook (bfd *abfd,
          break;
 
        case R_CRIS_32_DTPREL:
+         /* This'd be a .dtpreld entry in e.g. debug info.  */
+         if ((sec->flags & SEC_ALLOC) == 0)
+           break;
+         /* Fall through.  */
        case R_CRIS_16_DTPREL:
          elf_cris_hash_table (info)->dtpmod_refcount--;
          if (elf_cris_hash_table (info)->dtpmod_refcount == 0)
@@ -3151,8 +3159,17 @@ cris_elf_check_relocs (abfd, info, sec, relocs)
         on the first input bfd we found that contained dynamic relocs.  */
       switch (r_type)
        {
-       case R_CRIS_16_DTPREL:
        case R_CRIS_32_DTPREL:
+         if ((sec->flags & SEC_ALLOC) == 0)
+           /* This'd be a .dtpreld entry in e.g. debug info.  We have
+              several different switch statements below, but none of
+              that is needed; we need no preparations for resolving
+              R_CRIS_32_DTPREL into a non-allocated section (debug
+              info), so let's just move on to the next
+              relocation.  */
+           continue;
+         /* Fall through.  */
+       case R_CRIS_16_DTPREL:
          /* The first .got.plt entry is right after the R_CRIS_DTPMOD
             entry at index 3. */
          if (elf_cris_hash_table (info)->dtpmod_refcount == 0)