Ассемблирование без секретов


Листинг 6 пример простейшей программы hello.c которую мы собираемся ассемблировать всю целиком


Транслируем программу MASM'ом, последнюю версию которого можно позаимствовать из NTDDK: "ml /c /coff hello.asm", где "/c" – ключ, означающий "только ассемблировать, не линковать" (ликованием мы займемся самостоятельно, только позже), "/coff" – транслировать в coff-файл (по умолчанию создается omf с которым мало кто из линкеров умеет работать). Ну а "hello.asm" – имя нашего файла. MASM ругается: "warning A4022: with /coff switch, leading underscore required for start address: start", но вроде бы ассемблирует. Постойте! Но ведь у нас уже есть метка start, заданная в качестве стартового адреса! Что же транслятору еще надо?! Ебанный Microsoft! MASM хочет иметь "_start" (с подчеркиваем), а у нас подчеркивания и нету! Выход: заменить start на _start или в модели паияти указать тип вызовов "stdcall".

Теперь программа ассемблируется без проблем и наступает черед ее линковать. Это делается так: "link /SUBSYSTEM:WINDOWS hello.obj KERNEL32.LIB USER32.lib", где "SUBSYSTEM" – ключ, отвечающий за выбор подсистемы (в данном случае WINDOWS, еще есть CONSOLE для консольных программ и NATIVE – для драйверов), "hello.obj" – имя линкуемого файла, KERNEL32.LIB и USER32.LIB — имена необходимых библиотек, поставляемых вместе с Platform SDK. Если же SDK нет, линкер ms link может сгенерировать их самостоятельно, стоит только указать ему ключ "/IMPLIB:KERNEL32.DLL". Откуда мы знаем, какие библиотеки нужно подключать? Ответ дают вызываемые API-функции: ExitProcrss, экспортируемая KERNEL32.DLL и MessageBoxA, экспортируемая USER32.DLL, о чем написано в SDK. Если же SDK нет — смотрите экспорты всех системных библиотек любой подходящей утилитой типа dumpbin.

Только все равно ни фига у нас не линкуется!

 

hello2.obj : error LNK2001: unresolved external symbol _ExitProcess

hello2.obj : error LNK2001: unresolved external symbol _MessageBoxA

hello2.exe : fatal error LNK1120: 2 unresolved externals




- Начало -  - Назад -  - Вперед -