Date: Wed, 14 Mar 2001 19:52:19 +0000 (UTC)
From: yx <yx@angel.adamant.net>
Newsgroups: fido7.ru.unix
Subject: Борьба за уменьшения размера (до 300 байт!) программы "Hello,World"
> Вопpос вот возник. В эхе RU.PASCAL.MODULA.ADA вдpуг один товаpищ
> сообщил, что pазмеp статически собpанной сишной пpогpаммы
> с одним только выводом "Hello, World!" всего около 3 КБайтов.
> Это, случано, не деза?
>
>> Простите, но точку входа я могу написать свою. Минимальную. Которая будет
>> звать main(0,{""}). Почему эта программа не будет программой на языке *C*?
>
> а "точку входа" вы тоже на C писать будете? про курицу и яйцо сами
> вспомните?
>
>> Или gcc не позволяет указать custom entry point? Позволяет.
>
> gcc? нет, не позволяет.
1) gcc не компилятор (верней не только).
2) gcc - позволяет (позволяет передать кому надо точку входа).
> какое дело компилятору до каких-то там точек входа.
>
компилятору непосредственно - никакого,
однако gcc - морда к: препроцессор,компилятор,ассемблер,линкер.
И линковка с standard system startup files - забота линкера.
>>> нет, вы привели два примера не-пойми-на-каком-языке-написанных,
>>> с которорыми не-понятно-что-делать.
>
> разговор о языке си.
>
хорошо о пчелах:
1) startup system files - не имеют отношения ни к си-компилеру, ни к самому cи
- следовательно "-nostartupfiles"
2) библиотеки вода/вывода никогда не были составляющей частью языка си:
- следовательно "-nodefaultlibs -nostdlib"
3) всякая ха-оптимизация не имеет прямого отн-я к си-синтаксису:
- следовательно "-O99 -fomit-frame-pointer -s -static -Wl,--gc-section"
4) стд си-синтаксис, а-не-какой-то-там-непонятно-что:
- тогда:
Итого 568 байт (си соурс - по крайней мере синтаксис,)
если соурс.s через гнутые as/ld - аналог-й код даст байт ~350 (elf/x86)
(все тоже прогнанное через b(rute)cc, as86/ld86 - будет раза в полтора
меньше соот-но)
здесь системно-зависимы только сисколы, дергаемые мимо библио-х ф-й.
(анал-й код с исп-м glibc даст около ~750 байт)
>>> угу. а crt0.o и сколько за собой тащит не считали? от 3 до 8 кб, в
>>> зависимости от юникса.
>>
>> под Win32, и я _не_верю_, что это так уж сложно сделать в *IX.
>
> затем, что именно в нём находится точка входа в ваше программу на языке C
> (crt0 - это C Run Time, не забывайте) - _main, а также start (или _start).
> без crt0.o вы не сможете создать программы на языке *C* - это будет что
> угодно, но только не программа на языке C.
>