[ Jovan Marjanovic @ 28.03.2002. 12:46 ] @
Elem,

Pisem ja dinamicko loadanje jednog share lib-a, i pokusavam da utvrdim da li moj kod ne valja, ili library ne valja.

pa mu kazem vako:

Code:


#include <dl.h>

int whatever()
{
    shl_t hndl_api;

    hndl_api = shl_load("/path/do/api-a/api.sl", BIND_IMMEDIATE | DYNAMIC_PATH, 0L);

    if (hndl_api == NULL)
        return -1;
}



i redovno mi vrati -1, iako znam da je biblioteka tamo, ali ne znam da li radi, i da li je ikada testirana, jer jedan drugi tim radi na tome.
ajd ako je neko radio nesto slicno na HP-UX-u, dajte savete :)

Naravno, to je samo snippet koda koji pokusava da loada library, iza toga sledi deo koji mapira funkcije iz library-a, poziva te funkcije, i na kraju unloada library. Iz odredjenih razloga nisam napisao i taj deo koda :)
[ leka @ 28.03.2002. 13:31 ] @
Ja zaista ne znam kako sve to radi na HP-UX, ali znam kako radi u Linux-u. U Linux-u prvo ldd-a treba da naucis da "tu i tu" postoji biblioteka sa svojim "imenom i prezimenom". To se na najlaksi moguci nacin radi sa ldconfig-om, a moze i sa LD_LIBRARY_PATH-om. Mozda je slicno i na HP-UX-u, ja se sa HP-UX-om nikada nisam sretao, tako da pojma nemam kako se tamo radi sa SHARED OBJECTS (neki to zovu shared library, sto je po meni netacan termin, ali to je za neku drugu diskusiju).

Ovo sto ti Jovane napisa ovde znaci zapravo da HP-UX ne radi sa "shared objects" (Dinamicke biblioteke, iliti DLL-ovi - za wintendo korisnike), na isti nacin. Malo je to cudno, jer svi UNIX-i na kojima sam radio u zivotu imaju bas .so kao ekstenziju, i takodje imaju neki svoj linker, koji maltene isto radi kao i u Linux-u.

Ukratko receno, zbunjen sam ovim tojim .sl . U Linux-u se to radi prosto: treba da imas soname, linker name (oba su linkovi) i pravi .so fajl

Tako da zapravo tamo gde si intalirao .so imas nesto tipa libblue.so (linker name), libblue.so.1 (soname) i recimo libblue.so.1.0.1 . To tako radi i NIKAKO drugacije - i radi savrseno!. Ne mozes sam da biras... Da budem iskren, nisam nikada probao da promenim ime .so fajlu i "ucitam" ga sa dlopen() ...

[ alex @ 28.03.2002. 14:01 ] @
Hehe, leko.. Pa tako ti je u HP-UXu, .sl je Shared Library.

Blue, ja sam imao istih problema, nisam mogao da ucitam shared lib iako je bila tamo i iako je sve u redu s njom. Onda je dosao jedan chicha is HP.is i sredio situaciju, provericu sa tim covekom cemu se radi pa cu javiti.

poz, alex.
[ Jovan Marjanovic @ 28.03.2002. 14:16 ] @
HP-UX ima standadne .so fajlove, koji se definisu, i njihova lokacija se definise preko LD_LIBRARY_PATH varijable. Ali u ovom slucaju ne radim sa standardnin shared objektom, koji ce se nalaziti negde u tom pathu, nego radim sa jednom bibliotekom koja je instalirana u sluvaju da je odredjeni produkat sa kojim se integrisem instaliran. U tom sluvaju, ako je handle na taj library NULL, ja lepo kazem produkta nema, ne pozivaj kod za itegraciju. U slucaju koji sam opisao, znam za sigurno da taj .sl fajl postoji, jer sam ga ja licno instalirao tamo. i uvek ce biti na tom, i samo tom pathu (recimo /opt/sanmgr/lib)
Nesto slicnao sam radio za Solaris, gde sam koristio
Code:

dlopen(_T("neki_lib.so"), RTLD_LAZY) 

i sve mi je radilo perfektno.
onda sam lepo sa dlsym mapirao simbole, i sve je opet radilo fino.
Ovde je veliko pitanje da li uopste radi taj moj lib, ili samo samo nesto *ajebao u tom parcetu koda.
Inace, na HP-UX-u su shared objects poznati kao shared libraries, i imaju .sl suffix
[ Jovan Marjanovic @ 28.03.2002. 14:17 ] @
Obicno sam ja chicha iz HP koji dodje i sredi situaciju :P
[ leka @ 03.04.2002. 15:33 ] @
E pa takve "chiche" treba da znaju za ovako nesto:
Code:

HP-UX shared libraries can be specified 

at linktime with arguments such as  "-Wl,+s,+b,/usr/local/lib:." on the command-line or in LDFLAGS, or 
at runtime through the environment variable SHLIB_PATH.


Ja zaista nisam u zivotu pipnuo HP-UX, ali da radim svakodnevno na njemu, ovakve "sitnice" bih svakako trebalo da znam... ;)
[ Jovan Marjanovic @ 04.04.2002. 13:38 ] @
Problem resen.
Kao sto rekoh leki vec na ircu, dodao sam -Wl,+s flag na linker.
ali glavni problem je bio u tome sto covek koji je pisao API nije razmisljao o odredjenim stvarima, tako da library nije ni mogao da se loada. Kad je on popravio svoj deo, sve radi.