En Linux, puedo registrar una rutina que se ejecutará antes que main. Por ejemplo:
#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;Al compilar esto con GCC y vincularlo, la función myinit se ejecutará antes que main.
¿Hay alguna forma de hacer esto en Mac OSX y MACH-O?
Gracias.
Puede colocar la función en la sección de datos __mod_init_func del binario Mach-O.
De la referencia de formato Mach-O :
__DATOS,__mod_init_func
Funciones de inicialización del módulo. El compilador de C++ coloca constructores estáticos aquí.
ejemplo.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; } Construyo tu ejemplo con clang en la plataforma OS X:
$ clang -Wall example.c $ ./a.out example.c: myinit example.c: mainLa forma más fácil es especificar la función para que sea constructor usando el atributo constructor. El atributo constructor hace que la función se llame automáticamente antes de que la ejecución entre en main() . De manera similar, el atributo destructor hace que la función se llame automáticamente después de que se complete main() o se llame a exit() . También puede especificar prioridad opcional si tiene varias funciones
por ejemplo __attribute__((constructor(100)))
#include <stdio.h> __attribute__((constructor)) void myinit() { printf("my init\n"); } int main() { printf("my main\n"); return 0; } __attribute__((destructor)) void mydeinit() { printf("my deinit\n"); } $ clang -Wall example.c $ ./a.out my init my main my deinitDescargo de responsabilidad: generalmente desaconsejo lo que estoy a punto de decir. Tener código ejecutándose antes o después de main hace que las cosas sean menos predecibles. No estoy seguro de por qué no dejaría que la primera línea de main invoque su myinit , pero supongo que todos tienen una razón. Aquí va.
No sé mucho sobre Mach-O, pero la forma más sencilla de ejecutar el código antes de main es vincular una clase de C++ que tenga definida una instancia global correspondiente. Puede hacer esto independientemente de su código "C" sin tener que modificar nada más. También puede hacer que este código C++ invoque funciones C definidas en otra parte de su código. En el siguiente ejemplo, muestro un ejemplo simple de cómo invocaría su myinit .
En un archivo .cpp (o .cc) independiente, declare una clase C++ muy simple con un constructor que llame a su "función myinit".
// forward declare your myinit function and designate "C" linkage extern "C" myinit(int, char**, char**); class CodeToRunBeforeMain { public: CodeToRunBeforeMain() { // invoke your myinit function here myinit(0, NULL, NULL); } }; // global instance - constructor will run before main. CodeToRunBeforeMain g_runBeforeMain;El enfoque anterior no reconoce argc, argv o envp. Con suerte, eso no es importante.