使用 MACH-O 有没有办法注册一个将在 main 之前运行的函数?

use*_*881 5 c macos mach-o

在 Linux 下,我可以注册一个将在 main 之前运行的例程。例如:

#include <stdio.h>

void myinit(int argc, char **argv, char **envp) {
  printf("%s: %s\n", __FILE__, __FUNCTION__);
}
__attribute__((section(".init_array"))) typeof(myinit) *__init = myinit;
Run Code Online (Sandbox Code Playgroud)

通过使用 GCC 编译并链接它,函数myinit将在 main 之前运行。

有没有办法在 Mac OSX 和 MACH-O 下做到这一点?

谢谢。

baf*_*baf 7

您可以将该函数放在__mod_init_funcMach-O 二进制文件的数据部分。

Mach-O 格式参考

__DATA,__mod_init_func

模块初始化函数。C++ 编译器在此处放置静态构造函数。

例子.c

#include <stdio.h>

void myinit(int argc, char **argv, char **envp) {
  printf("%s: %s\n", __FILE__, __FUNCTION__);
}
__attribute__((section("__DATA,__mod_init_func"))) typeof(myinit) *__init = myinit;

int main() {
  printf("%s: %s\n", __FILE__, __FUNCTION__);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang在 OS X 平台上构建您的示例:

$ clang -Wall example.c
$ ./a.out
example.c: myinit
example.c: main
Run Code Online (Sandbox Code Playgroud)