C语言 有关于.init_array函数参数的文档吗?



我可以看到许多复制的知识,用.init_array节注册的函数具有命令行参数argc和argv,如main(),但我未能找到任何实际发布的在线文档,证实这是这种情况。

是的,为了清楚起见,函数本身没有"声明为"。init_array,但在这里声明了一个指向函数的指针,"注册"。函数,并且在启动期间由某个迭代器调用。问题仍然存在:请给我一些关于该迭代器传入的参数列表的文档。

我的意图是以一种微妙但通常安全的方式改变动态库中的这些参数,所以我想找到"真正的交易"。

更多信息,请点击下面的链接。

关于栈溢出的一些知识:在Linux上访问main以外的main参数

即使是我最喜欢的Oracle (docs.oracle.com/cd/E23824_01/html/819-0690/chapter3-8.html)也只提到函数被调用,但没有承诺可能有什么参数。就我所见,elf和gcc文档也是如此。

在C/c++ UB偏执的土地上,理想情况下,在我继续进行之前,我需要一些确定这是记录的行为?它存在吗?它能以某种方式被暗示吗?


到目前为止的评论/回答总结:

至少对于GNU libc,这个补丁发生了一个相关的变化:bz# 974。https://sourceware.org/pipermail/libc-alpha/2005-July/019240.html(在glibc的ChangeLog.old/ChangeLog中有提到。16(2005年4月13日)伊恩·阿博特

对我来说,这表明glbc维护者意识到了传递argc/argv/env的需求——这不是偶然的——并将其扩展到主exe注册。它还告诉我们,在此日期之前,它正在为动态库工作。

这是一个有趣的问题,它是否绑定了其他libc实现者来遵循该模式。

我找到了Patrick Horgan写的一篇关于Linux程序启动过程的有趣文章。但我不能保证这个来源的正确性。

至少,它解释了.init_array部分背后的代码:

void __libc_csu_init (int argc, char **argv, char **envp) {
_init ();
const size_t size = __init_array_end - __init_array_start;
for (size_t i = 0; i < size; i++) {
(*__init_array_start [i]) (argc, argv, envp);
}
}

可以看出,__libc_csu_init()函数首先计算.init_arraysection内的元素个数,然后调用每个带有argcargvenvp参数的函数指针。这个函数(__libc_csu_init())在main()之前调用。

注意:.init_array部分似乎是针对ELF二进制格式的。


更新看来__libc_csu_init()的实现(更一般地说,.init_array函数的调用方式)是依赖于平台和libc的。

然而,Linux上的GLIBC似乎可以正确地使用所需的参数调用函数,正如您可以从其源代码中看到的那样。

另外,阅读GLIBC的变更日志,这个行为似乎是在2005年引入的。

最新更新