Scroll to navigation

DLOPEN(3) п═я┐п╨п╬п╡п╬п╢я│я┌п╡п╬ п©я─п╬пЁя─п╟п╪п╪п╦я│я┌п╟ Linux DLOPEN(3)

п≤п°п╞

dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym - п©я─п╬пЁя─п╟п╪п╪п╫я▀п╧ п╦п╫я┌п╣я─я└п╣п╧я│ п╨ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦ п╨п╬п╪п©п╬п╫я┐я▌я┴п╣п╪я┐ п╥п╟пЁя─я┐п╥я┤п╦п╨я┐

п·п▒п≈п·п═

#include <dlfcn.h>

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

п п╬п╪п©п╬п╫п╬п╡п╟я┌я▄ я│ -ldl.

п·п÷п≤п║п░п²п≤п∙

п≤п╫я┌п╣я─я└п╣п╧я│ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦ п╨п╬п╪п©п╬п╫я┐я▌я┴п╣пЁп╬ п╥п╟пЁя─я┐п╥я┤п╦п╨п╟ я─п╣п╟п╩п╦п╥п╬п╡п╟п╫ я┤п╣я┌я▀я─я▄п╪я▐ я└я┐п╫п╨я├п╦я▐п╪п╦: dlopen(), dlsym(), dlclose(), dlerror().

dlerror()

п╓я┐п╫п╨я├п╦я▐ dlerror() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ п©п╬п╫я▐я┌п╫я┐я▌ п╢п╩я▐ я┤п╣п╩п╬п╡п╣п╨п╟ я│я┌я─п╬п╨я┐, п╬п©п╦я│я▀п╡п╟я▌я┴я┐я▌ п©п╬я│п╩п╣п╢п╫я▌я▌ п©я─п╬п╦п╥п╬я┬п╣п╢я┬я┐я▌ п╬я┬п╦п╠п╨я┐ п╡ dlopen(), dlsym() п╦п╩п╦ dlclose() я│ п©п╬я│п╩п╣п╢п╫п╣пЁп╬ п╡я▀п╥п╬п╡п╟ dlerror(). п·п╫п╟ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ NULL, п╣я│п╩п╦ п╬я┬п╦п╠п╬п╨ п╫п╣ п╠я▀п╩п╬ я│ п╫п╟я┤п╟п╩п╟ п╦п╫п╦я├п╦п╟п╩п╦п╥п╟я├п╦п╦ п╦п╩п╦ я│ п╪п╬п╪п╣п╫я┌п╟ п╣я▒ п©п╬я│п╩п╣п╢п╫п╣пЁп╬ п╡я▀п╥п╬п╡п╟.

dlopen()

п╓я┐п╫п╨я├п╦я▐ dlopen() п╥п╟пЁя─я┐п╤п╟п╣я┌ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨я┐я▌ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐, п╦п╪я▐ п╨п╬я┌п╬я─п╬п╧ я┐п╨п╟п╥п╟п╫п╬ п╡ я│я┌я─п╬п╨п╣ filename (п╥п╟п╡п╣я─я┬п╟п╣я┌я│я▐ п╫я┐п╩я▒п╪) п╦ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ п©я─я▐п╪п╬п╧ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨я┐я▌ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐. п∙я│п╩п╦ filename я─п╟п╡п╫п╬ NULL, я┌п╬ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ п╬я│п╫п╬п╡п╫я┐я▌ п©я─п╬пЁя─п╟п╪п╪я┐. п∙я│п╩п╦ filename я│п╬п╢п╣я─п╤п╦я┌ п╨п╬я│я┐я▌ я┤п╣я─я┌я┐ ("/"), я┌п╬ я█я┌п╬ п╡п╬я│п©я─п╦п╫п╦п╪п╟п╣я┌я│я▐ п╨п╟п╨ п╦п╪я▐ я│ п©я┐я┌я▒п╪ (п╬я┌п╫п╬я│п╦я┌п╣п╩я▄п╫я▀п╪ п╦п╩п╦ п╟п╠я│п╬п╩я▌я┌п╫я▀п╪). п≤п╫п╟я┤п╣ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦п╧ п╨п╬п╪п©п╬п╫п╬п╡я┴п╦п╨ п╦я┴п╣я┌ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐ п╡ я│п╩п╣п╢я┐я▌я┴п╦я┘ п╪п╣я│я┌п╟я┘ (п©п╬п╢я─п╬п╠п╫п╬я│я┌п╦ я│п╪. п╡ ld.so(8)):

(я┌п╬п╩я▄п╨п╬ п╡ ELF) п∙я│п╩п╦ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ п╡я▀п╥я▀п╡п╟я▌я┴п╣п╧ п©я─п╬пЁя─п╟п╪п╪я▀ я│п╬п╢п╣я─п╤п╦я┌ п╪п╣я┌п╨я┐ DT_RPATH, я┌ п╫п╣ я│п╬п╢п╣я─п╤п╦я┌ п╪п╣я┌п╨п╦ DT_RUNPATH, я┌п╬ п©я─п╬п╦п╥п╡п╬п╢п╦я┌я│я▐ п©п╬п╦я│п╨ п╡ п╨п╟я┌п╟п╩п╬пЁп╟я┘, п╬п©п╦я│п╟п╫п╫я▀я┘ п╡ п╪п╣я┌п╨п╣ DT_RPATH.
п∙я│п╩п╦ п©я─п╦ п╥п╟п©я┐я│п╨п╣ п©я─п╬пЁя─п╟п╪п╪я▀ п╠я▀п╩п╟ п╬п©я─п╣п╢п╣п╩п╣п╫п╟ п©п╣я─п╣п╪п╣п╫п╫п╟я▐ п╬п╨я─я┐п╤п╣п╫п╦я▐ LD_LIBRARY_PATH, я│п╬п╢п╣я─п╤п╟я┴п╟я▐ я│п©п╦я│п╬п╨ п╨п╟я┌п╟п╩п╬пЁп╬п╡ я┤п╣я─п╣п╥ п╢п╡п╬п╣я┌п╬я┤п╦п╣, я┌п╬ п©я─п╬п╦п╥п╡п╬п╢п╦я┌я│я▐ п©п╬п╦я│п╨ п╡ я█я┌п╦я┘ п╨п╟я┌п╟п╩п╬пЁп╟я┘. (п÷п╬ я│п╬п╬п╠я─п╟п╤п╣п╫п╦я▐п╪ п╠п╣п╥п╬п©п╟я│п╫п╬я│я┌п╦ я█я┌п╟ п©п╣я─п╣п╪п╣п╫п╫п╟я▐ п╦пЁп╫п╬я─п╦я─я┐п╣я┌я│я▐ п╢п╩я▐ п©я─п╬пЁя─п╟п╪п╪ я│ я┐я│я┌п╟п╫п╬п╡п╩п╣п╫п╫я▀п╪п╦ п╠п╦я┌п╟п╪п╦ set-user-ID п╦ set-group-ID.)
(я┌п╬п╩я▄п╨п╬ п╡ ELF) п∙я│п╩п╦ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ п╡я▀п╥я▀п╡п╟я▌я┴п╣п╧ п©я─п╬пЁя─п╟п╪п╪я▀ я│п╬п╢п╣я─п╤п╦я┌ п╪п╣я┌п╨я┐ DT_RUNPATH, я┌п╬ п©я─п╬п╦п╥п╡п╬п╢п╦я┌я│я▐ п©п╬п╦я│п╨ п©п╬ п╨п╟я┌п╟п╩п╬пЁп╟п╪, п©п╣я─п╣я┤п╦я│п╩п╣п╫п╫я▀п╪ п╡ я█я┌п╬п╧ п╪п╣я┌п╨п╣.
п÷я─п╬п╦п╥п╡п╬п╢п╦я┌я│я▐ п©я─п╬п╡п╣я─п╨п╟ п╡ п╨я█я┬п╦я─я┐я▌я┴п╣п╪ я└п╟п╧п╩п╣ /etc/ld.so.cache (п╬п╠я│п╩я┐п╤п╦п╡п╟п╣я┌я│я▐ ldconfig(8)) п╫п╟ п©я─п╣п╢п╪п╣я┌ п╫п╟п╩п╦я┤п╦я▐ п╥п╟п©п╦я│п╦ п╢п╩я▐ filename.
п÷я─п╬я│п╪п╟я┌я─п╦п╡п╟я▌я┌я│я▐ п╨п╟я┌п╟п╩п╬пЁп╦ /lib п╦ /usr/lib (п╦п╪п╣п╫п╫п╬ п╡ я┌п╟п╨п╬п╪ п©п╬я─я▐п╢п╨п╣).

п∙я│п╩п╦ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╥п╟п╡п╦я│п╦я┌ п╬я┌ п╢я─я┐пЁп╦я┘ п╬п╠я┴п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨, я┌п╬ п╬п╫п╦ я┌п╟п╨п╤п╣ п╟п╡я┌п╬п╪п╟я┌п╦я┤п╣я│п╨п╦ п╥п╟пЁя─я┐п╤п╟я▌я┌я│я▐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦п╪ п╨п╬п╪п©п╬п╫п╬п╡я┴п╦п╨п╬п╪ я│п╬пЁп╩п╟я│п╫п╬ я█я┌п╦п╪ п╤п╣ п©я─п╟п╡п╦п╩п╟п╪. (п÷я─п╬я├п╣я│я│ п╪п╬п╤п╣я┌ п╡я▀п©п╬п╩п╫я▐я┌я▄я│я▐ я─п╣п╨я┐я─я│п╦п╡п╫п╬, п╣я│п╩п╦ я█я┌п╦ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦, п╡ я│п╡п╬я▌ п╬я┤п╣я─п╣п╢я▄, п╥п╟п╡п╦я│я▐я┌ п╬я┌ п╢я─я┐пЁп╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨, п╦ я┌п╟п╨ п╢п╟п╩п╣п╣.)

п▓ flag п╢п╬п╩п╤п╫п╬ п╠я▀я┌я▄ п╬п╢п╫п╬ п╦п╥ я│п╩п╣п╢я┐я▌я┴п╦я┘ п╥п╫п╟я┤п╣п╫п╦п╧:

п▓я▀п©п╬п╩п╫я▐я┌я▄ п©п╬п╥п╢п╫п╣п╣ я│п╡я▐п╥я▀п╡п╟п╫п╦п╣. п▓я▀п©п╬п╩п╫я▐п╣я┌я│я▐ п©п╬п╦я│п╨ я┌п╬п╩я▄п╨п╬ я┌п╣я┘ я│п╦п╪п╡п╬п╩п╬п╡, п╫п╟ п╨п╬я┌п╬я─я▀п╣ п╣я│я┌я▄ я│я│я▀п╩п╨п╦ п╦п╥ п╨п╬п╢п╟. п∙я│п╩п╦ п╫п╟ я│п╦п╪п╡п╬п╩ п╫п╦п╨п╬пЁп╢п╟ п╫п╣ я│я│я▀п╩п╟я▌я┌я│я▐, я┌п╬ п╬п╫ п╫п╦п╨п╬пЁп╢п╟ п╫п╣ п╠я┐п╢п╣я┌ я─п╟п╥я─п╣я┬я▒п╫. (п÷п╬п╥п╢п╫п╣п╣ я│п╡я▐п╥я▀п╡п╟п╫п╦п╣ (lazy binding) п╡я▀п©п╬п╩п╫я▐п╣я┌я│я▐ я┌п╬п╩я▄п╨п╬ п©я─п╦ я│я│я▀п╩п╨п╣ п╫п╟ я└я┐п╫п╨я├п╦п╦; я│я│я▀п╩п╨п╦ п╫п╟ п©п╣я─п╣п╪п╣п╫п╫я▀п╣ п╡я│п╣пЁп╢п╟ п©я─п╦п╡я▐п╥я▀п╡п╟я▌я┌я│я▐ я│я─п╟п╥я┐ п©я─п╦ п╥п╟пЁя─я┐п╥п╨п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦.)
п∙я│п╩п╦ я┐п╨п╟п╥п╟п╫п╬ п╢п╟п╫п╫п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ п╦п╩п╦ п©п╣я─п╣п╪п╣п╫п╫п╟я▐ п╬п╨я─я┐п╤п╣п╫п╦я▐ LD_BIND_NOW п╫п╣ п©я┐я│я┌п╟, я┌п╬ п╡я│п╣ п╫п╣п╬п©я─п╣п╢п╣п╩я▒п╫п╫я▀п╣ я│п╦п╪п╡п╬п╩я▀ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣ п╦я┴я┐я┌я│я▐ п╢п╬ п╡п╬п╥п╡я─п╟я┌п╟ п╦п╥ dlopen(). п∙я│п╩п╦ я█я┌п╬пЁп╬ я│п╢п╣п╩п╟я┌я▄ п╫п╣ я┐п╢п╟я▒я┌я│я▐, я┌п╬ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ п╬я┬п╦п╠п╨п╟.

п╒п╟п╨п╤п╣ п╡ п▓ flag п╪п╬п╤п╣я┌ п╠я▀я┌я▄ п╫п╬п╩я▄ п╦п╩п╦ п╠п╬п╩п╣п╣ п╥п╫п╟я┤п╣п╫п╦п╣, п╬п╠я┼п╣п╢п╦п╫я▐п╣п╪я▀я┘ п©п╬ п≤п⌡п≤:

п║п╦п╪п╡п╬п╩я▀, п╬п©я─п╣п╢п╣п╩я▒п╫п╫я▀п╣ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣, п╠я┐п╢я┐я┌ п╢п╬я│я┌я┐п©п╫я▀ п©я─п╦ п©п╬п╦я│п╨п╣ я│п╦п╪п╡п╬п╩п╬п╡, п╢п╩я▐ п╥п╟пЁя─я┐п╤п╟п╣п╪я▀я┘ п╢п╟п╩п╣п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨.
п÷я─п╬я┌п╦п╡п╬п©п╬п╩п╬п╤п╫п╬я│я┌я▄ RTLD_GLOBAL, п╦я│п©п╬п╩я▄п╥я┐п╣я┌я│я▐ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌, п╣я│п╩п╦ п╫п╣ п╥п╟п╢п╟п╫п╬ п╫п╦ п╬п╢п╫п╬пЁп╬ я└п╩п╟пЁп╟. п║п╦п╪п╡п╬п╩я▀, п╬п©я─п╣п╢п╣п╩я▒п╫п╫я▀п╣ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣, п╫п╣ п╠я┐п╢я┐я┌ п╢п╬я│я┌я┐п©п╫я▀ п©я─п╦ я─п╟п╥я─п╣я┬п╣п╫п╦п╦ я│я│я▀п╩п╬п╨ п╢п╩я▐ п╥п╟пЁя─я┐п╤п╟п╣п╪я▀я┘ п╢п╟п╩п╣п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨.
п²п╣ п╡я▀пЁя─я┐п╤п╟я┌я▄ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐ п©я─п╦ dlclose(). п▓ я─п╣п╥я┐п╩я▄я┌п╟я┌п╣ я│я┌п╟я┌п╦я┤п╣я│п╨п╦п╣ п©п╣я─п╣п╪п╣п╫п╫я▀п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦ п╫п╣ п╦п╫п╦я├п╦п╟п╩п╦п╥п╦я─я┐я▌я┌я│я▐ п©п╬п╡я┌п╬я─п╫п╬, п╣я│п╩п╦ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╥п╟пЁя─я┐п╤п╟п╣я┌я│я▐ я│п╫п╬п╡п╟ п©п╬ dlopen(). п╜я┌п╬пЁп╬ я└п╩п╟пЁп╟ п╫п╣я┌ п╡ POSIX.1-2001.
п²п╣ п╥п╟пЁя─я┐п╤п╟я┌я▄ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐. п╜я┌п╬ п╪п╬п╤п╫п╬ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ п╢п╩я▐ я┌п╣я│я┌п╦я─п╬п╡п╟п╫п╦я▐, п╥п╟пЁя─я┐п╤п╣п╫п╟ п╩п╦ я┐п╤п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ (dlopen() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ NULL, п╣я│п╩п╦ п╫п╣я┌, п╦п╩п╦ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐, п╣я│п╩п╦ п╬п╫п╟ п╥п╟пЁя─я┐п╤п╣п╫п╟). п╜я┌п╬я┌ я└п╩п╟пЁ п╪п╬п╤п╫п╬ я┌п╟п╨п╤п╣ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ п╢п╩я▐ п╦п╥п╪п╣п╫п╣п╫п╦я▐ я└п╩п╟пЁп╬п╡ я┐п╤п╣ п╥п╟пЁя─я┐п╤п╣п╫п╫п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣. п²п╟п©я─п╦п╪п╣я─, п╣я│п╩п╦ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╠я▀п╩п╟ п╥п╟пЁя─я┐п╤п╣п╫п╟ я│ я└п╩п╟пЁп╬п╪ RTLD_LOCAL, я┌п╬ п╣я▒ п╪п╬п╤п╫п╬ п©п╬п╡я┌п╬я─п╫п╬ п╬я┌п╨я─я▀я┌я▄ я│ RTLD_NOLOAD | RTLD_GLOBAL. п╜я┌п╬пЁп╬ я└п╩п╟пЁп╟ п╫п╣я┌ п╡ POSIX.1-2001.
п≈п╟п╢п╟я┌я▄ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐, п╡ п╨п╬я┌п╬я─п╬п╧ п©п╬п╦я│п╨ я│п╦п╪п╡п╬п╩п╬п╡ п╠я┐п╢п╣я┌ п╬я│я┐я┴п╣я│я┌п╡п╩я▐я┌я▄я│я▐ п©п╣я─п╣п╢ п©п╬п╦я│п╨п╬п╪ п╡ п╬п╠п╩п╟я│я┌п╦ пЁп╩п╬п╠п╟п╩я▄п╫я▀я┘ я│п╦п╪п╡п╬п╩п╬п╡. п╜я┌п╬ п╬п╥п╫п╟я┤п╟п╣я┌, я┤я┌п╬ я│п╟п╪п╬п╢п╬я│я┌п╟я┌п╬я┤п╫п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╠я┐п╢п╣я┌ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄ я│п╡п╬п╦ я│п╬п╠я│я┌п╡п╣п╫п╫я▀п╣ я│п╦п╪п╡п╬п╩я▀ п╡п╪п╣я│я┌п╬ пЁп╩п╬п╠п╟п╩я▄п╫я▀я┘ я│п╦п╪п╡п╬п╩п╬п╡ я│ я┌п╣п╪ п╤п╣ п╦п╪п╣п╫п╣п╪, я│п╬п╢п╣я─п╤п╟я┴п╦я┘я│я▐ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘, п╨п╬я┌п╬я─я▀п╣ я┐п╤п╣ п╠я▀п╩п╦ п╥п╟пЁя─я┐п╤п╣п╫я▀. п╜я┌п╬пЁп╬ я└п╩п╟пЁп╟ п╫п╣я┌ п╡ POSIX.1-2001.

п∙я│п╩п╦ п╡п╪п╣я│я┌п╬ filename я┐п╨п╟п╥п╟п╫ NULL, я┌п╬ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ пЁп╩п╟п╡п╫я┐я▌ п©я─п╬пЁя─п╟п╪п╪я┐. п÷я─п╦ п©п╣я─п╣п╢п╟я┤п╣ п╡ dlsym(), я█я┌п╬я┌ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╡я▀п╥я▀п╡п╟п╣я┌ п©п╬п╦я│п╨ я│п╦п╪п╡п╬п╩п╟ п╡ пЁп╩п╟п╡п╫п╬п╧ п©я─п╬пЁя─п╟п╪п╪п╣, п╥п╟я┌п╣п╪ п╡п╬ п╡я│п╣ п╬п╠я┴п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘, п╥п╟пЁя─я┐п╤п╣п╫п╫я▀я┘ п©я─п╦ п╥п╟п©я┐я│п╨п╣ п©я─п╬пЁя─п╟п╪п╪я▀, п╦ п╥п╟я┌п╣п╪ п╡п╬ п╡я│п╣я┘ п╬п╠я┴п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘, п╥п╟пЁя─я┐п╤п╣п╫п╫я▀я┘ dlopen() я│ я└п╩п╟пЁп╬п╪ RTLD_GLOBAL.

п▓п╫п╣я┬п╫п╦п╣ я│я│я▀п╩п╨п╦ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣ я─п╟п╥я─п╣я┬п╟я▌я┌я│я▐ я│ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣п╪ п╠п╦п╠п╩п╦п╬я┌п╣п╨ п©п╬ п╦я┘ я│п©п╦я│п╨я┐ п╠п╦п╠п╩п╦п╬я┌п╣я┤п╫я▀я┘ п╥п╟п╡п╦я│п╦п╪п╬я│я┌п╣п╧ п╦ п╢я─я┐пЁп╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘, я─п╟п╫п╣п╣ п╬я┌п╨я─я▀я┌я▀я┘ я│ я└п╩п╟пЁп╬п╪ RTLD_GLOBAL. п∙я│п╩п╦ п╦я│п©п╬п╩п╫я▐п╣п╪я▀п╧ я└п╟п╧п╩ я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫ я│ п©п╟я─п╟п╪п╣я┌я─п╬п╪ "-rdynamic" (п╦п╩п╦ я┌п╬п╤п╢п╣я│я┌п╡п╣п╫п╫я▀п╪ п╣п╪я┐ "--export-dynamic"), я┌п╬ пЁп╩п╬п╠п╟п╩я▄п╫я▀п╣ я│п╦п╪п╡п╬п╩я▀ п╡ п╦я│п©п╬п╩п╫я▐п╣п╪п╬п╪ я└п╟п╧п╩п╣ п╠я┐п╢я┐я┌ я┌п╟п╨п╤п╣ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄я│я▐ п©я─п╦ я─п╟п╥я─п╣я┬п╣п╫п╦п╦ п╥п╟п╡п╦я│п╦п╪п╬я│я┌п╣п╧ п╡ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦ п╥п╟пЁя─я┐п╤п╟п╣п╪п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣.

п∙я│п╩п╦ п╢п╟п╫п╫п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╥п╟пЁя─я┐п╤п╟п╣я┌я│я▐ я│ п©п╬п╪п╬я┴я▄я▌ dlopen() я│п╫п╬п╡п╟, я┌п╬ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ я┌п╬я┌ п╤п╣ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ я└п╟п╧п╩. п▒п╦п╠п╩п╦п╬я┌п╣п╨п╟ dl п╡п╣п╢я▒я┌ я│я┤я▒я┌я┤п╦п╨ я│я│я▀п╩п╬п╨ п╢п╩я▐ п╠п╦п╠п╩п╦п╬я┌п╣я┤п╫я▀я┘ я┐п╨п╟п╥п╟я┌п╣п╩п╣п╧, п©п╬я█я┌п╬п╪я┐ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╫п╣ п╡я▀я│п╡п╬п╠п╬п╤п╢п╟п╣я┌я│я▐ dlclose() п╢п╬ я┌п╣я┘ п©п╬я─, п©п╬п╨п╟ п╬п╫ п╫п╣ п╠я┐п╢п╣я┌ п╡я▀п╥п╡п╟п╫п╟ я│я┌п╬п╩я▄п╨п╬ п╤п╣ я─п╟п╥ я│п╨п╬п╩я▄п╨п╬ п╦ dlopen(). п÷я─п╬я├п╣п╢я┐я─п╟ _init(), п╣я│п╩п╦ п╣я│я┌я▄, п╡я▀п╥я▀п╡п╟п╣я┌я│я▐ я┌п╬п╩я▄п╨п╬ п╬п╢п╫п╟п╤п╢я▀. п²п╬ п©п╬я│п╩п╣п╢я┐я▌я┴п╦п╧ п╡я▀п╥п╬п╡ я│ я└п╩п╟пЁп╬п╪ RTLD_NOW п╪п╬п╤п╣я┌ п©я─п╦п╡п╣я│я┌п╦ п╨ п©п╬п╦я│п╨я┐ я│п╦п╪п╡п╬п╩п╬п╡ п╢п╩я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦ я─п╟п╫п╣п╣ п╥п╟пЁя─я┐п╤п╣п╫п╫п╬п╧ я│ я└п╩п╟пЁп╬п╪ RTLD_LAZY.

п∙я│п╩п╦ п©п╬ п╨п╟п╨п╬п╧-я┌п╬ п©я─п╦я┤п╦п╫п╣ dlopen() п╥п╟п╡п╣я─я┬п╟п╣я┌я│я▐ п╫п╣я┐п╢п╟я┤п╫п╬, я┌п╬ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ NULL.

dlsym()

п╓я┐п╫п╨я├п╦я▐ dlsym() п©я─п╦п╫п╦п╪п╟п╣я┌ "я┐п╨п╟п╥п╟я┌п╣п╩я▄" п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦, п╡п╬п╥п╡я─п╟я┴п╟п╣п╪п╬п╧ dlopen(), п╦ null-п╥п╟п╡п╣я─я┬я▒п╫п╫п╬п╣ п╦п╪я▐ я│п╦п╪п╡п╬п╩п╟, п╦ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ п╟п╢я─п╣я│, п©п╬ п╨п╬я┌п╬я─п╬п╪я┐ я█я┌п╬я┌ я│п╦п╪п╡п╬п╩ п╥п╟пЁя─я┐п╤п╣п╫ п╡ п©п╟п╪я▐я┌я▄. п∙я│п╩п╦ я│п╦п╪п╡п╬п╩ п╫п╣ п╫п╟п╧п╢п╣п╫, п╡ я┐п╨п╟п╥п╟п╫п╫п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╣ п╦п╩п╦ п╡п╬ п╡я│п╣я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘, п╨п╬я┌п╬я─я▀п╣ п╠я▀п╩п╦ п╟п╡я┌п╬п╪п╟я┌п╦я┤п╣я│п╨п╦ п╥п╟пЁя─я┐п╤п╣п╫я▀ dlopen() п©я─п╦ п╥п╟пЁя─я┐п╥п╨п╣ я█я┌п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦, dlsym() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ NULL. (п÷п╬п╦я│п╨, п╡я▀п©п╬п╩п╫я▐п╣п╪я▀п╧ dlsym(), п╬я┘п╡п╟я┌я▀п╡п╟п╣я┌ п╡я│я▒ п╢п╣я─п╣п╡п╬ п╥п╟п╡п╦я│п╦п╪п╬я│я┌п╣п╧ я█я┌п╦я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨.) п╒п╟п╨ п╨п╟п╨ п╥п╫п╟я┤п╣п╫п╦п╣п╪ я│п╦п╪п╡п╬п╩п╟ п╪п╬п╤п╣я┌ п╠я▀я┌я▄ п╫п╟ я│п╟п╪п╬п╪ п╢п╣п╩п╣ NULL (п╡п╬п╥п╡я─п╟я┴п╟п╣п╪я▀п╧ NULL п╦п╥ dlsym() п╫п╣ п╫я┐п╤п╫п╬ я│я┤п╦я┌п╟я┌я▄ п╬я┬п╦п╠п╨п╬п╧), п©я─п╟п╡п╦п╩я▄п╫я▀п╪ я│п©п╬я│п╬п╠п╬п╪ п©я─п╬п╡п╣я─п╨п╦ п╫п╟ п╬я┬п╦п╠п╨п╦ — я█я┌п╬ п╡я▀п╥п╡п╟я┌я▄ dlerror() п╢п╩я▐ п╬я┤п╦я│я┌п╨п╦ п╡я│п╣я┘ я│я┌п╟я─я▀я┘ я┐я│п╩п╬п╡п╦п╧ п╬я┬п╦п╠п╬п╨, п╥п╟я┌п╣п╪ п╡я▀п╥п╡п╟я┌я▄ dlsym(), п╟ п╥п╟я┌п╣п╪ п╡я▀п╥п╡п╟я┌я▄ dlerror() п╣я┴я▒ я─п╟п╥, я│п╬я┘я─п╟п╫п╦п╡ п╡п╬п╥п╡я─п╟я┴п╟п╣п╪п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ п╡ п©п╣я─п╣п╪п╣п╫п╫п╬п╧, п╦ п©я─п╬п╡п╣я─п╦я┌я▄, п╫п╣ я─п╟п╡п╫п╬ п╩п╦ я│п╬я┘я─п╟п╫я▒п╫п╫п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ NULL.

п║я┐я┴п╣я│я┌п╡я┐п╣я┌ п╢п╡п╟ п©я│п╣п╡п╢п╬-я┐п╨п╟п╥п╟я┌п╣п╩я▐, RTLD_DEFAULT п╦ RTLD_NEXT. п÷п╬ п©п╣я─п╡п╬п╪я┐ п╪п╬п╤п╫п╬ п╬п©я─п╣п╢п╣п╩п╦я┌я▄ п©п╣я─п╡п╬п╣ п©п╬я▐п╡п╩п╣п╫п╦п╣ п╤п╣п╩п╟п╣п╪п╬пЁп╬ я│п╦п╪п╡п╬п╩п╟ п©я─п╦ п©п╬п╦я│п╨п╣ п╡ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟я┘ п╡ п©п╬я─я▐п╢п╨п╣ п©п╬ я┐п╪п╬п╩я┤п╟п╫п╦я▌. п÷п╬ п©п╬я│п╩п╣п╢п╫п╣п╪я┐ п╠я┐п╢п╣я┌ п╫п╟п╧п╢п╣п╫п╬ я│п╩п╣п╢я┐я▌я┴п╣п╣ п©п╬я▐п╡п╩п╣п╫п╦п╣ я└я┐п╫п╨я├п╦п╦ п©я─п╦ п©п╬п╦я│п╨п╣ п╡п╫п╣ я┌п╣п╨я┐я┴п╣п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦. п╜я┌п╬ п©п╬п╥п╡п╬п╩я▐п╣я┌ я│п╬п╥п╢п╟я┌я▄ п╬п╠я▒я─я┌п╨я┐ п╡п╬п╨я─я┐пЁ я└я┐п╫п╨я├п╦п╦ п╢я─я┐пЁп╬п╧ п╬п╠я┴п╣п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦.

dlclose()

п╓я┐п╫п╨я├п╦я▐ dlclose() я┐п╪п╣п╫я▄я┬п╟п╣я┌ я│я┤я▒я┌я┤п╦п╨ я│я│я▀п╩п╬п╨ п╫п╟ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦ handle. п∙я│п╩п╦ я│я┤я▒я┌я┤п╦п╨ я│я│я▀п╩п╬п╨ п╢п╬я│я┌п╦пЁп╟п╣я┌ п╫я┐п╩я▐ п╦ п╫п╣я┌ п╢я─я┐пЁп╦я┘ п╥п╟пЁя─я┐п╤п╣п╫п╫я▀я┘ п╠п╦п╠п╩п╦п╬я┌п╣п╨ п╦я│п©п╬п╩я▄п╥я┐я▌я┴п╦я┘ п╣я▒ я│п╦п╪п╡п╬п╩я▀, я┌п╬ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╡я▀пЁя─я┐п╤п╟п╣я┌я│я▐.

п╓я┐п╫п╨я├п╦я▐ dlclose() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ 0 п╡ я│п╩я┐я┤п╟п╣ я┐я│п©п╣я┬п╫п╬п╧ я─п╟п╠п╬я┌я▀, п╦ п╫п╣ п╫п╬п╩я▄ п©я─п╦ п╬я┬п╦п╠п╨п╣.

пёя│я┌п╟я─п╣п╡я┬п╦п╣ я│п╦п╪п╡п╬п╩я▀ _init() п╦ _fini()

п п╬п╪п©п╬п╫п╬п╡я┴п╦п╨ я┐я┤п╦я┌я▀п╡п╟п╣я┌ я│п©п╣я├п╦п╟п╩я▄п╫я▀п╣ я│п╦п╪п╡п╬п╩я▀ _init п╦ _fini. п∙я│п╩п╦ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ я█п╨я│п©п╬я─я┌п╦я─я┐п╣я┌ п©я─п╬я├п╣п╢я┐я─я┐ я│ п╦п╪п╣п╫п╣п╪ _init(), я┌п╬ п╣я▒ п╨п╬п╢ п╦я│п©п╬п╩п╫я▐п╣я┌я│я▐ п©п╬я│п╩п╣ п╥п╟пЁя─я┐п╥п╨п╦, п╢п╬ п╡п╬п╥п╡я─п╟я┌п╟ п╦п╥ dlopen(). п∙я│п╩п╦ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╟я▐ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ я█п╨я│п©п╬я─я┌п╦я─я┐п╣я┌ п©я─п╬я├п╣п╢я┐я─я┐ я│ п╦п╪п╣п╫п╣п╪ _fini(), я┌п╬ п╣я▒ п╨п╬п╢ п╡я▀п╥я▀п╡п╟п╣я┌я│я▐ п©п╣я─п╣п╢ я┌п╣п╪ п╨п╟п╨ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╟ п╠я┐п╢п╣я┌ п╡я▀пЁя─я┐п╤п╣п╫п╟. п∙я│п╩п╦ п╡п╟п╪ п╫я┐п╤п╫п╬ п╦п╥п╠п╣п╤п╟я┌я▄ п╨п╬п╪п©п╬п╫п╬п╡п╨п╦ я│ я│п╦я│я┌п╣п╪п╫я▀п╪п╦ я└п╟п╧п╩п╟п╪п╦ п╥п╟п©я┐я│п╨п╟, я┌п╬ п╪п╬п╤п╫п╬ п╡п╬я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄я│я▐ п©п╟я─п╟п╪п╣я┌я─п╬п╪ п╨п╬п╪п╟п╫п╢п╫п╬п╧ я│я┌я─п╬п╨п╦ gcc(1) -nostartfiles.

п≤я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣ п╢п╟п╫п╫я▀я┘ п©я─п╬я├п╣п╢я┐я─ п╦п╩п╦ п©п╟я─п╟п╪п╣я┌я─п╬п╡ gcc -nostartfiles п╦п╩п╦ -nostdlib п╫п╣ я─п╣п╨п╬п╪п╣п╫п╢я┐п╣я┌я│я▐. п≤я┘ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣ п╪п╬п╤п╣я┌ п©я─п╦п╡п╣я│я┌п╦ п╨ п╫п╣п╤п╣п╩п╟п╣п╪п╬п╪я┐ п©п╬п╡п╣п╢п╣п╫п╦я▌, я┌п╟п╨ п╨п╟п╨ п╫п╣ п╠я┐п╢я┐я┌ п╡я▀п©п╬п╩п╫п╣п╫я▀ п©я─п╬я├п╣п╢я┐я─я▀ п╨п╬п╫я│я┌я─я┐п╨я┌п╬я─п╟/п╢п╣я│я┌я─я┐п╨я┌п╬я─п╟ (п╣я│п╩п╦ п╫п╣ п╠я┐п╢я┐я┌ п©я─п╦п╫я▐я┌я▀ я│п©п╣я├п╦п╟п╩я▄п╫я▀п╣ п╪п╣я─я▀).

п▓п╪п╣я│я┌п╬ я█я┌п╬пЁп╬ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦ п╢п╬п╩п╤п╫я▀ я█п╨я│п©п╬я─я┌п╦я─п╬п╡п╟я┌я▄ п©я─п╬я├п╣п╢я┐я─я▀ я│ п©п╬п╪п╬я┴я▄я▌ п╟я┌я─п╦п╠я┐я┌п╬п╡ я└я┐п╫п╨я├п╦п╧ __attribute__((constructor)) п╦ __attribute__((destructor)). п÷п╬п╢я─п╬п╠п╫п╣п╧ я│п╪. я│я┌я─п╟п╫п╦я├я▀ info п©п╬ gcc. п÷я─п╬я├п╣п╢я┐я─я▀ п╨п╬п╫я│я┌я─я┐п╨я┌п╬я─п╟ п╡я▀п©п╬п╩п╫я▐я▌я┌я│я▐ п╢п╬ п╡п╬п╥п╡я─п╟я┌п╟ п╦п╥ dlopen(), п╟ п©я─п╬я├п╣п╢я┐я─я▀ п╢п╣я│я┌я─я┐п╨я┌п╬я─п╟ п╡я▀п©п╬п╩п╫я▐я▌я┌я│я▐ п©п╣я─п╣п╢ п╡п╬п╥п╡я─п╟я┌п╬п╪ п╦п╥ dlclose().

п═п╟я│я┬п╦я─п╣п╫п╦я▐ glibc: dladdr() п╦ dlvsym()

п▓ glibc п╢п╬п╠п╟п╡п╩п╣п╫я▀ п╢п╡п╣ я└я┐п╫п╨я├п╦п╦, п╫п╣ п╬п©п╦я│п╟п╫п╫я▀п╣ п╡ POSIX, я│ п©я─п╬я┌п╬я┌п╦п©п╟п╪п╦

#define _GNU_SOURCE
#include <dlfcn.h>

int dladdr(void *addr, Dl_info *info);

void *dlvsym(void *handle, char *symbol, char *version);

п╓я┐п╫п╨я├п╦я▐ dladdr() п╡я▀п╥я▀п╡п╟п╣я┌я│я▐ я│ я┐п╨п╟п╥п╟я┌п╣п╩п╣п╪ п╫п╟ я└я┐п╫п╨я├п╦я▌ п╦ п©я▀я┌п╟п╣я┌я│я▐ п╫п╟п╧я┌п╦ п╦п╪я▐ п╦ я└п╟п╧п╩, пЁп╢п╣ п╬п╫п╟ я─п╟я│п©п╬п╩п╬п╤п╣п╫п╟. п≤п╫я└п╬я─п╪п╟я├п╦я▐ я│п╬я┘я─п╟п╫я▐п╣я┌я│я▐ п╡ я│я┌я─я┐п╨я┌я┐я─п╣ Dl_info:


typedef struct {

const char *dli_fname; /* п÷я┐я┌я▄ п╨ п╬п╠я┴п╣п╪я┐ п╬п╠я┼п╣п╨я┌я┐ я│
п╟п╢я─п╣я│п╬п╪ */
void *dli_fbase; /* п░п╢я─п╣я│, п©п╬ п╨п╬я┌п╬я─п╬п╪я┐ п╥п╟пЁя─я┐п╤п╣п╫ п╬п╠я┴п╦п╧
п╬п╠я┼п╣п╨я┌ */
const char *dli_sname; /* п≤п╪я▐ п╠п╩п╦п╤п╟п╧я┬п╣пЁп╬ я│п╦п╪п╡п╬п╩п╟ я│ п╟п╢я─п╣я│п╬п╪
п╪п╣п╫я▄я┬п╣ я┤п╣п╪ addr */
void *dli_saddr; /* п╒п╬я┤п╫я▀п╧ п╟п╢я─п╣я│ я│п╦п╪п╡п╬п╩п╟ я│
п╦п╪п╣п╫п╣п╪ п╡ dli_sname */ } Dl_info;

п∙я│п╩п╦ я│п╦п╪п╡п╬п╩, я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╦п╧ п╟п╢я─п╣я│я┐ addr, п╫п╣ п╫п╟п╧п╢п╣п╫, я┌п╬ dli_sname п╦ dli_saddr я┐я│я┌п╟п╫п╟п╡п╩п╦п╡п╟я▌я┌я│я▐ п╡ NULL.

п▓ я│п╩я┐я┤п╟п╣ п╬я┬п╦п╠п╨п╦ dladdr() п╡п╬п╥п╡я─п╟я┴п╟п╣я┌ 0, п╦ п╫п╣п╫я┐п╩п╣п╡п╬п╣ п╥п╫п╟я┤п╣п╫п╦п╣ п╡ я│п╩я┐я┤п╟п╣ я┐я│п©п╣я┘п╟.

п╓я┐п╫п╨я├п╦я▐ dlvsym(), п©я─п╣п╢п╬я│я┌п╟п╡п╩я▐п╣п╪п╟я▐ glibc п╫п╟я┤п╦п╫п╟я▐ я│ п╡п╣я─я│п╦п╦ 2.1, я─п╟п╠п╬я┌п╟п╣я┌ я┌п╟п╨п╤п╣ п╨п╟п╨ п╦ dlsym(), п╫п╬ п╬п╤п╦п╢п╟п╣я┌ я│я┌я─п╬п╨я┐ я│ п╡п╣я─я│п╦п╣п╧ п╡ п╨п╟я┤п╣я│я┌п╡п╣ п╢п╬п©п╬п╩п╫п╦я┌п╣п╩я▄п╫п╬пЁп╬ п╟я─пЁя┐п╪п╣п╫я┌п╟.

п║п·п·п╒п▓п∙п╒п║п╒п▓п≤п∙ п║п╒п░п²п■п░п═п╒п░п°

п▓ POSIX.1-2001 п╬п©п╦я│п╟п╫я▀ dlclose(), dlerror(), dlopen() п╦ dlsym().

п≈п░п°п∙п╖п░п²п≤п╞

п║п╦п╪п╡п╬п╩я▀ RTLD_DEFAULT п╦ RTLD_NEXT п╬п©я─п╣п╢п╣п╩п╣п╫я▀ п╡ <dlfcn.h> я┌п╬п╩я▄п╨п╬ п╨п╬пЁп╢п╟ п╬п©я─п╣п╢п╣п╩я▒п╫ я│п╦п╪п╡п╬п╩ _GNU_SOURCE п╢п╬ п╡п╨п╩я▌я┤п╣п╫п╦я▐.

п²п╟я┤п╦п╫п╟я▐ я│ glibc 2.2.3, atexit(3) п╪п╬п╤п╣я┌ п╦я│п©п╬п╩я▄п╥п╬п╡п╟я┌я▄я│я▐ п╢п╩я▐ я─п╣пЁп╦я│я┌я─п╟я├п╦п╦ п╬п╠я─п╟п╠п╬я┌я┤п╦п╨п╟ п╥п╟п╡п╣я─я┬п╣п╫п╦я▐ я─п╟п╠п╬я┌я▀, п╨п╬я┌п╬я─я▀п╧ п╟п╡я┌п╬п╪п╟я┌п╦я┤п╣я│п╨п╦ п╡я▀п╥я▀п╡п╟п╣я┌я│я▐ п©я─п╦ п╡я▀пЁя─я┐п╥п╨п╣ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦.

п≤я│я┌п╬я─п╦я▐

п║я┌п╟п╫п╢п╟я─я┌ п╦п╫я┌п╣я─я└п╣п╧я│п╟ dlopen п╡п©п╣я─п╡я▀п╣ п©п╬я▐п╡п╦п╩я│я▐ п╡ SunOS. п▓ я█я┌п╬п╧ я│п╦я│я┌п╣п╪п╣ я┌п╟п╨п╤п╣ п╠я▀п╩п╟ я└я┐п╫п╨я├п╦я▐ dladdr(), п╫п╬ п╫п╣ п╠я▀п╩п╬ dlvsym().

п·п╗п≤п▒п п≤

п≤п╫п╬пЁп╢п╟ я┐п╨п╟п╥п╟я┌п╣п╩п╦ п╫п╟ я└я┐п╫п╨я├п╦п╦, п©п╣я─п╣п╢п╟п╡п╟п╣п╪я▀п╣ п╡ dladdr(), п╪п╬пЁя┐я┌ п╡п╟я│ я┐п╢п╦п╡п╦я┌я▄. п²п╟ п╫п╣п╨п╬я┌п╬я─я▀я┘ п╟я─я┘п╦я┌п╣п╨я┌я┐я─п╟я┘ (п╡ я┤п╟я│я┌п╫п╬я│я┌п╦, i386 п╦ x86_64), dli_fname п╦ dli_fbase п╪п╬пЁя┐я┌ я┐п╨п╟п╥я▀п╡п╟я┌я▄ п╫п╟ п╬п╠я┼п╣п╨я┌, п╦п╥ п╨п╬я┌п╬я─п╬пЁп╬ п╡я▀п╥я▀п╡п╟п╩п╟я│я▄ я└я┐п╫п╨я├п╦я▐ dladdr(), п╢п╟п╤п╣ п╣я│п╩п╦ я└я┐п╫п╨я├п╦я▐, п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╡я┬п╟я▐я│я▐ п╨п╟п╨ п╟я─пЁя┐п╪п╣п╫я┌, п╢п╬п╩п╤п╫п╟ п╠я▀я┌я▄ п╦п╥ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╦ я│п╨п╬п╪п©п╬п╫п╬п╡п╟п╫п╫п╬п╧ п╠п╦п╠п╩п╦п╬я┌п╣п╨п╦.

п÷я─п╬п╠п╩п╣п╪п╟ п╡ я┌п╬п╪, я┤я┌п╬ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╫п╟ я└я┐п╫п╨я├п╦я▌ п©п╬ п©я─п╣п╤п╫п╣п╪я┐ п╦я┴п╣я┌я│я▐ п╡п╬ п╡я─п╣п╪я▐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦, п╫п╬ п╡я│п╣пЁп╬ п╩п╦я┬я▄ я┐п╨п╟п╥я▀п╡п╟п╣я┌ п╫п╟ я─п╟п╥п╢п╣п╩ plt (я┌п╟п╠п╩п╦я├я┐ п╨п╬п╪п©п╬п╫п╬п╡п╨п╦ п©я─п╬я├п╣п╢я┐я─) п©п╣я─п╡п╬п╫п╟я┤п╟п╩я▄п╫п╬пЁп╬ п╬п╠я┼п╣п╨я┌п╟ (п╨п╬я┌п╬я─п╟я▐ я─п╟п╥п╪п╣я┴п╟п╣я┌ п╡я▀п╥п╬п╡ п©п╬я│п╩п╣ п╥п╟п©я─п╬я│п╟ п╢п╦п╫п╟п╪п╦я┤п╣я│п╨п╬пЁп╬ п╨п╬п╪п©п╬п╫п╬п╡я┴п╦п╨п╟ п╫п╟ п©п╬п╦я│п╨ я│п╦п╪п╡п╬п╩п╟). п╖я┌п╬п╠я▀ п╬п╠п╬п╧я┌п╦ я█я┌п╬, п╡я▀ п╪п╬п╤п╣я┌п╣ п©п╬п©я─п╬п╠п╬п╡п╟я┌я▄ я│п╨п╬п╪п©п╦п╩п╦я─п╬п╡п╟я┌я▄ п╫п╣п╥п╟п╡п╦я│п╦п╪я▀п╧ п╬я┌ я─п╟п╥п╪п╣я┴п╣п╫п╦я▐ п╨п╬п╢: п╡ я█я┌п╬п╪ я│п╩я┐я┤п╟п╣ п╨п╬п╪п©п╦п╩я▐я┌п╬я─ п╠п╬п╩я▄я┬п╣ п╫п╣ я│п╪п╬п╤п╣я┌ п©п╬п╢пЁп╬я┌п╬п╡п╦я┌я▄ я┐п╨п╟п╥п╟я┌п╣п╩я▄ п╡п╬ п╡я─п╣п╪я▐ п╨п╬п╪п©п╦п╩я▐я├п╦п╦ п╦ gcc(1) я│п╬п╥п╢п╟я│я┌ п╨п╬п╢, п╨п╬я┌п╬я─я▀п╧ п©я─п╬я│я┌п╬ п╥п╟пЁя─я┐п╥п╦я┌ п╨п╬п╫п╣я┤п╫я▀п╧ п╟п╢я─п╣я│ я│п╦п╪п╡п╬п╩п╟ п╦п╥ got (пЁп╩п╬п╠п╟п╩я▄п╫п╬п╧ я┌п╟п╠п╩п╦я├я▀ я│п╪п╣я┴п╣п╫п╦п╧) п©я─п╦ п╥п╟п©я┐я│п╨п╣ п╢п╬ п©п╣я─п╣п╢п╟я┤п╦ п╣пЁп╬ п╡ dladdr().

п÷п═п≤п°п∙п═

п≈п╟пЁя─я┐п╤п╟п╣я┌ п╪п╟я┌п╣п╪п╟я┌п╦я┤п╣я│п╨я┐я▌ п╠п╦п╠п╩п╦п╬я┌п╣п╨я┐ п╦ п©п╣я┤п╟я┌п╟п╣я┌ п╨п╬я│п╦п╫я┐я│ 2.0:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int
main(int argc, char **argv)
{

void *handle;
double (*cosine)(double);
char *error;
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror(); /* п·я┤п╦я│я┌п╨п╟ п╡я│п╣я┘ я─п╣п╥я┐п╩я▄я┌п╟я┌п╬п╡ п╬я┬п╦п╠п╬п╨ */
/* п▓я▀п╡п╬п╢: cosine = (double (*)(double)) dlsym(handle, "cos");
п╨п╟п╤п╣я┌я│я▐ п╠п╬п╩п╣п╣ п╣я│я┌п╣я│я┌п╡п╣п╫п╫я▀п╪, п╫п╬ я│я┌п╟п╫п╢п╟я─я┌ C99 п╬я│я┌п╟п╡п╩я▐п╣я┌
п©я─п╣п╬п╠я─п╟п╥п╬п╡п╟п╫п╦п╣ п╦п╥ "void *" п╨ я┐п╨п╟п╥п╟я┌п╣п╩я▌ п╫п╟ я└я┐п╫п╨я├п╦я▌ п╫п╣п╬п©я─п╣п╢п╣п╩я▒п╫п╫я▀п╪.
п²п╟п╥п╫п╟я┤п╣п╫п╦п╣, п╦я│п©п╬п╩я▄п╥я┐п╣п╪п╬п╣ п╫п╦п╤п╣, я█я┌п╬ п╡я─п╣п╪п╣п╫п╫п╬п╣ я─п╣я┬п╣п╫п╦п╣
POSIX.1-2003 (Technical Corrigendum 1); я│п╪. п╬п╠п╬я│п╫п╬п╡п╟п╫п╦п╣ п╢п╩я▐
dlsym() п╡ я│п©п╣я├п╦я└п╦п╨п╟я├п╦п╦ POSIX. */
*(void **) (&cosine) = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("%f\n", (*cosine)(2.0));
dlclose(handle);
exit(EXIT_SUCCESS); }

п∙я│п╩п╦ я█я┌п╟ п©я─п╬пЁя─п╟п╪п╪п╟ п╥п╟п©п╦я│п╟п╫п╟ п╡ я└п╟п╧п╩ я│ п╦п╪п╣п╫п╣п╪ "foo.c", я┌п╬ п╢п╩я▐ я│п╠п╬я─п╨п╦ п©я─п╬пЁя─п╟п╪п╪я▀ п╡п╡п╣п╢п╦я┌п╣ п╨п╬п╪п╟п╫п╢я┐:


gcc -rdynamic -o foo foo.c -ldl

п▒п╦п╠п╩п╦п╬я┌п╣п╨п╦, я█п╨я│п©п╬я─я┌п╦я─я┐я▌я┴п╦п╣ _init() п╦ _fini(), п╫я┐п╤п╫п╬ п╨п╬п╪п©п╦п╩п╦я─п╬п╡п╟я┌я▄ я┌п╟п╨ (п╫п╟ п©я─п╦п╪п╣я─п╣ bar.c):


gcc -shared -nostartfiles -o bar bar.c

п║п°п·п╒п═п≤п╒п∙ п╒п░п п√п∙

ld(1), ldd(1), dl_iterate_phdr(3), feature_test_macros(7), rtld-audit(7), ld.so(8), ldconfig(8), info-я│я┌я─п╟п╫п╦я├я▀ ld.so, gcc п╦ ld

2008-12-06 Linux