Hay varias cosas que requiere el estándar de C++ que probablemente encontrará.
Lo más importante es que debe haber un código que maneje la construcción de cualquier estática en la unidad de traducción principal antes de que se llame a main, y una función que luego de las principales elimina su destrucción. Además, el estándar requiere una función atexit
que le permite registrar funciones adicionales a las que se debe llamar después de los retornos principales.
Por lo menos, el código de inicio debe ser capaz de construir esta estructura de datos de las funciones que se invocarán en el retorno desde la principal. Esta es una estructura de datos dinámica porque el programa debe agregarla al tiempo de ejecución, y el orden de las llamadas es el opuesto al registro (por lo que normalmente desea una estructura de datos que facilite la incorporación al lugar desde donde camina).
Pero, además, el estándar requiere que las estáticas en otras unidades de traducción se creen antes de que se ejecute cualquier función en esa unidad de traducción. A menudo, los compiladores simplemente arreglan todo en el enlazador para que todos se llamen antes de main, pero eso no es necesario. Esos compiladores que hacen las cosas de manera diferente, luego deben proporcionar los pasos a las rutinas de inicialización en el otro código de la unidad de traducción vinculada que llamará a la primera llamada de función.
Esto es bastante trabajo si utiliza cualquier biblioteca estándar. Recuerde, std :: cout es un objeto estático (duración estática, enlace no estático - alerta de palabras confusamente sobrecargada). Entonces eso significa aumentar las comunicaciones a su consola, que tendrá todas las API necesarias para su plataforma. Hay muchos tales objetos en el estándar.
Y luego, puede haber elementos específicos para su plataforma y/o compilador que preparen el proceso de alguna manera útil, o analicen variables de entorno, o carguen bibliotecas dinámicas/compartidas "estándar", o cosas similares.
Normalmente, salir es simplemente caminar por esa lista y de alguna manera proporcionar el valor de retorno de main al entorno, ya que la mayoría de los sistemas operativos modernos limpian después de ellos, pero puede haber cosas específicas del sistema además de eso.
Muy específico para compiladores y plataformas. Dudo que obtendrás la respuesta exacta que deseas. – Matt
Recomiendo [esta publicación] (http://stackoverflow.com/a/9952374/176769) como una hoja de ruta para cualquier persona de ingeniería inversa-aspirante a gurú. – karlphillip
No tengo experiencia en ingeniería inversa, pero ¿no podría simplemente establecer un punto de interrupción del depurador al inicio de main para obtener la dirección relativa? O, como alternativa, ¿busca principal en un volcado de objetos del ejecutable? – bjhend