Hledat
Přihlásit se
  • Věda a technika
  • Herní doupě
  • Tipy pro PC
  • IT Byznys
  • Mobily
  • Počítače
  • Počítače
  • Témata
  • Poradna
  • Diskuzní fórum
  • Video
  • Bazar
  • Blogy
  • MĚŘENÍ RYCHLOSTI
  • RSS
  • Facebook Twitter Google+ YouTube
  • Hardware
  • Software
  • Počítače
  • Notebooky
  • Služby na webu
  • Apple
  • Google
  • Microsoft
  • Seznam
  • Tiskové zprávy
Další témata
  • Týden Živě
  • Zprávy Živě
  • Testy
  • Pitvy
Všechna videa
X

Doporučit článek

Vaše jméno:

Váš e-mail:

E-mail adresáta:

Komentář:

kontrolní kód

Odeslat

Blogy Živě » Linux zblízka

Linux zblízka

 

Vytvoření dynamické knihovny v Linuxu

6. 4. 2010, uzivatel2

V dnešním demonstračním praktickém díle seriálu Za tajemstvím kompilace v Linuxu vytvořím share objekt (knihovnu) a program, který :

  1. Vypíše “layout” svého paměťového prostoru.
  2. Načte námi předpřipravenou dynamickou knihovnu a opět vypíše “layout” paměti. (Uvidíme, kam přesně do paměti se knihovna načetla.)
  3. Spustí funkci z knihovny.
  4. Odregistruje knihovnu a postupem z bodu dva se přesvědčíme, že knihovna již není v paměti.

Jak vypsat “layout” paměti?

V Linuxu některé informace o stavu systému zpřístupňují grafické nadstavby, které závisejí na distribuci. Dále existuje velké množství univerzálních šikovných prográmků do terminálu, které často tvoří celé “produktové řady”. Jde například o odvozeniny top (vytížení systému), iftop (vytížení sítě), slabtop (množství slab alokací)… nebo stat, iostat, memstat, vmstat… Dále samotný systém exportuje potřebné statistiky a informace prostřednictvím souborů nebo adresářů v adresářích /proc a /sys; tuto možnost v příkladu využiji. Údaje o procesu jsou uloženy v adresáři /proc/PID/ (například u procesu s identifikačním číslem PID 9801 bude tento adresář /proc/9801). Speciálně soubor /proc/PID/maps je potřebný výpis. Nechci ukazovat programování manipulace se soubory, proto výpis provedu následujícím velmi jednoduchým způsobem :

#include <stdlib.h>

int main(){
system(“cat /proc/$PPID/maps”);
}

(Potřebné zdrojové kódy naleznete v přílohách blogu uložených na stránkách autora.)

Tento kód jednoduše spustí terminál (funkce system) a v něm příkaz cat /proc/$PPID/maps, kdy pochopitelně číslo rodičovského procesu ($PPID) je číslo našeho programu (viz tahák programování a základní příkazy Bashe).

Knihovna

Jde o naprosto běžný zdrojový kód, se kterým se však později jinak nakládá. Následující kód uložím jako soubor knihovna.c.

#include <stdio.h>

void vypis(){
printf(“Spustena funkce ze sdilene knihovny”);
}

Jak jsem psal již v díle musíme bezpodmíněčně kompilaci provést se vzláštními volbami (konkrétně gcc -fPIC -c knihovna.c) a následně opět se speciálním parametrem slinkovat (gcc -shared -o knihovna.so knihovna.o).  V praxi by bylo záhodno ještě nastavit tzv. soname, což je identifikační označení pro “vnitřní potřeby” linkeru.

Vlastní program

Následující vlastní kód programu uložím jako priklad.c. Pro jednoduchost jsem neošetřoval nepřítomnost knihovny (např. smazána) a další chybové stavy.

#include <stdlib.h>
#include <dlfcn.h>
#include <stdio.h>

int main(){
void *lib_handle;
void (*nactena_funkce)();

system(“cat /proc/$PPID/maps”);
printf(“\n\n\n“);

lib_handle = dlopen(“cesta-ke-knihovne/knihovna.so”, RTLD_LAZY);
nactena_funkce = dlsym(lib_handle, “vypis”);
(*nactena_funkce)();
printf(“\n\n\n“);

system(“cat /proc/$PPID/maps”);
printf(“\n\n\n“);

dlclose(lib_handle);
system(“cat /proc/$PPID/maps”);
}

Rekapitulace kódu: Funkce dlopen vede ke zpracování souboru cesta-ke-knihovne/knihovna.so. (Pochopitelně musíte uvést skutečné umístění knihovny např. /opt/pokusy-c/knihovna.so) Funkce dlsym vrátí ukazatel na kód funkce vypis z knihovny knihovna.so. Funkce dlclose je inverzní funkcí k dlopen.

Vytvoření binárky provedeme příkazem gcc -rdynamic -o priklad priklad.c -ldl . Po spuštení binárky ./priklad se objeví výpis paměti bez knihovny, výsledek volání funkce z knihovny (výpis “Spustena funkce z knihovny”), výpis paměti s knihovnou (nějaké takovéto řádky “b7ee9000-b7eea000 rw-p 00001000 08:01 2016471    /home/uzivatel/pokusy-c/knihovna/knihovna.so”) a výpis paměti bez knihovny.

V případě linkování knihovny při startu procesu pochopitelně nepotřebujeme zpřístupňovat spustitelný kód voláním dlopen a dlsym při vlastního běhu procesu. Příklad takovéhoto linkování je uveden v díle o vláknech.

Upozornění: Redakční systém blogu poškozuje uvozovky, takže při použití Ctrl+c a Ctrl+v se musí opravit uvozovky. Z bezpečnostních důvodů nejde zdrojové kódy uložit jako přílohu. Když bude zájem (komentáře pod článkem) mohl bych v budoucnu dát na své firemní stránky ke stažení objektové soubory a zkompilované programy z tohoto seriálu.

Pokračování seriálu

Tento seriál je podle statistiky čtenářsky neúspěšný. Pokud máte zájem o jeho pokračování napište mi komentář do diskuse. V případném pokračování seriálu bych se chtěl postupně věnovat problémy s pamětí (synchronizace a paměťové bariéry), optimalizacím při kompilaci, automatizace překladu (vytvoření makefile), virtuálním strojům (principy fungování, výhody, nevýhody…) a distribuci kódu (balíčky, podepisování, tvorba manuálových stránek).

Štítky: Seriál : Za tajemstvím kompilace


Publikováno v rubrice Nezařazené. Reakce v diskuzi lze sledovat prostřednictvím RSS 2.0. Můžete přidat komentář, nebo se na článek odkázat ze svého webu.

« Software pouze pro Linux
Jak vylepšit HADOPI? »
 

Komentáře v diskuzi

1.  cybermage(85.70.33.xxx)   6. 4. 2010, 16:34

Téma jistě zajímavé, ale na špatném webu. Živě se specializuje na platformu Windows, takže tady asi nebude moc lidí, které by zajímalo Unixové programování v C. Na Rootu by to ale určitě mělo úspěch (vážně, takovýhle blog tam schází).
Jestli chcete vážně Linuxu pomoci, tak udělejte seriál o programech pro běžné i firemní uživatele. Například populární audio/video přehrávače, editory obrázků a videa, CAD, vývojová prostředí apod. A z každé oblasti vyberte jen to nejlepší. Začít můžete např. s těmi virtuálními stroji. Z dalších kapitol které jste navrhoval už by potom mohla zaujmount snad jen ta o balíčkovacích systémech.

2.  e.xitu.s(217.112.175.xxx)   6. 4. 2010, 16:36

Tyhle články se mi líbí, ale psát je na živě je zbytečné. Tady jsou samí wokňáci a tyhle články jsou jim na prd. Piš to raději na root.cz, abclinuxu.cz atd… Tam se ti více odvděčí ;-)

3.  peto(147.175.125.xxx)   6. 4. 2010, 16:43

ja serial sledujem vzdy a som za neho vdacny

>postupně věnovat problémy s pamětí (synchronizace a paměťové bariéry),

Toto je podla mna vhodnejsie na koniec

>optimalizacím při kompilaci,

toto je parada

> automatizace překladu (vytvoření makefile),

toto ma tiez velmi zaujima

>virtuálním strojům (principy fungování, výhody, nevýhody…)

toto je asi nie vlemi potrebne

>a distribuci kódu (balíčky, podepisování, tvorba manuálových stránek).

Toto je velmi zaujimava tema a hodila by sa hned na dalsi diel…

Sokovalo ma ako lahko sa da vytvorit zdielana kniznica…

>Jak jsem psal již v díle musíme bezpodmíněčně kompilaci provést se vzláštními volbami (konkrétně gcc -fPIC -c knihovna.c) a následně
>opět se speciálním parametrem slinkovat (gcc -shared -o knihovna.so knihovna.o). V praxi by bylo záhodno ještě nastavit tzv. soname, což
>je identifikační označení pro “vnitřní potřeby” linkeru.

ja som si mysle, ze treba”sachovat” s libtool, aby sa vytvorila kniznica linkovatelena dynamickym linkerom . Ale este asi nieco bude treba, aby sa likovala stylom -lncurses, a nebolo treba pouzit -ldl pri kompilaci binarky… A ziadne dlopen….

Vdaka ale za serial…

4.  gert(84.42.159.xxx)   6. 4. 2010, 17:55

Zdar, tvoje clanky si rad ctu. Mozna, ze treba na rootu by byla navstevnost vyssi.
Zajimalo by me synchronizace a paměťové bariéry a dale veci souvisejici s kompilaci, tj optimalizace a automatizace :)

5.  uzivatel2(ověřeno)   6. 4. 2010, 18:23

Takže ten miniseriál dopíši…

Zastoupení operačních systémů podle statistiky blogu je celkově přibližně 70% Windows, 8% Ubuntu, 11% jiný Linux, 3% Mac OS, 0.1% různá BSD a zbytek neznámý (např. různí roboti). Statistiky vychylují hodně čtené články, které vychází na titulní stránce zive, kdy na Windows připadá hodně přes 80%. Jinak například za poslední den (není žádný článek na titulní stránce zive) z necelých 600 přístupů je 52% Windows, 15% Ubuntu, 17% jiný Linux, 2% Mac OS a zbytek neznámý. Takže si nemyslím, že by to byl v absolutních hodnotách nízký provoz z Linuxu.

Zive.cz se soustředí na vysokou návštěvnost, čemuž odpovídá zaměření a forma. Zive.cz je nejčtenější IT magazín v ČR. Proto příspěvky, které mi vyjdou na titulní straně, mají extrémní návštěvnost (Nevětší výhody Linuxu 18681, Největší nevýhody Linuxu ‎15283, “Utajované” technologie Googlu ‎15264…). Většina příspěvků na tomto blogu má popularizační charakter a proto imho hosting zive.cz je vhodnější než např. root.cz…

Miniserie “Za tajemstvím kompilace na Linuxu” tématicky ani odbornostně do blogu příliš nezapadá a spíše patří na v prvním příspěvku zmiňované servery.

6.  ares952(217.30.68.xxx)   6. 4. 2010, 20:29

Tomu říkám husté články. Bylo by možné je někdy vydat v pdfkách? :-)

7.  Lovap(94.228.83.xxx)   6. 4. 2010, 21:49

No … neviem … popularizačný charakter možno tieto články majú, ale rozhodne nie pre bežného návštevníka zivě.cz. Naozaj by viac prospeli na roote, alebo abclinuxu. Poviem to takto: tieto články sú až moc “hardcore”. Ja linux používam (ako BFU :-) ) a teda v tomto sa kvalitne strácam.

8.  Hulvat(92.52.2.xxx)   7. 4. 2010, 00:13

1 a 2: a windows pouzivatelia si nemozu precitat nieco o linuxe? podla mna ano a vela z nich to aj robi

a to, ze je tu (na zive) malo linuxakov je nezmysel. Je ich tu dost (aj ja som), staci si pozriet diskusie. Clanky tohto blogu citam velmi rad a je dobre, ze tu je aj nieco uzitocne medzi kopou blbosti o O2 kritike ci milion MAC a Apple blogov.

9.  Soccer Jerseys(58.22.73.xxx)   9. 9. 2010, 05:12

Zdar, tvoje clanky si rad ctu. Mozna, ze treba na rootu by byla navstevnost vyssi.

Přidat komentář

*
Opište prosím text z obrázku.
Anti-Spam Image


Aktuální články a bleskovky

Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Brýle Google Glass jsou patentované
Brýle Google Glass jsou patentované
Ifttt.com: Propojte a automatizujte svůj internet
Ifttt.com: Propojte a automatizujte svůj internet
Nejlepší programy pro práci s Wi-Fi
Nejlepší programy pro práci s Wi-Fi



Linux zblízka využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články a komentáře


  • Seznam odkazů

    • Kontakt na autora blogu
    • Moje články pro LE
    • Různé přílohy k blogu
    • Stránky autora blogu
  • Poslední příspěvky

    • Chystá se revoluce v hraní her?
    • Kontroverze okolo Křišťálové lupy
    • Deset největších open source inovací
    • Nová “daň” za software
    • Má smysl kupovat TV tuner?
    • Zvýšila se v Linuxu spotřeba?
    • Porušování GPL licence ve světě Androidu
    • Je bezplatnost Linuxu výhodou?
    • Potřebujeme nová uživatelská rozhraní?
    • Podvod s hlasováním v přímém přenosu
    • Facebook není zadarmo
    • Nápad na startup
    • Co hrají linuxáci?
    • Nová cloudová platforma OpenShift
    • Kvalitní linuxové antiviry pro desktop ve skutečnosti neexistují
  • Administrace

    • Přihlásit se

1210_Computer.png

Časopis Computer

  • Nakupujte v zahraničí
  • Test 7 čteček elektronických knih
  • Technologie: nové standardy digitálního vysílání
  • Přehled cloudových uložišť
  • Poradíme s výběrem kamery na dovolenou

Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN


Video Živě

Bluetooth stojánky pro Android: Philips AS111, AS141 a AS351
Ifttt.com -- založení úkolu
Zprávy Živě - 12. května 2012
iPad docky Logitech AV Stand a Logitech Speaker Stand

další videa »






Mladá Fronta a.s. Mladá Fronta a.s.
Tiráž | Autoři | Připomínky | Odběr novinek | RSS | Textová verze
Copyright 2000–2012 Mladá fronta a.s. | Inzerce: onlinesales@mf.cz | Kontakt na redakci | Návštěvnost měří NetMonitor