abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 23:55 | Pozvánky

Spolek OpenAlt zve příznivce otevřených technologií a otevřeného přístupu na 145. brněnský sraz, který proběhne v pátek 20. října od 18:00 hodin v restauraci Time Out na adrese Novoměstská 2 v Řečkovicích. Jedná se o poslední sraz před konferencí OpenAlt 2017, jež proběhne o víkendu 4. a 5. listopadu 2017 na FIT VUT v Brně. Běží registrace účastníků.

Ladislav Hagara | Komentářů: 0
včera 21:44 | Nová verze

Byla vydána verze 5.2.0 multiplatformního virtualizačního nástroje Oracle VM VirtualBox. Jedná se o první stabilní verzi z nové větve 5.2. Z novinek lze zmínit například možnost exportování VM do Oracle Cloudu, bezobslužnou instalaci hostovaného systému nebo vylepšené GUI. Podrobnosti v seznamu změn. Aktualizována byla také dokumentace.

Ladislav Hagara | Komentářů: 1
včera 14:00 | Zajímavý projekt

Byl spuštěn Humble Down Under Bundle. Za vlastní cenu lze koupit multiplatformní hry The Warlock of Firetop Mountain, Screencheat, Hand of Fate a Satellite Reign. Při nadprůměrné platbě (aktuálně 3,63 $) také Hacknet, Hacknet Labyrinths, Crawl a Hurtworld. Při platbě 12 $ a více lze získat navíc Armello.

Ladislav Hagara | Komentářů: 0
včera 13:00 | Nová verze

Google Chrome 62 byl prohlášen za stabilní (YouTube). Nejnovější stabilní verze 62.0.3202.62 tohoto webového prohlížeče přináší řadu oprav a vylepšení. Vylepšeny byly také nástroje pro vývojáře (YouTube). Opraveno bylo 35 bezpečnostních chyb.

Ladislav Hagara | Komentářů: 2
včera 11:00 | Zajímavý článek

Článek (en) na Mozilla.cz je věnován vykreslování stránek ve Firefoxu. V průběhu roku 2018 by se ve Firefoxu měl objevit WebRender, jenž by měl vykreslování stránek urychlit díky využití GPU.

Ladislav Hagara | Komentářů: 4
včera 08:22 | Bezpečnostní upozornění

NÚKIB (Národní úřad pro kybernetickou a informační bezpečnost) informuje o zranitelnosti ROCA v procesu generování RSA klíčů, který se odehrává v softwarové knihovně implementované například v kryptografických čipových kartách, bezpečnostních tokenech a dalších hardwarových čipech vyrobených společností Infineon Technologies AG. Zranitelnost umožňuje praktický faktorizační útok, při kterém útočník dokáže vypočítat

… více »
Ladislav Hagara | Komentářů: 3
včera 01:23 | Zajímavý software

Příspěvek na blogu otevřené certifikační autority Let's Encrypt informuje o začlenění podpory protokolu ACME (Automatic Certificate Management Environment) přímo do webového serveru Apache. Klienty ACME lze nahradit novým modulem Apache mod_md. Na vývoj tohoto modulu bylo uvolněno 70 tisíc dolarů z programu Mozilla Open Source Support (MOSS). K rozchození HTTPS na Apache stačí nově přidat do konfiguračního souboru řádek s ManagedDomain. Minutový videonávod na YouTube [reddit].

Ladislav Hagara | Komentářů: 2
17.10. 14:15 | Komunita

Daniel Stenberg, autor nástroje curl, na svém blogu oznámil, že obdržel letošní Polhemovu cenu, kterou uděluje Švédská inženýrská asociace za „technologickou inovaci nebo důvtipné řešení technického problému“.

marbu | Komentářů: 10
17.10. 13:40 | Pozvánky

Cílem Social Good Hackathonu, který se uskuteční 21. a 22. října v Brně, je vymyslet a zrealizovat projekty, které pomůžou zlepšit svět kolem nás. Je to unikátní příležitost, jak představit nejrůznější sociální projekty a zrealizovat je, propojit aktivní lidi, zástupce a zástupkyně nevládních organizací a lidi z prostředí IT a designu. Hackathon pořádá brněnská neziskovka Nesehnutí.

… více »
Barbora | Komentářů: 1
17.10. 00:44 | Pozvánky

V sobotu 21. října 2017 se na půdě Elektrotechnické fakulty ČVUT v Praze uskuteční RT-Summit – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt.

… více »
Pavel Píša | Komentářů: 8
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (13%)
 (2%)
 (0%)
 (2%)
 (73%)
 (11%)
Celkem 63 hlasů
 Komentářů: 4, poslední včera 21:50
    Rozcestník

    Dotaz: Volani fci z dynamickych knihoven v C

    tomes.io avatar 7.10.2012 15:10 tomes.io | skóre: 12 | blog: tomesh
    Volani fci z dynamickych knihoven v C
    Přečteno: 423×
    Ahoj, ucim se psat dynamicke knihovny a zatim se mi nedari si zavolat ani mou prvni pokusnou fci kontrolni.c:
    /**
     * @file kontrolni.c
     */
    
    
    
    void hello(void) {
      printf("Hello, library world.\n");
    }
    
    Tu si prelozim a nahraju jako dynamicky sdilenou knihovnu kontrolni.so:
    gcc -Wall -fPIC -c kontrolni.c
    gcc -shared -Wl,-soname,kontrolni.so.0 -o kontrolni.so.0.0.1 kontrolni.o
    
    
    No a dle nekolika manualu jsem se znazil tu mou fci hello z knihovny kontrolni.so zavolat:
    
    typedef void* (*arbitrary)();
    
    arbitrary my_function;
    
    void* handle = dlopen(0,RTLD_NOW|RTLD_GLOBAL);
    
    *(void**)(&my_function) = dlsym(handle,"hello");
    
    my_function();
       
    dlclose(handle);
    
    
    Nasel jsem si i manual, kde se vola fce takto:
    void    *handle;
    int     *iptr, (*fptr)(int);
    
    /* open the needed object */
    handle = dlopen("/usr/home/me/libfoo.so", RTLD_LOCAL | RTLD_LAZY);
    
    /* find the address of function and data objects */
    *(void **)(&fptr) = dlsym(handle, "my_function");
    iptr = (int *)dlsym(handle, "my_object");
    
    /* invoke function, passing value of integer as a parameter */
    (*fptr)(*iptr);
    
    Jenomze jsem se jeste nedocet, co by mely byt ty data objects. POstradam nejaky konkretni priklad.

    Mohl by mi nekdo ukazat svetlo v tunelu a navest me? :) Fakt nevim, co delam spatne.

    Řešení dotazu:


    Odpovědi

    7.10.2012 15:59 l4m4
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Co se přesně snažíš udělat? Toto není normální použití dynamických knihoven -- při něm prostě knihovnu k hlavnímu programu přilinkuješ, zhruba

    program.c:
    #include <kontrolni.h>
    int
    main(void)
    {
        hello();
        return 0;
    }
    
    kde v kontrolni.h je příslušná deklarace hello a pak

    gcc -o program program.o -lkontrolni

    Pokud chceš napoak otevřít knihovnu až za běhu pomocí dlopen(), tak první argument je jméno souboru s knihovnou, tedy "/cesta/někam/kontrolni.so". NULL znamená otevřít tímto způsobem sám program, aby mohl hledat symboly sám v sobě (což má smysl pouze při linkování s --export-dynamic); 0 je totéž co NULL + zblbost C++...

    Konvence pojmenování je

    (a) Dynamická knihovna s verzovaným interface: libfoo.so.1.2.3, kde čísla definují verze interface, viz sekci Versioning v dokumentaci libtoolu.

    (b) Dynamická knihovna, kde se na verzování interface nehraje, protože není kompatibilní s předchozími ani následujícími: libfoo-1.2.3.so, kde 1.2.3 je prostě verze.

    (c) Dynamický modul pro dlopen()ování: foo.so, bez lib a bez verzí (případné verzování se tady řeší až něčím, co se po otevření modulu najde uvnitř).

    Důvod prefixu lib v (a) a (b) je, že ho linker zase odstraňuje, tj. -lfoo hledá libfoo; taky ti v tom případě něco musí udělat ten smylink z libfoo.so.0 na libfoo.so.0.0.0 (normálně ldconfig) a ta knihovna musí být v LD_LIBRARY_PATH nebo musíš použít -rpath (což ostatně platí i pro dlopenování, i když tam se spíš používá plná cesta, případně můžeš napsat "./kontrolni.so" pro aktuální adresář). Název kontrolni.so.0.0.0 do toho nezapadá a opět těžko říci, o kterou z tech tří věci se snažíš.

    Konečně, ta deklarace arbitrary je blbě, pokud funkce vrací void, protože ji máš deklarovánu jako funkci vracející ukazatel (navíc nemá deklarovány argumenty), a program neřeší kontrolu chyb, ani nepíšeš, co vlastně nefunguje, takže těžko říci. Mi to po opravení chyb a upravení na případ (c) normálně funguje.
    7.10.2012 16:01 l4m4
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Jo, a ten type-punning je hrozný, obzvlášť když stačí psát

    my_function = dlsym(handle, "hello");
    tomes.io avatar 7.10.2012 17:48 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Diky za poucnou odpoved :) Snazim se zavolat tu mou fci tak, aby mi vypsala "hello libary world". Linkovat knihovny umim, ale ja se chci naucit pracovat s dynamickymi knihovnami. Meli jsme to ve skole, mam predmet o systemovem programovani v linuxu, tak si chci napsat program, ktery mi bude volat funkce z nejake mnou napsane dynamicke knihovny. Primo za behu programu, cili chci pouzit dlopen().

    Pridal jsem kontrolu chyb a kod trochu upravil:
         void (*my_function)(void);     //PRoc takovato deklarace? Potoze fce hello je deklarovana jako void hello(void)
    
                            
              void* handle = dlopen("/home/.../.../Vyvoj_C/libkontrolni.so", RTLD_NOW);        //misto tri tecek je cesta k souboru
                            
                  if(handle==NULL) {
                      fputs (dlerror(), stderr);
                      exit(1);
                  }
    
               my_function = dlsym(handle,"hello");
                            
                   if(my_function==NULL) {
                       fputs(error, stderr);
                       exit(1);
                            }
    
               my_function();
       
               dlclose(handle);
    Diky osetreni chb mi ted pocitac nadava, ze ta knihovna vubec neexistuje:
    Vyvoj_C/kontrolni.so: cannot open shared object file: No such file or directory
    Pokud ovsem prepisu volani dlopen na:
    dlopen(".../Vyvoj_C/libkontrolni.so.0.0.1", RTLD_NOW)
    Tak se mi ta ma fce zavola a Hello, world, se vytiskne... Funguje tedy pripad (a), ale ne pripad (c). Mohl bys mi jeste osvetlit proc? Zajimalo by me, co mi uniklo, co jsem nepochopil. Diky.
    7.10.2012 20:13 l4m4
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Tak předně teminologie: dynamické knihovny jsou všechny, které se linkují při spuštění/za běhu programu. To tedy zahrnuje i běžné

    gcc -o program program.o -lfoo

    které přilinkuje nějaké foo.so, protože ‚fyzicky‘ knihovnu přilinkuje až dynamický linker ld.so při spouštění; předchozí příkaz v podstatě jen přidává jakousi symbolickou závislost na knihovnu do výsledné binárky.

    Takže budu ‚dynamické knihovny‘ dále považovat za moduly, tj. věci, které se natahují za běhu explicitně pomocí dlopen(), nikoli implicitně pomocí ld.so (což je reálně ld-linux-x86-64.so...).

    Teď k vlastnímu problému: soubor s knihovnou, zadaný jako první argument dlopen() se hledá v několika místech, viz dlopen(3), ale když zadáš cestu, tak toto odpadá, zkouší se pouze konkrétní zadaný soubor. V případě (c) AFAIK na -soname moc nesejde, ale jako soname se v tomto případě používá normálně skutečné jméno, tj. např. kontrolni.so.

    Proč ti to nefunguje... Pokud se shared object jmenuje libkontrolni.so.0.0.1, tak se musí psát takhle (resp. s cestou, jak bylo popsáno). Pokud se jmenuje kontrolni.so, tak musí opět zadat toto jméno. Tady by neměl být žádný háček, prostě se soubor na disku má jmenovat stejně, jako co dáváš jako první argument dlopen(). Pro 100% blbuvzdornost bych tam v první iteraci napsal absolutní cestu; když pak dostaneš No such file or directory, tak ten soubor fakt neexistuje a píšeš cestu blbě, případně je to symlink na neexistující soubor. Existuje-li, měl bys přinejmenším dostat jinou chybu.
    tomes.io avatar 7.10.2012 22:23 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Diky za pomoc, uz mi to funguje jak ma.

    Jenom bych se snad jeste zeptal, jak potom pro sdilenou knihovnu napsat Makefile? Chci, aby se mi s prelozenim hlavniho programu zkompilovala i ta sdilena knihovna. Zkusil jsem:
    NAME=pokusny
    
    CC=gcc                                 
    CFLAGS=-ldl -std=c99 -pedantic -Wall -Wextra -D_GNU_SOURCE 
    
    #kompilace programu
    
    $(NAME): main.c
    	$(CC) $(CFLAGS) main.c -o $(NAME)
    
    pokusne.o: pokusne.c
    	$(CC) $(CFLAGS) convertions.c -c
    
    #kompilace sdilene knihovny
    
    convert.o : convert.c
    	$(CC) -Wall -fPIC -c kontrolni.c
    
    convert.o : convert.c
    	$(CC) -shared -Wl,-soname,kontrolni.so.0 -o libkontrolni.so.0.0.1 kontrolni.o
    
    Priznam se, ze to s Makefile moc neumim. Nic jsem poradne k psani makefile pro shared libaries nevygooglil. Vyse zmineny Makefile mi udela binarku s programem, ale knihovnu nevytvori.

    V prikazove radce mi to ale pekne tu knihovnu vytvori:
    gcc -Wall -fPIC -c pokusny.c
    gcc -shared -Wl,-soname,kontrolni.so.0 -o libconvert.so.0.0.1 convert.o
    
    
    7.10.2012 23:21 l4m4
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Sice tím nepronikneš do technických detailů, ale velmi doporučuji použít libtool. V jeho manuálu je pěkně popsáno, jak vytvářet různé věci (knihovny, moduly, ...) a je poměrně dobře multiplaformní. Pokud nepíšeš nějaký Linux-only program, tak se určitě vyplatí, protože sdílené knihovny, dlopen()ování a pod. fungují na každém systému trošku (případně hodně) odlišně.

    Standardní použití předpokládá autotools a konfiguraci pro daný systém skrze configure, ale pro humpolácké použití lze prostě předpokládat jeho přítomnost v systému a spouštět ho z pravidel v Makefile.
    tomes.io avatar 9.10.2012 21:20 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    No me by spis zajimalo, procm i muj vyse uvedeny makefile nefunguje, mel jsem za to, ze prikaz make postupne provadi krok za krokem kompilace uvedene v Makefile...
    9.10.2012 21:39 kuka
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Najdi si na to nejaky tutorial, unika ti zakladni princip make. Coz je, velmi zjednodusene receno, ze pro cile se definuji jejich zavislosti. Tzn. pokud bude mit cil "program" zavislost na "sdilena knihovna", tak se v ramci jeho splneni ta knihovna vytvori. Rozhodne se neprovadi "postupne krok za krokem", k cemu by to bylo?
    Josef Kufner avatar 7.10.2012 23:31 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Na tohle se mi osvědčilo si udělat třetí (meta)"projekt". Prostě jak máš program v jednom adresáři a knihovnu v druhém, tak si je dáš oba do třetího, kde bude jen makefile a třeba nějaký script na spuštění. Ten makefile pak vypadá velmi jednoduše: jedno pravidlo pro každý sub-projekt (make -C subprojekt) a na začátku all, které závisí na všem. Pokud používáš git, lehce se pak dají použít jeho submoduly. Stejně pak můžeš přibalit testy, dokumentaci, další nástroje,...
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 7.10.2012 19:43 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    V tom přiřazování výsledku dlsym máš nějakou zvrhlost. Udělej prostě
    my_function = dlsym(handle, "hello");
    a mělo by to být v pohodě. Rozhodně však přidej kontrolu, zda se dlopen a dlsym povedly, neboť se aspoň dozvíš, co je špatně.

    Jinak to vypadá celkem v pořádku. Tedy za předpokladu, že v době kompilace nevíš, zda tu knihovnu opravdu potřebuješ (volitelná součást/výběr dle architektury) nebo v případě, že se jedná o nějaký plugin.
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 7.10.2012 22:24 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Ty zvrhlosti tam jsou proto, ze mi jinak prekladac hodi warning, ze ISO C90 takove prirazeni odkazu zakazuje...Proto to musim pretypovat.
    Josef Kufner avatar 7.10.2012 22:28 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    Tak to přetypování dej napravo od rovnítka. Je to přehlednější a kratší.
    Hello world ! Segmentation fault (core dumped)
    7.10.2012 22:35 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Volani fci z dynamickych knihoven v C
    A hlavně to daleko víc dává smysl. Zejména když už si natypedefoval typ té funkce.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.