getauxval函数用法详解
getauxval函数简介
- 头文件包含
#include <sys/auxv.h>
- 函数定义
unsigned long getauxval(unsigned long type );
getauxval函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘getauxval’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <sys/auxv.h>
getauxval函数详细描述
getauxval ()函数从辅助向量中检索值,这是内核的ELF二进制加载器在程序执行时用来向用户空间传递某些信息的一种机制。
辅助向量中的每个条目都由一对值组成:标识该条目表示什么的类型,以及该类型的值。给定参数type ,getauxval ()返回相应的值。
下表给出了每个type返回的值。并非所有的type值都出现在所有的体系结构上。
- AT_BASE程序解释器(通常是动态链接器)的基址。
- AT_BASE_PLATFORM指向字符串的指针(仅限PowerPC和MIPS)。在PowerPC上,这标识了真正的平台;可能不同于MIPS上的AT_PLATFORM "",这标识了ISA级别(从Linux 5.7开始)。
- AT_CLKTCK times (2)计数的频率。该值也可以通过sysconf(_SC_CLK_TCK) 获得
- AT_DCACHEBSIZE数据缓存块大小。
- AT_EGID线程的有效组ID。
- AT_ENTRY可执行文件的入口地址。
- AT_EUID线程的有效用户ID。
- AT_EXECFD程序的文件描述符。
- AT_EXECFN指向字符串的指针,该字符串包含用于执行程序的路径名。
- AT_FLAGS标志(未使用)。
- AT_FPUCW使用FPU控制字(仅限SuperH架构)。这给出了一些关于内核执行的FPU初始化的信息。
- AT_GID线程的实际组ID。
- AT_HWCAP一种体系结构和ABI相关的位掩码,其设置指示详细的处理器功能。位掩码的内容依赖于硬件(例如,有关Intel x86体系结构的详细信息,请参见内核源文件arch/x86/include/asm/cpufeatureh;返回的值是其中描述的数组的第一个32位字)。相同信息的人类可读版本可通过/proc/cpuinfo 获得
- AT_HWCAP2 " (since glibc 218)"关于处理器能力的进一步机器相关提示。
- AT_ICACHEBSIZE指令缓存块大小。
- L1数据高速缓存的AT_L1D_CACHEGEOMETRY几何形状,在底部16位用高速缓存行大小(以字节为单位)编码,在接下来的16位用高速缓存关联性编码。关联性是这样的,如果N是16位值,则高速缓存是N路集合关联的。
- AT_L1D_CACHESIZE L1数据缓存大小。
- L1指令高速缓存的AT_L1I_CACHEGEOMETRY几何图形,编码为AT_L1D_CACHEGEOMETRY
- AT_L1I_CACHESIZE L1指令缓存大小。
- L2缓存的AT_L2_CACHEGEOMETRY几何图形,编码为AT_L1D_CACHEGEOMETRY
- AT_L2_CACHESIZE L2缓存大小。
- L3高速缓存的AT_L3_CACHEGEOMETRY几何图形,编码为AT_L1D_CACHEGEOMETRY
- AT_L3_CACHESIZE三级缓存大小。
- AT_PAGESZ系统页面大小(与sysconf(_SC_PAGESIZE) )返回的值相同
- AT_PHDR可执行文件的程序头的地址。
- AT_PHENT程序头条目的大小。
- AT_PHNUM程序头的数量。
- AT_PLATFORM指向字符串的指针,该字符串标识运行程序的硬件平台。动态链接器在解释rpath值时使用它。
- AT_RANDOM包含随机值的16个字节的地址。
- 如果应该安全地处理此可执行文件,PPP0具有非零值。最常见的情况是,非零值表示进程正在执行set-user-ID或set-group-ID二进制文件(因此其真实和有效的uid或gid彼此不同),或者它通过执行具有功能的二进制文件获得了功能(参见capabilities (7))或者,非零值可能由Linux安全模块触发。当该值为非零时,动态链接器禁用某些环境变量的使用(参见ld-linuxso (8))和glibc更改其行为的其他方面。(另请参见secure_getenv (3))
- AT_SYSINFO VDSO中系统调用函数的入口点。并非在所有架构上都存在/需要(例如,在x86-64上不存在)。
- AT_SYSINFO_EHDR包含虚拟动态共享对象(vDSO)的页面地址,内核创建该对象是为了提供某些系统调用的快速实现。
- AT_UCACHEBSIZE统一缓存块大小。
- AT_UID线程的真实用户ID。
getauxval函数返回值
如果成功,getauxval ()返回对应于type 的值。如果找不到type,则返回0。
getauxval函数错误码
- ENOENT " (since glibc 219)"在辅助向量中找不到对应于type的条目。
getauxval函数其他说明
辅助向量中信息的主要消费者是动态链接器,ld-linuxso (8)辅助向量是一种方便有效的快捷方式,它允许内核传递动态链接器通常或总是需要的一组标准信息。在某些情况下,通过系统调用可以获得相同的信息,但是使用辅助向量更便宜。
辅助向量位于进程地址空间中参数列表和环境的正上方。在运行程序时,可以通过设置 LD_SHOW_AUXV 环境变量来查看提供给程序的辅助向量:
$ LD_SHOW_AUXV=1 sleep 1
任何进程的辅助向量都可以(根据文件权限)通过/proc/[pid]/auxv ;获得。有关更多信息,请参见proc (5)。
评论区