[PATCH] aarch64: Handle fewer relocations for RTLD_BOOTSTRAP

Fangrui Song maskray@google.com
Sat Jun 11 02:32:35 GMT 2022


On 2022-06-05, Fangrui Song wrote:
>The RTLD_BOOTSTRAP branch is used to relocate ld.so itself.  It only
>needs to handle RELATIVE, GLOB_DAT, and JUMP_SLOT.
>
>Tested on aarch64-linux-gnu.
>---
> sysdeps/aarch64/dl-machine.h | 33 +++++++++++++++------------------
> 1 file changed, 15 insertions(+), 18 deletions(-)
>
>diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
>index 292abe5152..ae8b14425a 100644
>--- a/sysdeps/aarch64/dl-machine.h
>+++ b/sysdeps/aarch64/dl-machine.h
>@@ -178,7 +178,9 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
>       return;
>   else
>     {
>+# ifndef RTLD_BOOTSTRAP
>       const ElfW(Sym) *const refsym = sym;
>+# endif
>       struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
> 					      r_type);
>       ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
>@@ -191,6 +193,18 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
>
>       switch (r_type)
> 	{
>+	case AARCH64_R(GLOB_DAT):
>+	case AARCH64_R(JUMP_SLOT):
>+	  *reloc_addr = value + reloc->r_addend;
>+	  break;
>+
>+# ifndef RTLD_BOOTSTRAP
>+	case AARCH64_R(ABS32):
>+#  ifdef __LP64__
>+	case AARCH64_R(ABS64):
>+#  endif
>+	  *reloc_addr = value + reloc->r_addend;
>+	  break;
> 	case AARCH64_R(COPY):
> 	  if (sym == NULL)
> 	      break;
>@@ -210,30 +224,17 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> 		  ? sym->st_size : refsym->st_size);
> 	  break;
>
>-	case AARCH64_R(RELATIVE):
>-	case AARCH64_R(GLOB_DAT):
>-	case AARCH64_R(JUMP_SLOT):
>-	case AARCH64_R(ABS32):
>-#ifdef __LP64__
>-	case AARCH64_R(ABS64):
>-#endif
>-	  *reloc_addr = value + reloc->r_addend;
>-	  break;
>-
> 	case AARCH64_R(TLSDESC):
> 	  {
> 	    struct tlsdesc volatile *td =
> 	      (struct tlsdesc volatile *)reloc_addr;
>-#ifndef RTLD_BOOTSTRAP
> 	    if (! sym)
> 	      {
> 		td->arg = (void*)reloc->r_addend;
> 		td->entry = _dl_tlsdesc_undefweak;
> 	      }
> 	    else
>-#endif
> 	      {
>-#ifndef RTLD_BOOTSTRAP
> # ifndef SHARED
> 		CHECK_STATIC_TLS (map, sym_map);
> # else
>@@ -245,7 +246,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> 		  }
> 		else
> # endif
>-#endif
> 		  {
> 		    td->arg = (void*)(sym->st_value + sym_map->l_tls_offset
> 				      + reloc->r_addend);
>@@ -256,14 +256,10 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> 	  }
>
> 	case AARCH64_R(TLS_DTPMOD):
>-#ifdef RTLD_BOOTSTRAP
>-	  *reloc_addr = 1;
>-#else
> 	  if (sym_map != NULL)
> 	    {
> 	      *reloc_addr = sym_map->l_tls_modid;
> 	    }
>-#endif
> 	  break;
>
> 	case AARCH64_R(TLS_DTPREL):
>@@ -286,6 +282,7 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> 	    value = elf_ifunc_invoke (value);
> 	  *reloc_addr = value;
> 	  break;
>+# endif /* !RTLD_BOOTSTRAP */
>
> 	default:
> 	  _dl_reloc_bad_type (map, r_type, 0);
>-- 
>2.36.1.255.ge46751e96f-goog

Cc machine maintainers


More information about the Libc-alpha mailing list