abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 00:33 | Zajímavý článek

Správce nástroje curl Daniel Stenberg na GitHubu průběžně vytváří svou novou knihu Uncurled, v níž shrnuje své dlouhodobé zkušenosti s údržbou open-source projektu: od odpozorovaných pouček po vtipné a ne až tak vtipné příklady e-mailů od uživatelů.

Fluttershy, yay! | Komentářů: 7
včera 00:22 | Nová verze

Byla vydána nová major verze 25.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 3
včera 00:11 | Nová verze

Deno (Wikipedie), běhové prostředí (runtime) pro JavaScript a TypeScript, bylo vydáno ve verzi 1.22. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
18.5. 18:22 | Nová verze

Společnost Red Hat oznámila vydání Red Hat Enterprise Linuxu (RHEL) 9.0. Vedle nových vlastností a oprav chyb přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 7
18.5. 14:00 | Komunita

Lars Knoll oznámil, že po 25 letech v ekosystému Qt, z toho 22 let pracující pro různé společnosti vlastnící Qt, odchází ze společnosti The Qt Company do malého norského startupu.

Ladislav Hagara | Komentářů: 7
18.5. 13:22 | Zajímavý projekt

Na Kickstarteru běží kampaň na podporu mini ITX desky Turing Pi 2 Cluster Computer. Vložením 4 výpočetních modulů, podporovány jsou Raspberry Pi 4, Turing RK1 a Nvidia Jetson, lze získat 4uzlový cluster. Cena desky je 219 dolarů.

Ladislav Hagara | Komentářů: 2
18.5. 10:00 | Pozvánky

Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 198. brněnský sraz, který proběhne v pátek 20. května tradičně od 18 hodin v Pivovarské restauraci Moravia.

Ladislav Hagara | Komentářů: 2
18.5. 07:00 | Zajímavý software

Byla vydána nová verze 0.25 herního enginu Fyrox, původně rg3d. Přehled novinek s kódy, náhledy i videi v příspěvku na blogu.

Ladislav Hagara | Komentářů: 1
18.5. 00:11 | Nová verze

Multiplatformní audio přehrávač Qmmp (Wikipedie) byl vydán ve verzi 2.1.0. Z novinek lze zmínit například podporu XDG Base Directory Specification.

Ladislav Hagara | Komentářů: 0
17.5. 23:22 | Komunita

Letošní konference LibreOffice proběhne 28. září až 1. října v Bolzanu. The Document Foundation hledá přednášející.

Zdeněk Crhonek | Komentářů: 0
Na sociálních sítích nebo jiných webových diskuzích vystupuji pod
 (59%)
 (16%)
 (25%)
Celkem 286 hlasů
 Komentářů: 26, poslední dnes 15:03
Rozcestník

Velmi malý "hello world" bez standardní knihovny

9.2. 03:18 | Přečteno: 2596× | Výběrový blog

Ze prče jsme zkoušeli s kámoši vymyslet co nejmenší binárku, co vypíše "hello world!". Nabízím k volnému použití či inspiraci, k čemu jsme došli; určitě by šlo ještě přitlačit šašením s hlavičkami ELFu, ale praktický smysl by to asi nemělo; co mě zaujalo, že i bez standardní C knihovny jde poměrně bezbolestně napsat spustitelný, nijak aberantní kód pro Linux; s trochou snahy by takto šlo vyrobit podstatně složitější program vlastně stejně jako na mikrokontrolérech. Jak moc je to praktické, to nevím.

Tato varianta je pro x86-64, protože inline assembler; pro jinou platformu to bude velmi podobné, jen registry a čísla předávaná kernelu se budou lišit (dost mě udivilo, že na 64-bitovém Intelu má syscall exit() číslo 60, zatímco na x86 je to 1).

(Děkuji tímto Mačkočíčkovi za linker script a zušlechtění mého C-čkového kódu. :-) )

tinyhello.c:
#include <stdint.h>

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"((uint64_t)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;
}

void sys_exit() __attribute__((noreturn));
void sys_exit() {
    asm volatile (
        "syscall"
        :
        : "a"((uint64_t)60), "D"((uint32_t)0)
        : "rcx", "r11"
    );
    for(;;);    /* emergency stop */
}

void _start() {
    sys_write(1, "Hello world!\n", 13);
    sys_exit();
}
Lze přeložit jednoduše s gcc tinyhello.c -o tinyhello --static -nostdlib s tím, že výsledný ELF obsahuje hodně balastních sekcí a má cca 9 KiB nestripnutý. Pro zahození sekcí, které tady nejsou potřeba, linker script:

tinyhello.lnk:
OUTPUT_FORMAT(elf64-x86-64)
ENTRY(_start)

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

    /DISCARD/ : {
        *(*);
    }
}
Překládá se potom s gcc tinyhello.c -o tinyhello --static -nostdlib -Ttinyhello.lnk a výsledek má 880 bajtů nestripnutý.        

Hodnocení: 100 %

        špatnédobré        

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

Komentáře

Vložit další komentář

9.2. 07:41 k8o | 127.0.0.1
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Pěkné, díky :)
🪐‏
9.2. 09:48 Leo
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
+1 Dobra prace. Co tak jeste jeden challenge a zbavit se stdint.h?
16.2. 10:52 Guox
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
to byl ale ten nesmyslny bulvarni nadpis zpravdivel, to po OP nemuzes chtit
9.2. 11:48 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tato varianta je pro x86-64, protože inline assembler
Dá se to napsat i tak, že to podporuje více platforem zaráz. Před nějakou dobou jsem si s tím hrál a zde je výsledek, který podporuje x86-64 a ARM (nebo aspoň 'běžné' ARMy, nějaký specielní možná fungovat nebude):

#include <stdint.h>

const uint64_t _start[] __attribute__((section(".text"))) = {
    0xe3a00001909032eb, 0xe3a0200ce28f1014,
    0xef000000e3a07004, 0xe3a07001e3a00000,
    0x6c6c6548ef000000, 0x0a214d5241202c6f,
    0x18ec834800000000, 0x4800000045058b48,
    0xa20fc03148240489, 0x0c24548908245c89,
    0x142444c710244c89, 0x01c0c74800000a21,
    0x0001c7c748000000, 0x480124748d480000,
    0x050f00000015c2c7, 0x480000003cc0c748,
    0x6c654820050fff31, 0x00000000202c6f6c,
};

Kompiluje se pomocí gcc -static -nostdlib

Přeji příjemnou zábavu :)
9.2. 15:07 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tato varianta je pro x86-64, protože inline assembler
U prvni verze jsem si rikal, jestli by to nebylo citelnejsi psat rovnou v assembleru... Ale napad vzit binarku a prelozit ji s gcc na binarku je dost originelni, to uznavam. ;-]

Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
9.2. 17:49 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Ale napad vzit binarku a prelozit ji s gcc na binarku je dost originelni, to uznavam. ;-]
Ten není můj, ten je odsud :) Můj je jen ten s tou platformní vidličkou...
10.2. 10:25 ehmmm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Muzu se prosim nechat poddat a videt assembler od tohodle? :)

(Oni to zrejme budou dva assemblery, ze?)
10.2. 12:28 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
10.2. 19:41 ehmmm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Dik, taky dobry cteni.
Gréta avatar 10.2. 20:53 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
10.2. 20:55 Xerces
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Náčelníku? Možná to vypadá, že pořád jenom kritizuju, ale tohle vypíše Hello, a označení CPU a ne Hello, world! Tak to jen tak pro úplnost. :-)
9.2. 11:52 Petr
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
"ze prče"?

Fake and gay bluebear, originál uměl česky!
Petr Tomášek avatar 9.2. 12:02 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
"ze z prče"?
multicult.fm | monokultura je zlo | welcome refugees!
9.2. 12:09 _
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
gay byl vždycky
Petr Tomášek avatar 9.2. 12:01 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
A kolik to dělá B po striptýzu?
multicult.fm | monokultura je zlo | welcome refugees!
Bluebear avatar 9.2. 15:08 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
592 byte (asi se může trochu lišit na různých strojích podle toho, jak se chová linker).
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
Josef Kufner avatar 9.2. 15:30 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
V dobách DOSu by to bylo na pár bajtů. Formát COM žádné hlavičky neměl, to se prostě nasypalo do CPU tak, jak to bylo na disku. Pár movů s int 21h a bylo to. Ani nepotřebuješ překladač, prostě to nacvakáš v hexaeditoru.

Dnes se do podobné situace člověk dostane akorát když si hraje s jednočipy. To pak má třeba půl kilobajtu paměti, kam se potřebuje vejít s nějakým netriviálním výpočtem a ve zbytku paměti má hromadu dat.
Hello world ! Segmentation fault (core dumped)
9.2. 15:59 jiwopene | skóre: 30 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
s/do CPU/do paměti/

Jinak před nějakou dobou tu byl odkaz na toto.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Bluebear avatar 9.2. 16:21 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Jistě - byly to tehdy jednodušší a snad šťastnější časy :-) - ale DOS byl taky celkově jednodušší a měl méně schopností.
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
10.2. 01:56 OldFrog {Ondra Nemecek} | skóre: 35 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Jste málo radikální - nejmenší program je ten, který nic nedělá :-) Koncepční otázka ovšem je, zda po něm chtít, aby se spustil :-D
-- OldFrog
Heron avatar 10.2. 13:15 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Přesně tak. Bez assembleru bych to nedal, ale com by měl pár B.
9.2. 16:36 jiwopene | skóre: 30 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
GNU Assembler, linker script podobný, 376 bajtů (jako ELF).
        .text
        .code64

        .globl _start
_start:
        movb    $1, %al          /* syscall num */
        movw    $1, %di          /* file descriptor */
        movq    $hello_str, %rsi /* text */
        movq    $(hello_str_end - hello_str), %rdx /* length */
        syscall
        movb    $60, %al
        xorw    %di, %di
        syscall

        .data
hello_str:
        .ascii  "Hello, World!\n"
hello_str_end:
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
10.2. 20:37 kvr
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tak nějak. Kdysi jsem se dostal na cca 400 bytes, ale byl jsem trochu slušnější a inicializoval jsem celé 32-bit proměnné, nejenom spodních 8 bitů. Matně si vzpomínám, že linker script jsem nepotřeboval, stačil snad nějaký option ke gcc, aby vynechalo standardní linker script, ale už si to moc nepamatuju.
11.2. 01:16 debian+ | skóre: 30 | blog: analyzy
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
A ako to prekladáš?
debian.plus@protonmail.com
11.2. 16:04 jiwopene | skóre: 30 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
V podstatě stejně.
as -64 hello.S -o hello.o && ld --omagic -s -x -static -T script.ld hello.o
(tj. x86_64, ne debugovací symboly, strip a statické)

Linker script stejný, jenom místo .rodata tam je .data.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
9.2. 17:05 Aleš
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
To je fakt dementní jazyk. není důvod, aby to mělo víc než dvacet bajtů.
9.2. 19:02 Wirth
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
To neni jazykem ale operacnim systemem. Treba v DOS staci do DX dat "Hello World", do AH volani zabudovane funkce "print" (tusim AH,9) a zavolat preruseni INT 0x21. A pak jeste dat vedet ze koncime pres AH 0x4c a opet INT 0x21. Tohle v linuxu das s par instrukcema navic protoze jdes pres stdout (BX,1) a sys_write (BX,4) a tusim jeste musis i dat vedet jak dlouhy stream tam pujde (DX,delka) a samotny stream(CX, pointr na "Hello World"). No a linux ma INT 0x80 a sys_exit je neco podnyho jako v DOSu (AX,1; BX,0).
11.2. 10:23 ...
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
je to jazykem, zkus si to v javascriptu
11.2. 15:19 nadtržítko
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Kdybys nemel v hlave slamu tak bys vedel, ze skriptovaci jazyky tu tahat co? Tu tahat nebudeme. Nebudeme proc? Protoze nemaji linker. A kdyz ho nahodou i maji tak co? Tak je ceckovy! :-)
11.2. 18:35 ...
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Kdybys neměl v hlavě nasráno, tak bys pochopil, že celý ten linker a další c hovna jsou k ničemu a javascript je mnohem efektivnější a hotový program je menší.
11.2. 20:25 plostenka
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tak ukaz svoji JS binarku, nebo procesor/ASIC na kterem bezi JS nativne.
12.2. 01:40 ...
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
K čemu binarku? Uvażuješ jako dinosaurus.
12.2. 16:59 plostenka
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tak predved ten ASIC co zpracovava JS nativne, bez binarky.
14.2. 00:07 ...
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
to umi kazdy prohlizec
10.2. 10:59 ELF
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

Tohle je 45 bajtu (avsak to predpoklada Linux jako behove prostredi).

Hello World by byl vetsi (tohle je pouze return 42;).
10.2. 13:02 ehmmm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Kdyby me nevyrusil kolega, tak bych mohl rict, ze jsem to precetl jednim dechem. Bomba!

Celkove se tady objevila skvela a pro me velmi prinosna diskuze.
10.2. 15:50 debian+ | skóre: 30 | blog: analyzy
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tvoj kód/preklad864 B
+ moje úpravy/preklad736 B
Ušetrene:131 B (14,8 %)

P.S.: Velikosť súboru zistíš: du -b FILE.
debian.plus@protonmail.com
11.2. 00:06 debian+ | skóre: 30 | blog: analyzy
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Tvoj kód/preklad864 B
+ moje úpravy/preklad496 B
Ušetrene:368 B (42,59 %)
debian.plus@protonmail.com
10.2. 20:41 problem solved
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
echo Hello world
Gréta avatar 10.2. 20:57 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny

tttttssss echo má nějakejch 40kb :O ;D

10.2. 21:10 Xerces
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Nj., ale kolik má to jádro Linuxu na kterým se ty vytuněný binárky pouštěj. :-)
Petr Tomášek avatar 11.2. 22:10 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
Chtěl jsi spíš říci: „kolik má bash“?

Linuxové ňadro volá ten 400-bytový program v assembleru...
multicult.fm | monokultura je zlo | welcome refugees!
11.2. 00:21 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
tttttssss echo má nějakejch 40kb :O ;D
U mě taky... Ale ten se pravděpodobně nepoužije, typicky se použije echo zabudovaný přímo v shellu...
Gréta avatar 10.2. 20:59 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny

kde jakoby vubec končí c a začíná asm :O :O

11.2. 13:00 _
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
c je asm a trocha syntaktickeho cukru

jazyk pro psychopaty
xxxs avatar 12.2. 14:17 xxxs | skóre: 22 | blog: vetvicky
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny
dufam, ze sa nedaju zahanbit ani fanusikovia electronu.
xkucf03 avatar 15.2. 19:40 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Velmi malý "hello world" bez standardní knihovny

V čem je problém? Kdybys chtěl programovat tímhle způsobem, tak bys vyzobal/reimplementoval různé části standardní knihovny a řešil by sis přenositelnost sám. Teoreticky kdyby standardní knihovna byla moc velký moloch a potřeboval bys z ní jen nějakých 10 %, tak by to třeba smysl dávalo, ale typicky z ní budeš potřebovat větší část a navíc je tu ta přenositelnost… řešit tyhle věci v kódu aplikace mi přijde nesmyslné. Jako ukázka je to fajn, ale… jinak už by dávalo větší smysl to řešit na úrovni jazyka (tzn. úplně obejít céčko a místo něj mít něco jiného, co se napojuje na systémová volání).

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.