属性构造函数样式函数的参数

Arguments to attribute constructor style functions

我见过这样的代码:(基于 Apple 的代码)

__attribute__((constructor))
void do_action(int argc, const char **argv, const char **envp, const char **things, struct ProgramVars *)
{
   //
}

这很奇怪,因为我读到构造函数样式的函数应该是无效的。这些参数来自哪里,我可以选择这些参数吗? gcc/clang 这是 Apple 独有的东西吗?

此代码应该与 DYLD_INSERT_LIBRARIES、(Linux 的 LD_PRELOAD)一起使用。 这是它获得参数的特殊原因吗?

具有属性 constructor 的函数可以具有与 main 相同的参数。他们不能不同。 LD_PRELOAD 与它没有任何共同之处。此功能主要基于 glibc 库(不了解其他库)并且适用于所有使用 glibc 并支持构造函数属性的编译器。在 Linux 上工作正常。

查看这段代码,您的函数 do_action 被调用的地方:

for (size_t i = 0; i < size; i++)
  (*__init_array_start [i]) (argc, argv, envp);

放在路径*csu/elf-init.c

内的glibc库中

我也认为,你的参数struct ProgramVars *不能赋值,只能是nullptr.