tools/nolibc: add auxiliary vector retrieval for arm64
authorWilly Tarreau <w@1wt.eu>
Tue, 10 Jan 2023 07:24:27 +0000 (08:24 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 10 Jan 2023 21:33:56 +0000 (13:33 -0800)
In the _start block we now iterate over envp to find the auxiliary
vector after the NULL. The pointer is saved into an _auxv variable
that is marked as weak so that it's accessible from multiple units.

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/include/nolibc/arch-aarch64.h

index 2e3d9adc4c4c2dde1da7a33e197ff30ac7bac9f3..383baddef701914dd12478a62c01b6673c284a95 100644 (file)
@@ -170,6 +170,7 @@ struct sys_stat_struct {
 })
 
 char **environ __attribute__((weak));
+const unsigned long *_auxv __attribute__((weak));
 
 /* startup code */
 void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
@@ -182,6 +183,12 @@ void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
                "add x2, x2, x1\n"   //           + argv
                "adrp x3, environ\n"          // x3 = &environ (high bits)
                "str x2, [x3, #:lo12:environ]\n" // store envp into environ
+               "mov x4, x2\n"       // search for auxv (follows NULL after last env)
+               "0:\n"
+               "ldr x5, [x4], 8\n"  // x5 = *x4; x4 += 8
+               "cbnz x5, 0b\n"      // and stop at NULL after last env
+               "adrp x3, _auxv\n"   // x3 = &_auxv (high bits)
+               "str x4, [x3, #:lo12:_auxv]\n" // store x4 into _auxv
                "and sp, x1, -16\n"  // sp must be 16-byte aligned in the callee
                "bl main\n"          // main() returns the status code, we'll exit with it.
                "mov x8, 93\n"       // NR_exit == 93