Empty Clipboard light

 Давно нуждался в утилите, которая очищает буфер обмена. Недавно увидел пример маленькой программы, взял за образец, дописал код и скомпилировал - 2048 байт. Убрал из настроек компилятора "Enable modern theme support" и получил 1536 байт.

If OpenClipboard_(0)
  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(). И это помогло.

#include <windows.h>
//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 байт. Можно еще и сократить код, но мне помешал стал принцип "Работает - не трогай".

Программы с исходниками тут.

Комментарии