.init_array段注册函数传入参数的官方文档查询
.init_array段注册函数调用参数的官方依据说明
核心问题
目前业界存在广泛流传的说法:注册到.init_array段的函数会和main()一样接收命令行参数argc、argv以及环境变量参数,但暂未找到正式发布的官方文档可以佐证这一结论。
需要明确的是:函数本身并非存储在.init_array段中,而是将指向该函数的指针注册到该段完成声明,程序启动时由加载器的迭代逻辑遍历该段并调用所有注册函数。
提问者的核心诉求为:获取加载器调用.init_array中注册函数时传入的参数列表的官方文档说明,确保生产环境落地的方案不存在未定义行为风险。
提问者的使用场景为:需要在动态库中以隐蔽、通用且安全的方式修改命令行参数,需要直接访问内存中真实的参数数据,不采用读取/proc/self/路径的方案。
现有公开资料排查结果
- ELF官方规范、GCC官方文档均未提及该调用约定的参数定义
- Oracle公开的Solaris系统相关开发文档仅说明
.init_array段的函数会在程序启动阶段被调用,未明确具体传入的参数列表 - 现有公开技术讨论也未给出该调用约定的官方文档出处
现有实现侧佐证
目前可查的GNU libc实现历史中,该调用逻辑在BZ #974补丁中完成过变更,提交记录为2005-04-13由H.J. Lu提交,记录在glibc的ChangeLog.old/ChangeLog.16中:
- 该补丁的相关说明证明glibc维护者明确知晓向
.init_array注册函数传递argc/argv/env参数的逻辑,并非偶然的实现细节 - 该补丁将该特性扩展到了主可执行文件的
.init_array注册函数中,也证明该逻辑在此补丁发布之前已经对动态库场景生效
注意:该调用约定仅在GNU libc实现下得到验证,其他libc实现是否遵循该模式暂无统一说明,跨平台使用存在兼容性风险
内容的提问来源于stack exchange,提问作者Gem Taylor
相关产品推荐
相关产品推荐

