Существуют различные вещи, которые требуются стандарту C++, с которым вы, вероятно, столкнетесь.
Самое главное то, что должен быть код, который обрабатывает конструкцию любой статики в основном блоке перевода до вызова main и функцию, которая после основных листьев обрабатывает их уничтожение. Кроме того, для стандарта требуется функция atexit
, которая позволяет регистрировать дополнительные функции, которые будут вызываться после основных возвратов.
Итак, как минимум, код запуска должен быть способен построить эту структуру данных функций, которые будут вызваны при возврате из main. Это динамическая структура данных, потому что она должна быть добавлена в среду выполнения программой, а порядок вызовов противоположно регистрации (так как обычно вам нужна структура данных, которая делает добавление к месту, из которого вы легко переходите).
Но, кроме того, стандарт требует, чтобы статика в других единицах перевода была создана до того, как какая-либо функция будет выполнена в этой единицы перевода. Часто компиляторы просто упорядочивают все в компоновщике, чтобы все они вызывались до main, но это не требуется. Эти компиляторы, которые делают что-то по-другому, затем должны предоставлять thunks для инициализационных подпрограмм в другом связанном коду единицы перевода, который будет вызываться при первом вызове функции.
Только это довольно немного работы, если вы используете какую-либо стандартную библиотеку. Помните, std :: cout - это статический объект (статическое время жизни, а не статическая связь - путано перегруженное предупреждение). Таким образом, это означает создание коммуникаций с вашей консолью, которые будут иметь необходимые API для вашей платформы. В стандарте есть много таких объектов.
И тогда могут быть вещи, специфичные для вашей платформы и/или компилятора, которые подготавливают процесс каким-либо полезным способом или анализируют переменные окружения или загружают «стандартные» динамические/разделяемые библиотеки или подобные материалы.
Как правило, выход просто идет по этому списку и как-то обеспечивает возвращаемое значение основного для окружающей среды, так как большинство современных ОС очищаются после себя, но в дополнение к этому может быть и системный специфический материал.
Очень специфический компилятор и платформа. Я сомневаюсь, что вы получите точный ответ. – Matt
Я рекомендую [этот пост] (http://stackoverflow.com/a/9952374/176769) в качестве дорожной карты любому человеку, обратившемуся к инженеру-гуру. – karlphillip
У меня нет опыта в обратном проектировании, но разве вы не могли бы просто установить точку прерывания отладчика в начале main, чтобы получить относительный адрес? Или, альтернативно, найдите главный объект в дампе объекта исполняемого файла? – bjhend