Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Minimalizace kodu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Minimalizace kodu

Autor: V

11:41:52 26.10.2009

"no vsak musim se v tom chvili vrtat nez poznam vsechno co v tom je ne? "

Když na to máte čas... Normální člověk si nechá vygenerovat linkovací mapu, pozná z toho ještě víc a v ničem se kvůli tomu vrtat nepotřebuje. ;-) Ale samozřejmě - je-li vaším hlavním cílem pouhé hraní si pokud možno bez použití dokumentace, tak to jste na dobré cestě. :-)

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: jeezaa

0:28:38 26.10.2009

To V:
> No tak tímhle způsobem to nepochopíte - že budete vyškrtávat věci, které tam linker
> na základě pravděpodobně rozumných argumentů připojil.

no vsak musim se v tom chvili vrtat nez poznam vsechno co v tom je ne?


To sfasfasdf:
> pokud chces porozumet vnitrnostem, tak cti zdrojaky libc. studuj fungovani kompileru,
> linkeru. zpusob co jsi zvolil neni moc efektivni.

Zatim mi tenhle zpusob vyhovoval - neco udelat a cekat co to udela... pripadne si o tom pak nekde precist... Tupe cteni manualu a dokumentaci ke kompileru mi nikdy moc neslo. IMHO je tohle zabavnejsi.


To Maaartin:

> Plny souhlas. Pro jeezaa: vis ze printf je pekne slozita fce ve srovnani treba s
> puts ...

no podle moznosti, ktere ma prvni a druha funkce to tak logicky bude...

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: Maaartin

0:06:50 26.10.2009

Plny souhlas. Pro jeezaa: vis ze printf je pekne slozita fce ve srovnani treba s puts (ci jaxe to jmenuje, treba fputs, me to je jedno)?

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: sfasfasdf

21:53:59 25.10.2009

pokud chces porozumet vnitrnostem, tak cti zdrojaky libc. studuj fungovani kompileru, linkeru. zpusob co jsi zvolil neni moc efektivni.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: V

13:36:52 25.10.2009

"ale chci tomu rozumet.

No tak tímhle způsobem to nepochopíte - že budete vyškrtávat věci, které tam linker na základě pravděpodobně rozumných argumentů připojil.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: jeezaa

15:55:42 24.10.2009

To Maaartin:
duvod proc jsem se na tohle ptal je, ze nechci jen psat programy a byt rad, ze to funguje a ani nevedet proc to tak je a proc je to veliky tak jak je to veliky a proc...
Nerikam, ze chci psat low level programovani, takovej hardcorista zas nejsem, ale chci tomu rozumet.

Dik za odkazy, trochu si to prostuduju...

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: Maaartin

19:06:57 23.10.2009

> [ital]Jinak kdybych mel spatny pohled na vec, tak budu rad za opravu...[/ital]

Myslim ze mas.... je to sice pekny psat minimalni programy ale co ti to da? Kdyz to budes prodavat na cedecku taxe to tezko pozna. A vazne: velikost prg je v jistych mezich uplne jedno pokud nepises neco opravdu low level. A pokud pises neco slozityho tak budes rad kdyz ti prilinkovani nakych hodne megacu usetri praci.

Pokud se budes zabyvat nakyma syscalls, tak bude vysledny kod hezky maly, zato zdrojak naroste a prace naroste neumerne, zato rapidne klesne pocet systemu na kterych to pojede.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: JiriValerian

19:01:24 23.10.2009

[color=#008000]jeezaa Napsal:
-------------------------------------------------------
> Hmm, tak ted odvazny dotaz :)
> Pomuze, kdyz prelozeny kod prozenu disassemblerem,
> vezmu si jen to co potrebuji - funkci main, funkci
> printf a popripade jeste neco, co by schazelo a to
> prozenu nejakym prekladacem assembleru?[/color]

Funkce [b]main[/b] očekává parametry, které pro ni připravuje právě ten [b]zaváděcí kód[/b] a ten k tomu může používat různé další interní funkce. Funkce [b]printf[/b] je zase docela [b]"masitá"[/b] záležitost, která může používat také několik dalších interních funkcí a tím "interní" nemám na mysli syscall, ale řadu pomocných funkcí v knihovně jazyka. Takže to vyseparování nemusí být až tak jednoduchá záležitost jak se Vám to jeví ;). Spíš bych doporučoval zkusit [b]jít cestou vlastního vstupního bodu programu[/b] a používat jen systémová voláni [b]bez jakýchkoli funkcí jazyka C[/b] jak jsem jíž zmínil v mé předchozí odpovědi viz odkaz:

http://forum.builder.cz/read.php?13,3150700,3151386#msg-3151386

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: JiriValerian

18:46:52 23.10.2009

[color=#008000]LuP Napsal:
-------------------------------------------------------
> Možná by se šlo mrknout na LibCTiny - řekl bych,
> že někdo podobný problém kdysi již v tomto fóru
> řešil a v diskusi se zmíněná knihovna objevila.
>
> LuP
>[/color]

[b]LibCTiny[/b] znám jenom v implementaci [b]pro Windows[/b] a navíc jenom [b]pro Microsoftí překladač[/b] viz odkaz.

[b]Tiny C Runtime Library[/b]
http://www.codeproject.com/KB/library/tlibc.aspx?fid=332286&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=1624166&fr=34

Jestli existuje něco podobného v implementaci pro jiné OS a jiné překladače to nevím.

Osobně jsem v jiné diskusi zmiňoval řešení zcela bez použití funkcí jazyka C jen s voláními funkcí OS, ale opět pouze pro [b]Windows[/b] a navíc s využitím [b]Microsoftího překladače[/b] viz odkaz na to tehdejší téma.

[b]Re: WinAPI a nejmensi exe[/b]
http://forum.builder.cz/read.php?23,1334314,1334465#msg-1334465

Přesné řešení [b]pro GCC[/b] neznám a tak mohu pro tazatele zmínit jen obecně info z něhož by se mohl inspirovat a pokud na to má patřičné znalosti tak si podrobně prostudovat dokumentaci k překladači a linkeru, které používá a také k systémovým voláním cílového OS, pro který to hodlá řešit a podle toho si to vystavět.

Obecně platí, že funkce [b]main[/b] používaná jako hlavní funkce v programech psaných v [b]C/C++[/b] ve skutečnosti není tzv. [b]vstupním bodem[/b] programu, který systém volá po zavedení binárky do paměti.

[b]Vstupním bodem[/b] je obvykle funkce bez parametrů. Její název není až tak podstatný, ale různé linkery mají obvykle natvrdo nadefinován implicitní název jako např. [b]Microsoftí linker[/b] používá pro konzolovky název [b]mainCRTStartup[/b], ale linkery mívají obvykle nějaký parametr, kterým se dá definovat vlastní název funkce vstupního bodu a ta klidně může být přímo v programu tj. vůbec se nemusí používat knihovna jazyka viz ten odkaz co jsem zde uvedl do té diskuse k řešení pro [b]Windows[/b].

V tom tématu je v druhé části ukázka zdrojáku, který nepoužívá žádné funkce [b]jazyka C[/b] a ani se k němu knihovna jazyka C vůbec nelinkuje. Program používá jen volání Win API funkcí a pro linker je tam pragma definice [b]vstupního bodu[/b]:

[b]#pragma comment(linker, "/ENTRY:MyStartup")[/b]

Tato [b]pragma[/b] definice to je záležitost [b]Microsoft specific[/b] tj. pro jiný překladač si budete muset najít spíš nějaký [b]parametr linkeru[/b], který používáte a kterým bude možné linkeru sdělít název funkce, která bude přímo ve vašem programu a bude jeho vstupním bodem.

Funkci [b]main[/b] můžete zcela vypustit, ale pokud chcete třeba použít parametr s nimiž byl program zavolán tak si to ve funkci [b]vstupního bodu[/b] budete muset připravit, a to s ohledem na funkce příslušného OS, pro který to budete realizovat a bez použití funkcí [b]jazyka C[/b].

A to je zhruba vše.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: jeezaa

18:20:01 23.10.2009

Hmm, tak ted odvazny dotaz :)
Pomuze, kdyz prelozeny kod prozenu disassemblerem, vezmu si jen to co potrebuji - funkci main, funkci printf a popripade jeste neco, co by schazelo a to prozenu nejakym prekladacem assembleru?

Tim vyskrtam nepotrebny kod a vysledek se mi zmensi na minimum.


A nebo tedy pouzivat jen ta systemova volani... kouknu na net, jak by to pak vypadalo.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: Linker mu nepomůže

17:43:21 23.10.2009

jeezaa Napsal:
-------------------------------------------------------
> Jeste jsem zkousel umaznout printf a inludovani
> stdio.h a vysledny program ma stale 12K.

Protože se to takto nedá ovlivnit jak jsem už psal:
http://forum.builder.cz/read.php?13,3150700,3151334#msg-3151334

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: Linker mu nepomůže

17:39:23 23.10.2009

grafnev Napsal:
-------------------------------------------------------
> Mozna me tu ubijete pro neznalost, ale neslo by se
> podivat do stdio.h (stejne se do toho programu jen
> zkopiruje) a includnout pouze to co potrebujete na
> ten printf? :)

To je nesmysl, protože stdio.h není žádná knihovna, ale jenom hlavičkový soubor s deklaracema funkcí a vůbec nijak neovlivňuje linkování zaváděcího kódu knihovny jazyka. Zaváděcím kód se linkuje vždy bez ohledu na to jestli se z knihovny jazyka použije jedna funkce nebo třeba sto funkcí. To by jedině nesměl používat žádné funkce jazyka C a tím vůbec nelinkovat knihovnu jazyka a používat jenom volání funkcí operačního systému.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: jeezaa

14:48:36 23.10.2009

To V:
> Které "zbytečné" funkce se podle vás "loadují"? A jak jste to poznal? A jak víte, že > jsou zbytečné?

No prece nepotrebuju 1432 radku assembleru nato, aby mi to vypsalo jen "Ahoj". Z toho plyne, ze tam musi byt neco zbytecnyho ne? A kdyz vezmu ten vypis na pastebinu, tak treba ty .debug_* funkce?

Opravte me, jestli se mylim...

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: V

13:57:12 23.10.2009

Které "zbytečné" funkce se podle vás "loadují"? A jak jste to poznal? A jak víte, že jsou zbytečné?

"Mozna me tu ubijete pro neznalost"... jo, to teda ubijeme, je to totiž nesmysl. :-)

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: LuP

13:28:53 23.10.2009

Možná by se šlo mrknout na LibCTiny - řekl bych, že někdo podobný problém kdysi již v tomto fóru řešil a v diskusi se zmíněná knihovna objevila.

LuP

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: jeezaa

13:21:48 23.10.2009

Ahoj,
diky za napady...

To grafnev:
> includnout pouze to co potrebujete na ten printf?

To bude mozna to, co psal "dfasfdadsf" o vyseparovani funkci z knihoven...

Jeste jsem zkousel umaznout printf a inludovani stdio.h a vysledny program ma stale 12K. Linkuje se spousta dalsich funkci: http://pastebin.com/m35852e6f (ted uz bez printf).

Zkousel jsem najit neco na netu, ale zatim zadna slava. Neni nejaky clanek, co by tohle objasnoval?

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: grafnev

12:33:54 23.10.2009

Mozna me tu ubijete pro neznalost, ale neslo by se podivat do stdio.h (stejne se do toho programu jen zkopiruje) a includnout pouze to co potrebujete na ten printf? :)

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: Linker mu nepomůže

10:01:38 23.10.2009

tcesky Napsal:
-------------------------------------------------------
> Pouzivat linker ktery je dostatecne smart.
> TC
>

S tímhle linker nic nenadělá, protože je to způsobeno zaváděcím kódem, který se volá ještě před funkcí main a provádí inicializaci knihovny jazyka C. To by si musel leda napsat nějakou vlastní minimalistickou implementaci knihovny jazyka.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: dfasfdadsf

9:57:27 23.10.2009

nepouzivat vyssi knihovny, ale pouzivat jen systemova volani (syscall) operacniho systemu. do kodu si pak naimplementujes jenom to co opravdu potrebujes, sice to je prace pro vraha, ale coz. nebo si ze zdrojaku potrebnych knihoven stdio... vyseparuj funkce co chces, osekej si je a to pak pouzij ve svem zdrojaku. to je prace pro dalsiho vraha.

Citovat příspěvek

 

Re: Minimalizace kodu

Autor: tcesky

9:14:30 23.10.2009

Pouzivat linker ktery je dostatecne smart.
TC

Citovat příspěvek

 

Minimalizace kodu

Autor: jeezaa

0:35:12 23.10.2009

Ahoj,
mohl by nekdo poradit, jak muzu odebrat funkce nepouzivane v mem programu?
Napr. pokud mam program co vytiskne na obrazovku "ahoj":

#include
int main () {
printf ( "ahoj" );
return 0;
}

tak to (prechroupany pomoci gcc) zabere 12K a to jen kvuli tomu, ze se loaduje zbytecne moc funkci z stdio.h. Disassemblovany kod vyjde na 1432 radku z toho jen 9 radku je funkce main a samozrejme neco jeste sezere funkce printf.

Da se tedy nejak vybrat z knihoven pro beh programu jen zivotne dulezite funkce a ostatni nepouzivat?


Jinak kdybych mel spatny pohled na vec, tak budu rad za opravu...

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: