属性构造函数样式函数的参数
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
.
我见过这样的代码:(基于 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
.