Author: andrew
Date: Wed Jan 25 17:35:11 2017
New Revision: 312764
URL: https://svnweb.freebsd.org/changeset/base/312764

Log:
  Pull the R_AARCH64_TLSDESC code out into a common function and use them in
  both the plt and non-plt case.
  
  This fixes an issue where libraries built with LLD can fail with
  "Unhandled relocation 1031"
  
  PR:           214971
  Obtained from:        1 week
  Sponsored by: DARPA, AFRL

Modified:
  head/libexec/rtld-elf/aarch64/reloc.c

Modified: head/libexec/rtld-elf/aarch64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/aarch64/reloc.c       Wed Jan 25 16:35:57 2017        
(r312763)
+++ head/libexec/rtld-elf/aarch64/reloc.c       Wed Jan 25 17:35:11 2017        
(r312764)
@@ -184,6 +184,18 @@ rtld_tlsdesc_handle(struct tls_data *tls
        return (tlsdesc->index);
 }
 
+static void
+reloc_tlsdesc(Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where)
+{
+       if (ELF_R_SYM(rela->r_info) == 0) {
+               where[0] = (Elf_Addr)_rtld_tlsdesc;
+               where[1] = obj->tlsoffset + rela->r_addend;
+       } else {
+               where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
+               where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj, rela);
+       }
+}
+
 /*
  * Process the PLT relocations.
  */
@@ -204,14 +216,7 @@ reloc_plt(Obj_Entry *obj)
                        *where += (Elf_Addr)obj->relocbase;
                        break;
                case R_AARCH64_TLSDESC:
-                       if (ELF_R_SYM(rela->r_info) == 0) {
-                               where[0] = (Elf_Addr)_rtld_tlsdesc;
-                               where[1] = obj->tlsoffset + rela->r_addend;
-                       } else {
-                               where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
-                               where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj,
-                                   rela);
-                       }
+                       reloc_tlsdesc(obj, rela, where);
                        break;
                default:
                        _rtld_error("Unknown relocation type %u in PLT",
@@ -362,6 +367,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
                                return (-1);
                        }
                        break;
+               case R_AARCH64_TLSDESC:
+                       reloc_tlsdesc(obj, rela, where);
+                       break;
                case R_AARCH64_TLS_TPREL64:
                        def = find_symdef(symnum, obj, &defobj, flags, cache,
                            lockstate);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to