gpt4 book ai didi

c - .init_array 函数参数的任何文档?

转载 作者:行者123 更新时间:2023-12-04 11:25:26 27 4
gpt4 key购买 nike

我可以看到很多复制的知识,即在 .init_array 部分注册的函数具有命令行参数 argc 和 argv,例如 main(),但我无法在网上找到任何实际发布的文档来确认情况确实如此。
是的,为了清楚起见,函数本身没有在 .init_array 中“声明”,而是在那里声明了一个指向该函数的指针,“注册”了该函数,并在启动期间由某个迭代器调用。问题仍然存在:向我展示该迭代器传入的参数列表的一些文档。
我的目的是以一种微妙但通常安全的方式从动态库中更改这些参数,所以我想在内存中找到“真正的交易”——而不是从/proc/self/中找到。
如果你想和我一样了解更多,请点击下面的链接。如果您想了解更多,请点赞?
一些堆栈溢出知识:Accessing main arguments outside of main on Linux
甚至我最喜欢的 Oracle ( docs.oracle.com/cd/E23824_01/html/819-0690/chapter3-8.html ) 也只提到函数被调用,但没有 promise 可能有什么参数。据我所知,与 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-04-13 H.J. Lu. 中有提到) –
伊恩·阿博特
对我来说,这表明 glbc 维护者意识到传递 argc/argv/env 的要求——这不是偶然的——并将其扩展到主要的 exe 注册。它还告诉我们它在该日期之前适用于动态库。
这是否会绑定(bind)其他 libc 实现者以遵循该模式是一个有趣的问题。

最佳答案

我找到了这个 interesting article about Linux programs' start-up procedure by Patrick Horgan .但我可能不保证这个来源的正确性。
至少,它解释了 .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_array里面的元素个数部分,然后调用每个带参数的函数指针 argc , argvenvp .这个函数( __libc_csu_init() )在 main() 之前被调用.
注意: .init_array部分似乎特定于 ELF 二进制格式。

更新
看来执行 __libc_csu_init() (更一般地说, .init_array 函数的调用方式)是平台相关的和 libc 相关的。
但是,Linux 上的 GLIBC 似乎可以正确调用具有所需参数的函数,正如您从 its source code 中看到的那样。 .
另外,阅读 GLIBC changelog ,看来这种行为是在 2005 年引入的。

关于c - .init_array 函数参数的任何文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69316672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com