Давно нуждался в утилите, которая очищает буфер обмена. Недавно увидел пример маленькой программы, взял за образец, дописал код и скомпилировал - 2048 байт. Убрал из настроек компилятора "Enable modern theme support" и получил 1536 байт.
EmptyClipboard_()
CloseClipboard_()
EndIf
End
; Далее команды для линкера, нацеленные на уменьшение размера исполняемого файла.
Import "/merge:.text=.code" : EndImport
Import "/merge:.data=.code" : EndImport
Import "/merge:.rsrc=.code" : EndImport
Import "/merge:.bss=.code" : EndImport
Import "/merge:.edata=.code" : EndImport
Import "/merge:.idata=.code" : EndImport
Import "/merge:.rcdata=.code" : EndImport
Import "/merge:.reloc=.code" : EndImport
Мне стало интересно, что выйдет с TinyC, набрал код и получил очень слишком много байт. Просмотр программы показал, что программа импортирует функции из msvcrt.dll. Добавил к компиляции ключ -nostdlib и получил новую ошибку - "Не найдена точка входа _start". Моя фантазия закончилась, обратился к Google и нашел решение - переименовать функцию main() на _start(). И это помогло.
//main()
void _start(void)
{
if (OpenClipboard(0))
{
EmptyClipboard();
CloseClipboard();
}
ExitProcess(0);
}
Компиляция:
tcc clclp.c -o clclp.exe -luser32 -lkernel32 -nostdlib -Os -m32
Понадобятся файлы .def для библиотек. Их можно получить, набрав tcc -impdef user32.dll и tcc -impdef kernel32.dll.
Вышло те же 1536 байт. Я полез дальше и стал смотреть на секции программы: .data явно лишняя. Стал читать документацию и наткнулся на описание директив. Но как я ни пробовал, так и не получил программу без секции.
С ассемблером все грустно - нашлось много статей, но ни один пример так не заработал. Позже нашел одну толковую статью, которая приводит пример на синтаксисе YAsm. Я переписал исходник и получил рабочую программу размером 616 байт. Можно еще и сократить код, но мне помешал стал принцип "Работает - не трогай".
Программы с исходниками тут.
Комментарии
Отправить комментарий