#include #include #include #include #include extern char **environ; int __captured_argc; char **__captured_argv; char **__captured_envp; Elf64_auxv_t *__captured_auxv; void _capture_args(int argc, char **argv, char **envp) { __captured_argc = argc; __captured_argv = argv; __captured_envp = envp; while(*envp) envp++; __captured_auxv = (Elf64_auxv_t*)(envp + 1); } static void * initarray_entry __attribute__((section(".preinit_array"), used)) = (void*)_capture_args; int main() { printf("envp = %p\n", __captured_envp); for (int i = 0; __captured_auxv[i].a_type != AT_NULL; i++) { char *desc = ""; if (__captured_auxv[i].a_type == AT_SYSINFO) desc = "AT_SYSINFO"; else if (__captured_auxv[i].a_type == AT_SYSINFO_EHDR) desc = "AT_SYSINFO_EHDR"; printf("aux type %02u = 0x%016lX %s\n", __captured_auxv[i].a_type, (long)__captured_auxv[i].a_un.a_val, desc); } return 0; }