sdilena knihovna a gcc s -nostartfiles

Michl Ladislav xmichl03 na stud.fee.vutbr.cz
Středa Květen 30 10:33:38 CEST 2001


On Wed, 30 May 2001, Vladimir Michl wrote:

> Dobry den,

ahoj :-)

> mam takovy problemek a nevim zda reseni ktere jsem nasel je spravne, ci
> nema nejake vedlejsi efekty.
>
> Tyka se jiz existujici sdilene knihovny,
> ktera pred unloadem potrebuje uvolnit nejake veci. Zatim to knihovna
> resi tim zpusobem, ze pomoci atexit si zaregistruje funkci, ktera po
> knihovne uklidi. Bohuzel toto reseni vyhovuje, pokud program linkuje
> knihovnu pri kompilaci. Pokud se ale knihovna prilinkovava pomoci dlopen,
> je problem. V dlopen pisi, ze pokud knihovna exportuje _init a _fini,
> jsou tyto vykonany (_init pri dlopen, _fini pri dlclose). Standardne, jsou
> ale tyto funkce definovany, a nevim jak se do nich registrovat. Nahodou
> jsem prisel na prepinac gcc -nostartfiles, ktery zpusobi, ze funkce _init
> a _fini nejsou definovany a tak si je muzu napsat sam. Na malem testovacim
> programku jsem si overil, ze _init a _fini jsou volany jak pri dlopen a
> spol, tak pokud je knihovna linkovana primo pri prekladu, takze si muzu
> uklizeci funkci volat z _fini v obou pripadech a neni treba pouzivat
> nejaky atexit.
>
> Otazka zni, zda odstraneni puvodnich _init a _fini ma nejaky vliv na
> funkci programu. Kdyz jsem se dival do zdrojaku libc, jsou tam nejake
> inicializace a pod. Ale myslim, ze u sdilene knihovny to neni treba,
> jelikoz libc je jiz zinicializovana. Je to spravna uvaha, nebo je nejake
> jine a lepsi reseni.

Two special functions aid in initializing and finalizing a module: _init and
_fini. If a function ``_init'' is exported in a library, then it is called
when the library is first opened (via dlopen() or simply as a shared
library). In a C program, this just means that you defined some function
named _init. There is a corresponding function called _fini, which is called
whenever a client finishes using the library (via a call dlclose() that
brings its reference count to zero, or on normal exit of the program). The C
prototypes for these functions are:
  void _init(void);
  void _fini(void);

When compiling the file into a ``.o'' file in gcc, be sure to add the gcc
option ``-nostartfiles''. This keeps the C compiler from linking the system
startup libraries against the .so file. Otherwise, you'll get a
``multiple-definition'' error. My thanks to Jim Mischel and Tim Gentry for
their suggestion to add this discussion of _init and _fini, as well as help
in creating it.

další viz. (nejsem si jistý jestli jsem spravně pochopil otázku :-))
http://www.linux.com/howto/Program-Library-HOWTO/

hezký den,
Laďa



Další informace o konferenci Linux