* elf32-cris.c (cris_elf_relocate_section) <case R_CRIS_32_GD>
authorHans-Peter Nilsson <hp@axis.com>
Wed, 7 Jan 2009 03:28:45 +0000 (03:28 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Wed, 7 Jan 2009 03:28:45 +0000 (03:28 +0000)
<case R_CRIS_16_GOT_GD, R_CRIS_32_GOT_GD>: For a symbol defined in
the program, the known offset starts at the negative size of the
TLS section.
<case R_CRIS_32_IE, R_CRIS_32_GOT_TPREL, R_CRIS_16_GOT_TPREL>:
Similar.

bfd/ChangeLog
bfd/elf32-cris.c

index c114076c85ef837ae710d3db9162bdebff387216..da237ce608d62212bef485fc6a9520ffde748f8a 100644 (file)
@@ -1,3 +1,12 @@
+2009-01-07  Hans-Peter Nilsson  <hp@axis.com>
+
+       * elf32-cris.c (cris_elf_relocate_section) <case R_CRIS_32_GD>
+       <case R_CRIS_16_GOT_GD, R_CRIS_32_GOT_GD>: For a symbol defined in
+       the program, the known offset starts at the negative size of the
+       TLS section.
+       <case R_CRIS_32_IE, R_CRIS_32_GOT_TPREL, R_CRIS_16_GOT_TPREL>:
+       Similar.
+
 2009-01-05  Joel Sherrill <joel.sherrill@oarcorp.com>
 
        * config.bfd: Add lm32-*-rtems*.
index ea268fc9510da31255afe184c045ccb195110582..dbc00ba60890e06cdc83dca44efb07d2752b8fc4 100644 (file)
@@ -1721,8 +1721,9 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              bfd_vma off;
 
              /* The symbol is defined in the program, so just write
-                (1, known_tpoffset) into the GOT.  */
+                (1, -prog_tls_size+known_tpoffset) into the GOT.  */
              relocation -= elf_hash_table (info)->tls_sec->vma;
+             relocation -= elf_hash_table (info)->tls_sec->size;
 
              if (h != NULL)
                {
@@ -1872,8 +1873,9 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              bfd_vma off;
 
              /* The symbol is defined in the program, so just write
-                the known_tpoffset into the GOT.  */
+                the -prog_tls_size+known_tpoffset into the GOT.  */
              relocation -= elf_hash_table (info)->tls_sec->vma;
+             relocation -= elf_hash_table (info)->tls_sec->size;
 
              if (h != NULL)
                off = h->got.offset;
@@ -2001,7 +2003,9 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
 
          /* NULL if we had an error.  */
          relocation -= elf_hash_table (info)->tls_sec == NULL
-           ? 0 : elf_hash_table (info)->tls_sec->vma;
+           ? 0
+           : (elf_hash_table (info)->tls_sec->vma
+              + elf_hash_table (info)->tls_sec->size);
 
          /* The TLS-relative offset is the relocation.  */
          break;