X32: Add REX prefix to encode R_X86_64_GOTTPOFF
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
index 38c837a76040a01b75281ef0a28d7e54004b65c4..d0ed8a7e0769aef1d7c40b4563306e2805f4ec3c 100644 (file)
@@ -4283,17 +4283,27 @@ direct:
              else if (ELF32_R_TYPE (rel->r_info) == R_X86_64_GOTTPOFF)
                {
                  /* IE->LE transition:
-                    Originally it can be one of:
+                    For 64bit, originally it can be one of:
                     movq foo@gottpoff(%rip), %reg
                     addq foo@gottpoff(%rip), %reg
                     We change it into:
                     movq $foo, %reg
                     leaq foo(%reg), %reg
-                    addq $foo, %reg.  */
+                    addq $foo, %reg.
+                    For 32bit, originally it can be one of:
+                    movq foo@gottpoff(%rip), %reg
+                    addl foo@gottpoff(%rip), %reg
+                    We change it into:
+                    movq $foo, %reg
+                    leal foo(%reg), %reg
+                    addl $foo, %reg. */
 
                  unsigned int val, type, reg;
 
-                 val = bfd_get_8 (input_bfd, contents + roff - 3);
+                 if (roff >= 3)
+                   val = bfd_get_8 (input_bfd, contents + roff - 3);
+                 else
+                   val = 0;
                  type = bfd_get_8 (input_bfd, contents + roff - 2);
                  reg = bfd_get_8 (input_bfd, contents + roff - 1);
                  reg >>= 3;
@@ -4313,8 +4323,8 @@ direct:
                    }
                  else if (reg == 4)
                    {
-                     /* addq -> addq - addressing with %rsp/%r12 is
-                        special  */
+                     /* addq/addl -> addq/addl - addressing with %rsp/%r12
+                        is special  */
                      if (val == 0x4c)
                        bfd_put_8 (output_bfd, 0x49,
                                   contents + roff - 3);
@@ -4328,7 +4338,7 @@ direct:
                    }
                  else
                    {
-                     /* addq -> leaq */
+                     /* addq/addl -> leaq/leal */
                      if (val == 0x4c)
                        bfd_put_8 (output_bfd, 0x4d,
                                   contents + roff - 3);
@@ -5541,9 +5551,10 @@ elf_x86_64_add_symbol_hook (bfd *abfd,
       return TRUE;
     }
 
-  if ((abfd->flags & DYNAMIC) == 0
-      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
-         || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
+  if ((ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
+       || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)
+      && (abfd->flags & DYNAMIC) == 0
+      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
     elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
 
   return TRUE;
This page took 0.024812 seconds and 4 git commands to generate.