我见过这样的代码:(基于Apple的代码)
__attribute__((constructor))
void do_action(int argc, const char **argv, const char **envp, const char **things, struct ProgramVars *)
{
//
}
这很奇怪,因为我读到构造函数样式函数应该是无效的。这些参数来自何处,我可以选择这些参数吗?对于gcc / clang来说这只是苹果吗?
此代码应与DYLD_INSERT_LIBRARIES一起使用,(Linux' LD_PRELOAD)。 这是为什么它得到参数的特殊原因吗?
答案 0 :(得分:3)
属性lvalue
的函数可以与constructor
具有相同的参数。它们可能不同。 LD_PRELOAD没有什么共同之处。此功能主要基于glibc库(不了解其他人),并且对于使用glibc和支持构造函数属性的所有编译器都是可接受的。在Linux上它工作正常。
查看代码中的函数main
:
do_action
它放在路径* csu / elf-init.c
中的glibc库中我也认为,您的论证for (size_t i = 0; i < size; i++)
(*__init_array_start [i]) (argc, argv, envp);
无法分配,只能struct ProgramVars *
。