Module Name: src Committed By: nisimura Date: Mon Aug 28 06:59:26 UTC 2017
Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: explain AARCH64 PLT design To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 Wed Aug 23 09:17:48 2017 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Mon Aug 28 06:59:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $ */ +/* $NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -44,9 +44,36 @@ void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); +/* + * AARCH64 PLT looks like this; + * + * PLT HEADER <8 instructions> + * PLT ENTRY #0 <4 instructions> + * PLT ENTRY #1 <4 instructions> + * . + * . + * PLT ENTRY #n <4 instructions> + * + * PLT HEADER + * stp x16, x30, [sp, #-16]! + * adrp x16, (GOT+16) + * ldr x17, [x16, #PLT_GOT+0x10] + * add x16, x16, #PLT_GOT+0x10 + * br x17 + * nop + * nop + * nop + * + * PLT ENTRY #n + * adrp x16, PLTGOT + n * 8 + * ldr x17, [x16, PLTGOT + n * 8] + * add x16, x16, :lo12:PLTGOT + n * 8 + * br x17 + */ void _rtld_setup_pltgot(const Obj_Entry *obj) { + obj->pltgot[1] = (Elf_Addr) obj; obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start; }