Search code examples
cmacosmach-o

With MACH-O is there a way to register a function that will run before main?


Under Linux, I can register a routine that will run before main. For example:

#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;

By compiling this with GCC and linking it in, the function myinit will be run before main.

Is there way to do this under Mac OSX and MACH-O?

Thanks.


Solution

  • You could place the function in __mod_init_func data section of Mach-O binary.

    From Mach-O format reference:

    __DATA,__mod_init_func

    Module initialization functions. The C++ compiler places static constructors here.

    example.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;
    }
    

    I build your example with clang on OS X platform:

    $ clang -Wall example.c
    $ ./a.out
    example.c: myinit
    example.c: main