Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

264
Vistas
Con MACH-O, ¿hay alguna forma de registrar una función que se ejecutará antes que la principal?

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.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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: main
over 4 years ago · Santiago Trujillo Denunciar

0

La 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 deinit
over 4 years ago · Santiago Trujillo Denunciar

0

Descargo 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".

foo.cpp

 // 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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda