Portál AbcLinuxu, 6. června 2024 08:05

man gcc: optimalizace a knihovny

11.11.2005 17:41 | Přečteno: 1393× | Linux | poslední úprava: 11.11.2005 18:42

Tento text vznikl díky dotazům lidí, kteří si neradi čtou {man,info} gcc. Trochu nepochopitelně nenese žádné prohlášení a ani nechce vyvolávat flame, za což se omlouvám :-D.

Obsah

Optimalizace

Gcc podporuje mnoho způsobů optimalizace kódu:

-O (-O1) - Optimize.

A zároveň na strojích bez debugovacího rozhraní (x86?) zapíná

-O2 - Optimize even more

-O3 - Optimize yet more

-Os - Optimize for size. Tento zapne -O2, ale vypne -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -fprefetch-loop-arrays.

Co znamenají konkrétní -ffoo si laskavý čtenář jistě už přečte sám :-).

Vytváření knihoven v gcc

Knihovny rozlišujeme na statické a sdílené. Zatímco se ty první natvrdo slinkují s binárkou v době kopilace, ty druhé jsou uloženy na disku a linkují se až za běhu. Mějme následující kód:

$ cat hello.{h,c}
#include <stdio.h>

#ifndef __HELLO__
#define __HELLO__
void helloWorld(void);
#endif


#include "hello.h"
void helloWorld(void) {
  printf("Hello, world!\n");
}

Statická knihovna

Zdrojový kód přeložíme na objektový a ten zabalíme do statické knihovny. Název statické knihovny musí začínat na lib a končit na .a!

$ gcc -c hello.c -o hello.o
$ ar rcs libhello.a hello.o

Sdílená knihovna

Pro sdílenou knihovnu se objektový kód kompiluje s parametrem -fPIC. Jenom upozorňuji, že parametr -Wl se jmenuje dvojité vé el. Sdílená knihovna musí opět začínat lib a končit .so.verze_knihovny.


$ gcc -fPIC -c hello.c -o hello.o
$ gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0.1  hello.o

Používání knihoven

Kód z knihoven se používá naprosto stejně, jako kterýkoliv jiný. Vzhledem k tomu, že naše knihovna není na místě, kde je linker standardně hledá, musíme mu parametrem -L. sdělit, že má hledat i v aktuálním adresáři.

$ cat main.c 

#include "hello.h"

int main(void) {

  helloWorld();

  return 0;
}
$ gcc -static main.c -L. -lhello -o main.s
$ gcc main.c -L. -lhello -o main.d
$ ls -lh main.{s,d} | awk '{print $9, $5}'
main.d 7,1K
main.s 491K

Standardní cesty pro knihovny

Starším (a méně bezpečným způsobem) je proměnná LD_LIBRARY_PATH. Méně bezpečným proto, že umožňuje zaměnit sdílené knihovny suid programům.

Jak mě upozornil ivok, tak se tento problém už netýká novějších verzí ld-linux.so (z glibc6). Díky!

Modernější systémy používají nástroj ldconfig, který čte soubor /etc/ld.so.conf a potřebné informace si nahrává do cache /etc/ld.so.cache. Ldconfig a /etc/ld.so.conf může editovat používat pouze root.

Ukázka mého /etc/ld.so.conf z Gentoo

# ld.so.conf autogenerated by env-update; make all changes to
# contents of /etc/env.d directory
/usr/local/lib
/usr/lib/opengl/xorg-x11/lib
/usr/i686-pc-linux-gnu/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6
/usr/lib/mozilla-firefox
/usr/lib
/opt/sun-jre-bin-1.5.0.05/lib/i386/
/opt/sun-jre-bin-1.5.0.05/lib/i386/native_threads/
/opt/sun-jre-bin-1.5.0.05/lib/i386/xawt/
/opt/sun-jre-bin-1.5.0.05/lib/i386/server/
/usr/qt/3/lib
/usr/kde/3.4/lib
/usr/games/lib
/usr/lib/fltk-1.1

       

Hodnocení: -

zatím nehodnoceno
        š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ář

11.11.2005 17:57 zabza | skóre: 52 | blog: Nad_sklenkou_cerveneho
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Odpovědět | Sbalit | Link | Blokovat | Admin
To s tím LD_LIBRARY_PATH a setuid programama nebude tak docela pravda, jak jsem nedávno zjistil...
11.11.2005 18:10 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Teď jsem to zkoušel:
$ export LD_PRELOAD=libfake
$ ping
ERROR: ld.so: object 'libdoesntexit' from LD_PRELOAD cannot be preloaded: ignored.
$ export LD_PRELOAD=/usr/lib/hacklocaledir.so
$ strace ping
...
open("/usr/lib/hacklocaledir.so", O_RDONLY) = 3
...
$ stat -c %A /bin/ping
-rws--x--x
Takže tam ta chyba pořád je, nebo mám něco špatně v konfiguraci
When your hammer is C++, everything begins to look like a thumb.
11.11.2005 18:16 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Podle tohoto dokumentu by se mělo jednat o problém staršího ld-linux. Nové libc6 už by měly být OK. Ale já mám nové (2.3.5), takže nevím, v čem je problém.
When your hammer is C++, everything begins to look like a thumb.
11.11.2005 18:27 zabza | skóre: 52 | blog: Nad_sklenkou_cerveneho
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Ale v ld.so.conf máš /usr/lib a ta knihovna existuje... bavíme se o případu, kdy ta knihovna není v ld.so.conf, ne? POkud zapíšeš do /usr/lib svoji knihovnu, tak jsi root a nepotřebuješ dělat takový blbiny :-)
11.11.2005 18:34 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Ježiš, máš pravdu! Jsem debil, tohle mě vůbec nedošlo :-D
When your hammer is C++, everything begins to look like a thumb.
13.11.2005 23:18 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Jaká chyba? strace snad proboha není SUID.
12.11.2005 16:35 janosh | skóre: 8 | blog: janosh_blog | Třebíč
Rozbalit Rozbalit vše Re: man gcc: optimalizace a knihovny
Odpovědět | Sbalit | Link | Blokovat | Admin
docela dobry shrnuti nechces to dat napriklad do FAQ sekce?
Linux is like teepee, no windows, no gates, apache inside!

Založit nové vláknoNahoru

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