Дополнительная информация о таких функциях, как __dyld__dyld_start в MacOS - PullRequest
1 голос
/ 20 марта 2012

В MacOS я вижу стек, который выглядит примерно так (на самом верху стека находится ловушка для рассматриваемого кода, но я хочу понять, как я туда попал)

(gdb) where
...
#4  0x0000000112fdefc8 in appLibInit::appLibInit ()
#5  0x0000000112fdef71 in __sti__$E ()
#6  0x00007fff5fc112f7 in __dyld__ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE ()
#7  0x00007fff5fc0d20c in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#8  0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#9  0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#10 0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#11 0x00007fff5fc0d2f4 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextE ()
#12 0x00007fff5fc038b4 in __dyld__ZN4dyld24initializeMainExecutableEv ()
#13 0x00007fff5fc06ea1 in __dyld__ZN4dyld5_mainEPK11mach_headermiPPKcS5_S5_ ()
#14 0x00007fff5fc01695 in __dyld__ZN13dyldbootstrap5startEPK11mach_headeriPPKcl ()
#15 0x00007fff5fc0103a in __dyld__dyld_start ()
#16 0x0000000100000000 in ?? ()
#17 0x0000000000000001 in ?? ()

Функция appLibInit :: appLibInit - это конструктор C ++ для глобального объекта в нашем коде, поэтому я предполагаю, что я нахожусь в некотором предварительном коде, возможно, обрабатывающем все общие библиотеки, с которыми связаны (странно) рассматриваемый код не является чем-то, с чем мы ожидаем связать себя, если только он не втягивается чем-то другим).

Кажется, что фильтр mac c ++ не декодирует эти символы с префиксом __dyld.

Кто-нибудь знает какие-нибудь документы, описывающие последовательность запуска процесса MacOS, которые, возможно, дадут мне немного больше информации о том, что здесь происходит?

1 Ответ

1 голос
/ 20 марта 2012

Источник для dyld доступен онлайн:

http://www.opensource.apple.com/source/dyld/

Вы можете декодировать искаженные имена символов, просто удалив префикс __dyld. Предполагается, что префикс добавлен для предотвращения конфликтов с пользовательским кодом, который определяет те же функции C ++ (например, если вы сами компилируете части dyld).

В общем, вы смотрите на загрузку и инициализацию библиотеки. Динамическая библиотека может объявить, что функция должна запускаться при загрузке; похоже, что здесь происходит для твоего appLibInit::appLibInit(). (Это может произойти до main(), если библиотека загружена основным двоичным файлом.)

Одним из способов, которым это может происходить в C ++, было бы, если вы объявляете какие-либо объекты глобально, которые имеют конструкторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...