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...
- 5377 megtekintés
Hozzászólások
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
De minek... ez a XXI. század, akár tetszik, akár nem.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
+1
+strip
- A hozzászóláshoz be kell jelentkezni
Kicsit direkt félreértem a kérdést, mivel nem ismerem a végcélt, és aszondom: upx.
- A hozzászóláshoz be kell jelentkezni
(Ez bennem is felmerült.)
- A hozzászóláshoz be kell jelentkezni
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 :-)
- A hozzászóláshoz be kell jelentkezni
[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
- A hozzászóláshoz be kell jelentkezni
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
:-)
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
visszatérési értéket is adva
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
Hát igen, én átsiklottam a visszatérési értékes zárójelen. Viszont az AL-ben tényleg tutira van valami :)
- A hozzászóláshoz be kell jelentkezni
[off]
Nálam így született a "RESET.COM" - JMP 0x0 vagy valami ilyesmi :)
[/off]
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Turbo C-ben lehet assembly kimenetet generalni? Gcc-ben sikerult az -S kapcsoloval.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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-…
http://ptspts.blogspot.hu/2013/12/how-to-make-smaller-c-and-c-binaries…
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
strip + upx
--
[ Falu.me | Tárhely | A Linux és én ]
- A hozzászóláshoz be kell jelentkezni
Vírus készül, ugye? ;)
- A hozzászóláshoz be kell jelentkezni
Meg leteznek ilyenek?
A klasszikus ertelemben
- A hozzászóláshoz be kell jelentkezni
Igen: http://vxheaven.org/
- A hozzászóláshoz be kell jelentkezni
A diet libc nekem bevalt ilyen feladatokra, igaz 2004 kornyeken hasznaltam utoljara.
Bar szamomra akkor inkabb az alacsony memoriahasznalat volt a cel.
- A hozzászóláshoz be kell jelentkezni
objcopy -S
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
Az osszefugges annyi, hogy szeretnem megkonnyiteni a dolgomat. Par kisebb binarist vissza akarok fejteni, hogy okosabban alljak neki a programfuttato resznek.
- A hozzászóláshoz be kell jelentkezni
A másik lehetőség, hogy guglizol az elf file format-ra.
- A hozzászóláshoz be kell jelentkezni
Ez most jött szembe, hátha jó valamire (nem mélyedtem el benne) :
- A hozzászóláshoz be kell jelentkezni