Я покажу как скомпилировать программу на Microsoft Visual Studio 2013, размером в 1Кб.
автор: ice (coru.ws)
====== example 1 ======
Программа будет “сверхсложной”
#include <Windows.h> void entry(){ }
Для компиляции я буду использовать makefile
SRC=main.cpp OUT=example1.exe LIB=ntdll.lib build: @cl $(SRC) /Fo./ /c /GS- /Gz /TP /Od /W0 /nologo @link *.obj /OUT:$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIB) @del *.obj
Немного расскажу о структуре makefile
SRC, OUT, LIB – это переменные и могут называться как захотите
Для инициализации переменной используется такая запись SRC=main.cpp, а если ей захочется воспользоваться то нужно записывать вот в такой форме $(SRC)
Кроме переменных в файле есть метки “build” их может быть тоже сколько душе угодно.
За меткой идут команды, и перед каждой командой в строке должна стоять табуляция.
Параметры компилятора
- /Fo – опция которая указывает директорию где будут создаваться объектные файлы
- /c – компиляция без связывания
- /GS- – проверка безопасности буфера отключена
- /Gz – stdcall конвенция вызова функций (по желанию)
- /TP – С++ язык программирования
- /Od – оптимизация отключена
- /W0 – уровень предупреждений
- /nologo – не выводить логотип
Параметры линкера
- /NOLOGO – не выводить логотип
- /OUT: – путь до выходного файла
- /NODEFAULTLIB – не использовать стандартные библиотеки
- /SUBSYSTEM:WINDOWS,5.01 – тип gui программа, с минимальной поддержкой xp
- /ENTRY:”entry” – точка входа (иначе студия генерирует свой стаб)
- /DYNAMICBASE – aslr активировать
- /FIXED:No – генерировать релоки
Для компиляции используем nmake, для этого у студии есть батник “VS2013 x86 Native Tools Command Prompt”, запускам его переходим в папку с проектом, и компилируем: nmake build
Вот так выглядит точка входа программы после компиляции, почти как писать на ассемблере)
.00401000: 55 push ebp .00401001: 8BEC mov ebp,esp .00401003: 5D pop ebp .00401004: C3 retn
====== example 2 ======
Немного посложнее программа
#include <Windows.h> void entry(){ char buf[100]; strcpy(buf,"Hello"); MessageBoxA(0,buf,"Title",0); }
makefile
SRC=main.cpp OUT=example2.exe LIB=user32.lib ntdll.lib build: @cl $(SRC) /Fo./ /c /GS- /Gz /TP /Od /W0 /nologo @link *.obj /OUT:$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIB) @del *.obj
так выглядит после компиляции
.00401000: 55 push ebp .00401001: 8BEC mov ebp,esp .00401003: 83EC64 sub esp,064 ;'d' .00401006: 6810204000 push 000402010 ;'Hello' --↓1 .0040100B: 8D459C lea eax,[ebp][-064] .0040100E: 50 push eax .0040100F: E81A000000 call strcpy --↓2 .00401014: 83C408 add esp,8 .00401017: 6A00 push 0 .00401019: 6818204000 push 000402018 ;'Title' --↓3 .0040101E: 8D4D9C lea ecx,[ebp][-064] .00401021: 51 push ecx .00401022: 6A00 push 0 .00401024: FF1500204000 call MessageBoxA .0040102A: 8BE5 mov esp,ebp .0040102C: 5D pop ebp .0040102D: C3 retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
====== example 3 ======
В предыдущих вариантах компилировались программы без отладочных символов, но для отладки в студии они нужны, поэтому был создан более универсальный makefile
SRC=main.cpp NAME=example3 OUT=$(NAME).exe DEBUG=debug RELEASE=release LIBS=ntdll.lib kernel32.lib user32.lib bdebug:$(DEBUG) @cl $(SRC) /Fo$(DEBUG)/ /Fd$(DEBUG)/vc.pdb /c /GS- /Gz /TP /ZI /nologo /W0 /D _DEBUG @link $(DEBUG)/*.obj /OUT:$(DEBUG)/$(OUT) /PDB:$(DEBUG)/$(NAME).pdb /NOLOGO /NODEFAULTLIB /DEBUG /SUBSYSTEM:CONSOLE,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIBS) @del $(DEBUG)\*.obj @del $(DEBUG)\*.idb $(DEBUG): @mkdir $(DEBUG) brelease:$(RELEASE) @cl $(SRC) /Fo$(RELEASE)/ /c /GS- /Gz /TP /Od /W0 /nologo @link $(RELEASE)/*.obj /OUT:$(RELEASE)/$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIBS) @del $(RELEASE)\*.obj $(RELEASE): @mkdir $(RELEASE)
Теперь релизный проект можно компилировать nmake brelease, дебажный nmake bdebug
====== Примеры к статье ======
Запись Программа на Си в 1 КБ впервые появилась VxLab.
from VxLab http://ift.tt/202qKRT
via IFTTT
Комментариев нет:
Отправить комментарий