Portál AbcLinuxu, 1. května 2025 20:32

Najmenšia binárka „Hello world“ v C

16.2.2022 18:39 | Přečteno: 1637× | analýza | poslední úprava: 17.2.2022 10:46

Toto je vylepšenie iného blogu „Velmi malý "hello world" bez standardní knihovny“ od autora Bluebear.

tinyhello.c

#include <stdint.h>
 
inline int sys_write(int fd, char const* text, uint32_t length) {
    uint64_t retval;
    asm volatile (
 
        /* SYSCALL instruction invokes the kernel */
        "syscall"
 
        /* return value will be read from rax */
        : "=rax"(retval)
 
        /* where the input arguments should be placed */
        :   "a"(1),   /* eax = syscall number */
            "D"(fd),            /* argument 1 (fd) goes to rdi/edi */
            "S"(text),          /* argument 2 (text) goes to rsi/esi */
            "d"(length)         /* argument 3 (length) goes to rdx/edx */
 
        /* registers that may contain garbage after the call - for syscalls, they are rcx, r11 */
        : "rcx", "r11"
    );
    return retval;
}
 
inline void sys_exit() {
    asm volatile (
        "syscall"
        :
        : "a"(60), "D"(0)
        : "rcx", "r11"
    );
}

 
void _start() {
    sys_write(1, "Hello world!\n", 13);
    sys_exit();
}

Makefile

all:
	gcc tinyhello.c -o tinyhello --static -nostdlib -Ttinyhello.lnk -Ofast -nostartfiles -nodefaultlibs -s -fsyntax-only

size:
	du -b tinyhello | awk '{print $$1}'

tinyhello.lnk

Bez žiadnej zmeny – takže kopia od pôvodného autora.

OUTPUT_FORMAT(elf64-x86-64)
ENTRY(_start)

SECTIONS
{
    . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
    .text : {
        *(.text);
        *(.rodata*);
    }

    /DISCARD/ : {
        *(*);
    }
}

Výsledok

PrekladVýsledok
Bluebear kód a preklad864 B
S mojimi úpravami/prekladom496 B
Ušetrené:368 B (42,59 %)
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Gréta avatar 16.2.2022 22:27 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Najmenšia binárka „Hello world“ v C
Odpovědět | Sbalit | Link | Blokovat | Admin

nóóóó a kolik ztoho je jakoby samotnej ten helloworld string?? :O :D

Zelená energetická soustava založená na obnovitelnejch zdrojích energie versus realnej svět 🤡🇪🇸
16.2.2022 23:41 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Najmenšia binárka „Hello world“ v C
readelf -a PATH_BIN_FILE
debian.plus@protonmail.com
xvasek avatar 17.2.2022 10:40 xvasek | skóre: 21 | blog: | Zlín
Rozbalit Rozbalit vše Re: Najmenšia binárka „Hello world“ v C
Odpovědět | Sbalit | Link | Blokovat | Admin
Pořád dlouhé, v Perlu je to kratší. :-)

Dělám si srandu, zajímavé. Dělal jsem program pro Windows, který zobrazil okýnko (jakože Windows), v něm hlášku z parametru příkazové řádky ("Načti kartu zaměstnance" nebo tak něco), počkal a načetl nějaké byty ze sériového portu a uložil je do souboru. Začal jsem Perl/TK - musí se samozřejmě přibalit runtime, takže to mělo asi 8MB a startovalo to asi sekundu - runtime se rozbaluje. Pak jsem to dělal ještě v něčem dalším, ještě v něčem a skončil jsem u prašivého C z minGW a té standardní Windows knihovny - což mělo tuším 150kB a bylo to samozřejmě bleskové. Takže i úplně high-level frontend programátorovi se může Cčko občas hodit.
18.2.2022 12:41 Radovan
Rozbalit Rozbalit vše Re: Najmenšia binárka „Hello world“ v C
ECHO ?"Hello World!" | GWBASIC.EXE :-D

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.