Minimalis meretu binaris

 ( tudos | 2015. január 15., csütörtök - 9:34 )

Sziasztok!

Tudtok adni par tippet arra, hogyan lehet minimalizalni egy rovid, libraryt nem hasznalo c kod binarisanak meretet linux vagy dos alatt?

Pl alap libraryk kiszedese forditasi kapcsolokkal...

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

De minek... ez a XXI. század, akár tetszik, akár nem.

Az alap library-k kiszedese a fentebbi (wachag kollega altal linkelt) oldalon jol le vannak irva. Lasd: -nostartfiles, -nostdlib, stb.

Csak kerdes hogy miert? Ha barmi miatt csak egy adott elf-szekciora van szukseged, akkor azt celszerubb/kulturaltabb/stb objcopy-val kiszedni a linkeles utan. Pl ahogy mikrokontrollereknel is a .text kerul feltoltesre a flash-be. Az elf binaris me'rete tipikusan 2-2.5-3x-osa is lehet a "lenyegnek", pl a .text szegmensnek ebben az esetben.

+1
+strip

Kicsit direkt félreértem a kérdést, mivel nem ismerem a végcélt, és aszondom: upx.

(Ez bennem is felmerült.)

Valamikor 20+ eve a DOS-os C compilerekhez (MS C, Turbo C) irtam sajat inditomodult (az a program, ami a main() fuggvenyt hivja meg). Igeny szerint konfiguralhato volt, hogy mi mindent tudjon (ha pl. nem volt szukseg a parancssori parameterekre, akkor nem foglalkozott vele, igy kisebb tudott lenni, de tudott kodolt stringeket, checksum-olni sajat magat es rezidensen is maradni).

Ha jol emlekszem, a minimalis meretu program (.com formatumu), ami csak egy return (0);-bol allt, mindossze 10 byte koruli lett :-)

Sajat C library-t hasznaltam hozza, a megfelelo formatumu header hasznalataval device drivert is irtam vele :-)

[off]
Régi szép emlékek. :)

Assembly-ből fordítva a legrövidebb COM program - emlékeim szerint - egy szimpla RET (0xC3) utastítás.
De ha szabályosan akarunk kilépni (visszatérési értéket is adva), akkor az öt bájt (hexában: B8 00 4C CD 21 (mov ax, 4c00h; int 21h) )
[/off]

szerk: off jelezve

Az enyem is csak annyit csinalt pluszban ehhez kepest, hogy beallitotta a ds-t, a bp-t es a stacket, meghivta a main()-t, majd mov ah,4Ch; int 21h :-)

"De ha szabályosan akarunk kilépni (visszatérési értéket is adva), akkor az öt bájt (hexában: B8 00 4C CD 21 (mov ax, 4c00h; int 21h) )"

Szerintem nem (mov ah, 4c; int21h), vagy com esetében csak int 20h

visszatérési értéket is adva

Igaza van xclusiv-nak, mert nem azt írtam, hogy nullát ad vissza.
Úgy emlékszem egyébként, hogy alapértelmezés szerint a DOS lenullázza a regisztereket futtatásnál, tehát a fenti kód nullát ad.vissza. (viszont mintha írták volna valahol, hogy erre nem szabad építeni, mert nem biztos, hogy minden esetben megtöténik a nullázás, ami így nem definiált működéshez vezethet)

Igaza van xclusiv-nak, mert nem azt írtam, hogy nullát ad vissza.

ah=0x4C, int 0x21-nel az al regiszter tartalma lesz a visszateresi ertek. Azt irtad, hogy "visszateresi erteket is adva", felteteleztem, hogy nullat akarsz visszaadni, nem pedig azt, ami tortenetesen az al-ben maradt.

Úgy emlékszem egyébként, hogy alapértelmezés szerint a DOS lenullázza a regisztereket futtatásnál

Meg csak az b*szna be, minden hivas elott menthetnem az osszes regisztert :-)

A DOS csak azokat a regisztereket modositja, amiben erteket ad vissza.

Az int 0x20-nal nem tudsz visszateresi erteket megadni (az mindig 0 lesz).

Hát igen, én átsiklottam a visszatérési értékes zárójelen. Viszont az AL-ben tényleg tutira van valami :)

[off]
Nálam így született a "RESET.COM" - JMP 0x0 vagy valami ilyesmi :)
[/off]

* Én egy indián vagyok. Minden indián hazudik.

Turbo C-ben lehet assembly kimenetet generalni? Gcc-ben sikerult az -S kapcsoloval.

Létezik egyáltalán libraryt nem használó C kód? Már ahhoz is library kell, hogy elinduljon, és library nélkül nincs malloc, rendszerhívás, stb. sem.

--

Hogyne letezne. Beagyazott cuccoknal absz rutinszeruen lehet csinalni, de ugyanazon elvek mellett akar "hetkoznapi" OS ala' is is lehet gyartani. Ha teljesen, mindenfele kulso lib nelkul dolgozol, akkor a legkorultekintobb nem is a malloc() meg ilyesmik potlasa, hanem hogy a _start-nak megfelelo belepesi pont jol legyen lekezelve.

Az mas kerdes hogy van-e ertelme. Beagyazott cuccoknal is sok jo lib van, ami ezeket elfedi es ott is pl egy #reset utan a ma'r a main()-t hivja meg, egy jol felepitett stack frame keretein belul.

Alap:
gcc -Os -s xy.c -o xy
strip xy

Aztán a Googlehuszár ha felül a lovára...
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
Látszik, hogy az assembly-ben megfogalmazott mellékertelés nélkülit semmi sem győzi le.

De C-nél maradva:
http://stackoverflow.com/questions/6771905/how-to-decrease-the-size-of-generated-binaries
http://ptspts.blogspot.hu/2013/12/how-to-make-smaller-c-and-c-binaries.html

Egykor létezett egy (ha jól emlékszem a nevére) sphix-c nevű cucc, DOS alatt futott a fordító. Voltak lib-ek is hozzá, de anélkül is lehetett írni programot. Mondjuk, nem igazán c volt, hanem inkább valamiféle strukturált assembly szerűség c szintaktikával. Olyat is lehetett művelni vele, hogy ha a végterméket belepakoltam egy floppy boot-szektorába, akkor boot-oláskor szépen futott.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba

Ha sphinx, akkor az c-- kell legyen. Magát a nyelvet nem ismerem, de az általad írtak után lehet, hogy ránézek. :)
Hasonló volt még ehhez a baspasc, később bapc. Ez egy nagyon aranyos kis keverék volt, emlékeim szerint magyarok fejlesztették. Basic, pascal, assembly és c elemeket tartalmazott. De ez nagyon low-level volt, közvetlenül asm-be konvertált. Azokban a jó kis DOS-os időkben imádtam. Anno a Chip CD-n levő SAC-mirrorról szereztem be.

strip + upx

--
[ Falu.me | Tárhely | A Linux és én ]

Vírus készül, ugye? ;)

Meg leteznek ilyenek?
A klasszikus ertelemben

A diet libc nekem bevalt ilyen feladatokra, igaz 2004 kornyeken hasznaltam utoljara.
Bar szamomra akkor inkabb az alacsony memoriahasznalat volt a cel.

http://www.fefe.de/dietlibc/

objcopy -S

Keszitek egy sajat, minimalista OS-t. Mar nagyjabol megall a sajat laban. Most azt tervezem , hogy egyszerubb linux binarisokat tudjon futtatni. Olyan binarisokat akarok forditani, amikben minimalis a sallang mennyisege.

Nem látom a kapcsolatot a két állítás között. Az például, hogy a programhoz tartozik-e 3GB debug-információ vagy sem, egyáltalán nem számít abban, hogy futik-e a rendszereden, vagy nem. (Az a fontos, hogy ne használjon shared libeket, és csak a már implementált nyolc rendszerhívást használja.)

Az osszefugges annyi, hogy szeretnem megkonnyiteni a dolgomat. Par kisebb binarist vissza akarok fejteni, hogy okosabban alljak neki a programfuttato resznek.

A másik lehetőség, hogy guglizol az elf file format-ra.

Ez most jött szembe, hátha jó valamire (nem mélyedtem el benne) :

http://www.muppetlabs.com/~breadbox/software/tiny/