日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 无法加载动态库,51CTO博客-专业IT技术博客创作平台-技术成就梦想

發布時間:2023/12/14 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 无法加载动态库,51CTO博客-专业IT技术博客创作平台-技术成就梦想 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

比較懶,而且時間也不早了,就貼上英文,以后有機會在翻譯吧。

DLOPEN(3)???? Linux Programmer's Manual??DLOPEN(3)

NAME

dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym - program-

ming interface to dynamic linking loader

SYNOPSIS

#include

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

char *dlerror(void);

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

int dlclose(void *handle);

DESCRIPTION

The four functions dlopen(), dlsym(), dlclose(), dlerror()

implement the interface to the dynamic linking loader.

dlerror

The? function? dlerror()? returns? a human readable string

describing the most recent error that occurred from any of

the? dl routines (dlopen, dlsym or dlclose) since the last

call to dlerror().? It returns? NULL? if? no? errors? have

occurred since initialization or since it was last called.

dlopen

The function dlopen() loads the dynamic library file named

by? the?null-terminated? string? filename? and returns an

opaque "handle" for the dynamic library.? If? filename? is

NULL,? then? the? returned handle is for the main program.

If filename contains a slash ("/"), then it is interpreted

as? a? (relative? or? absolute)?pathname.? Otherwise, the

dynamic linker searches for the library?as? follows? (see

ld.so(8) for further details):

o????? (ELF? only)? If the executable file for the calling

program contains a DT_RPATH tag, and does not? con-

tain? a DT_RUNPATH tag, then the directories listed

in the DT_RPATH tag are searched.

o????? If? the? environment? variable? LD_LIBRARY_PATH? is

defined to contain a colon-separated list of direc-

tories, then these are searched.? (As? a? security

measure? this? variable? is ignored for set-UID and

set-GID programs.)

o????? (ELF only) If the executable file for? the? calling

program? contains a DT_RUNPATH tag, then the direc-

tories listed in that tag are searched.

o????? The? cache? file?/etc/ld.so.cache? (maintained? by

ldconfig(8))? is checked to see whether it contains

an entry for filename.

o????? The directories /lib and /usr/lib are searched? (in

that order).

If the library has dependencies on other shared libraries,

then these are also automatically loaded? by? the? dynamic

linker? using? the? same? rules.?? (This process may occur

recursively, if those libraries in turn have dependencies,

and so on.)

The? value? of? flag? can be either RTLD_LAZY or RTLD_NOW.

When RTLD_NOW is specified, or? the? environment? variable

LD_BIND_NOW? is?set? to a non-empty string, all undefined

symbols?in? the? library? are? resolved? before? dlopen()

returns.? If? this? cannot? be done, an error is returned.

Otherwise? binding? is? lazy:? symbol? values? are?? first

resolved when needed.

Optionally,? RTLD_GLOBAL? may be or'ed into flag, in which

case the external symbols defined in the library? will? be

made? available?for? symbol? resolution? of? subsequently

loaded? libraries.?? (The? converse? of? RTLD_GLOBAL?? is

RTLD_LOCAL.? This is the default.)

If filename is a NULL pointer, then the returned handle is

for the main program.? When given to dlsym(), this? handle

causes a search for a symbol in the main program, followed

by all shared libraries loaded? at? program? startup,? and

then all shared libraries loaded by dlopen() with the flag

RTLD_GLOBAL.

External references in the library are resolved using? the

libraries? in that library's dependency list and any other

libraries previously opened with the RTLD_GLOBAL flag.? If

the? executable?was linked with the flag "-rdynamic" (or,

synonymously, "--export-dynamic"), then the global symbols

in? the executable will also be used to resolve references

in a dynamically loaded library.

If the same library is loaded? again? with? dlopen(),? the

same? file? handle? is? returned. The dl library maintains

reference counts for library handles, so a dynamic library

is? not?deallocated until dlclose() has been called on it

as many times as dlopen() has succeeded on it.? The? _init

routine, if present, is only called once. But a subsequent

call with RTLD_NOW? may?force? symbol? resolution? for?a

library earlier loaded with RTLD_LAZY.

If dlopen() fails for any reason, it returns NULL.

dlsym

The function dlsym() takes a "handle" of a dynamic library

returned by dlopen and? the? NUL-terminated? symbol? name,

returning? the? address?where? that symbol is loaded into

memory.?If the symbol is? not? found,? in? the?specified

library?or? any? of the libraries that were automatically

loaded by dlopen() when that library was? loaded,? dlsym()

returns NULL.? (The search performed by dlsym() is breadth

first through the dependency? tree? of? these? libraries.)

Since? the? value of the symbol could actually be NULL (so

that a NULL return? from? dlsym()? need?not? indicate? an

error),?the? correct? way to test for an error is to call

dlerror() to clear any old? error? conditions,? then? call

dlsym(),? and then call dlerror() again, saving its return

value into a variable, and check whether this saved? value

is not NULL.

There? are? two?special? pseudo-handles, RTLD_DEFAULT and

RTLD_NEXT.? The former will find the first? occurrence? of

the desired symbol using the default library search order.

The latter will find the next occurrence of a function? in

the? search? order after the current library.? This allows

one to provide a wrapper? around? a? function? in? another

shared library.

dlclose

The? function? dlclose() decrements the reference count on

the dynamic library handle handle.? If the reference count

drops to zero and no other loaded libraries use symbols in

it, then the dynamic library is unloaded.

The function dlclose() returns 0 on success, and? non-zero

on error.

The obsolete symbols _init and _fini

The linker recognizes special symbols _init and _fini.? If

a dynamic library exports a routine named _init, then that

code? is? executed? after? the? loading,? before? dlopen()

returns. If the dynamic library exports?a? routine? named

_fini, then that routine is called just before the library

is unloaded.? In case you? need to? avoid? linking against

the? system? startup files, this can be done by giving gcc

the "-nostartfiles" parameter on the command line.

Using these routines, or the gcc -nostartupfiles or -nost-

dlib? options, is not recommended. Their use may result in

undesired behavior, since the constructor/destructor? rou-

tines? will? not? be executed (unless special measures are

taken).

Instead,? libraries? should? export? routines? using?? the

__attribute__((constructor))? and? __attribute__((destruc-

tor)) function attributes.? See the? gcc? info? pages? for

information? on?these.?Constructor routines are executed

before dlopen returns, and destructor? routines?are? exe-

cuted before dlclose returns.

GNU EXTENSIONS

Glibc adds two functions not described by POSIX, with pro-

totypes

#define GNU_SOURCE

#include

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

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

The function dladdr() takes a function pointer? and? tries

to? resolve name and file where it is located. Information

is stored in the Dl_info structure:

typedef struct {

const char *dli_fname;/* File name of defining object */

void *dli_fbase;????? /* Load address of that object */

const char *dli_sname;/* Name of nearest lower symbol */

void *dli_saddr;????? /* Exact value of nearest symbol */

} Dl_info;

dladdr() returns 0 on error, and non-zero on success.

The function dlvsym() does the same as dlsym() but takes a

version string as additional argument.

EXAMPLE

Load the math library, and print the cosine of 2.0:

#include

#include

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(1);

}

dlerror();?/* Clear any existing error */

*(void **) (&cosine) = dlsym(handle, "cos");

if ((error = dlerror()) != NULL)? {

fprintf (stderr, "%s\n", error);

exit(1);

}

printf ("%f\n", (*cosine)(2.0));

dlclose(handle);

return 0;

}

If? this? program? were in a file named "foo.c", you would

build the program with the following command:

gcc -rdynamic -o foo foo.c -ldl

Libraries exporting _init() and _fini() will? want? to? be

compiled as follows, using bar.c as the example name:

gcc -shared -nostartfiles -o bar bar.c

NOTES

The? symbols? RTLD_DEFAULT? and?RTLD_NEXT? are defined by

only when _GNU_SOURCE was defined before includ-

ing it.

HISTORY

The? dlopen interface standard comes from SunOS. That sys-

tem also has dladdr, but not dlvsym.

CONFORMING TO

POSIX? 1003.1-2003? describes? dlclose,?dlerror,? dlopen,

dlsym.

SEE ALSO

ld(1),? ldd(1),?ld.so(8),? ldconfig(8), ld.so info pages,

gcc info pages, ld info pages

Linux?????? 2003-11-17???DLOPEN(3)

總結

以上是生活随笔為你收集整理的linux 无法加载动态库,51CTO博客-专业IT技术博客创作平台-技术成就梦想的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。