Auxiliary Vector
There are many mechanism for communicating information between kernel & user space application . one of this mechanism is Auxiliary Vector .
Just what is the auxiliary vector?
In essence auxiliary vector is a list of key-value pairs that the ELF binary loader constructs when a new executable image is loaded into a process [Source] .

After construction of the list , ELF binary loader puts auxiliary vectors on the process stack (bottom of the stack) [Source].

So after initialization , a process stack looks something like this :

if we dive deep we gonna find that the auxiliary vector is an array of the following structure :

- a_un : defines the entry value .
- a_type : defines the entry type and contain one of the following values :

the whole list is defined in [include/uapi/linux/auxvec.h] & [include/uapi/asm/auxvec.h] .
Reading the auxiliary vector
at the shell level , we can discover the auxiliary vector that was supplied to an executable by setting LD_SHOW_AUXV environment variable when launching an application :

also the auxiliary vector of each process on the system is accessible via a corresponding /proc/PID/auxv file .

also we can access these parameters inside the program by using this function

#include <stdio.h>
#include <sys/auxv.h>int main() {
unsigned long long entryAddr = getauxval(AT_ENTRY);
printf("0x%llx\n",entryAddr);
}
