#define AT_NULL 0 /* end of vector */
#define AT_IGNORE 1 /* entry should be ignored */
#define AT_EXECFD 2 /* file descriptor of program */
#define AT_PHDR 3 /* program headers for program */
#define AT_PHENT 4 /* size of program header entry */
#define AT_PHNUM 5 /* number of program headers */
#define AT_PAGESZ 6 /* system page size */
#define AT_BASE 7 /* base address of interpreter */
#define AT_FLAGS 8 /* flags */
#define AT_ENTRY 9 /* entry point of program */
#define AT_NOTELF 10 /* program is not ELF */
#define AT_UID 11 /* real uid */
#define AT_EUID 12 /* effective uid */
#define AT_GID 13 /* real gid */
#define AT_EGID 14 /* effective gid */
#define AT_PLATFORM 15 /* string identifying CPU for optimizations */
#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
#define AT_CLKTCK 17 /* frequency at which times() increments */
/* AT_* values 18 through 22 are reserved */
#define AT_SECURE 23 /* secure mode boolean */
#define AT_BASE_PLATFORM 24 /* string identifying real platform, may
* differ from AT_PLATFORM. */
#define AT_RANDOM 25 /* address of 16 random bytes */
#define AT_HWCAP2 26 /* extension of AT_HWCAP */
#define AT_EXECFN 31 /* filename of program */
#define AT_SYSINFO 32 /*vsyscall entry point at some architectures, use should be avoided*/
#define AT_SYSINFO_EHDR 33 /*vDSO base address*/
Address space
以linux-amd64为例,程序入口点为_rt0_amd64_linux,此时rsp指向的值为argc,rsp+0x8指向argv[0]的地址,依次计算。
关于ELF Auxiliary Vector
ELF Auxiliary Vector可以用来传递内核信息给用户空间,参考About ELF Auxiliary Vectors 其值定义在include/uapi/linux/auxvec.h和arch/ia64/include/uapi/asm/auxvec.h。
可以执行
LD_SHOW_AUXV=1 /bin/true
来查看ELF Auxiliary Vector的值。view example