Asterisk.org: Developer Documentation (28 Oct 2009)

Wed Oct 28 15:48:47 2009

## Asterisk developer's documentation

# dlfcn-compat.h File Reference

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

## Data Structures

struct | dl_info

## Defines

#define | dl_restrict
#define | RTLD_DEFAULT ((void *) -2)
#define | RTLD_GLOBAL 0x8
#define | RTLD_LAZY 0x1
#define | RTLD_LOCAL 0x4
#define | RTLD_NEXT ((void *) -1)
#define | RTLD_NODELETE 0x80
#define | RTLD_NOLOAD 0x10
#define | RTLD_NOW 0x2

## Typedefs

typedef struct dl_info | Dl_info

## Functions

int | dladdr (const void *dl_restrict, Dl_info *dl_restrict)
int | dlclose (void *handle)
const char * | dlerror (void)
void * | dlopen (const char *path, int mode)
void * | dlsym (void *dl_restrict handle, const char *dl_restrict symbol)

## Define Documentation

#define dl_restrict

Definition at line 52 of file dlfcn-compat.h.

#define RTLD_DEFAULT ((void *) -2)

Definition at line 82 of file dlfcn-compat.h.

Referenced by dlsymIntern().

#define RTLD_GLOBAL 0x8

Definition at line 74 of file dlfcn-compat.h.

Referenced by __load_resource(), loadModule(), and reference().

#define RTLD_LAZY 0x1

Definition at line 71 of file dlfcn-compat.h.

Referenced by __load_resource(), and dlopen().

#define RTLD_LOCAL 0x4

Definition at line 73 of file dlfcn-compat.h.

#define RTLD_NEXT ((void *) -1)

Definition at line 81 of file dlfcn-compat.h.

Referenced by dlsymIntern().

#define RTLD_NODELETE 0x80

Definition at line 76 of file dlfcn-compat.h.

Referenced by dlclose().

#define RTLD_NOLOAD 0x10

Definition at line 75 of file dlfcn-compat.h.

Referenced by dlopen().

#define RTLD_NOW 0x2

Definition at line 72 of file dlfcn-compat.h.

## Typedef Documentation

typedef struct dl_info Dl_info

## Function Documentation

int dladdr | ( | const void * | dl_restrict,
|  | Dl_info * | dl_restrict |
| ) |  |  |

int dlclose | ( | void * | handle | ) |

Definition at line 1041 of file dlfcn.c.

References debug, dlsymIntern(), dolock(), dounlock(), error(), get_lib_name(), get_mach_header_from_NSModule(), isFlagSet(), isValidStatus(), dlstatus::lib, MAGIC_DYLIB_MOD, dlstatus::mode, dlstatus::module, name, dlstatus::refs, resetdlerror(), RTLD_NODELETE, and warning().

Referenced by __load_resource(), and ast_unload_resource().

    01042 {
    01043    struct dlstatus *dls = handle;
    01044    dolock();
    01045    resetdlerror();
    01046    if (!isValidStatus(dls))
    01047    {
    01048       goto dlcloseerror;
    01049    }
    01050    if (dls->module == MAGIC_DYLIB_MOD)
    01051    {
    01052       const char *name;
    01053       if (!dls->lib)
    01054       {
    01055          name = "global context";
    01056       }
    01057       else
    01058       {
    01059          name = get_lib_name(dls->lib);
    01060       }
    01061       warning("trying to close a .dylib!");
    01062       error("Not closing \"%s\" - dynamic libraries cannot be closed", name);
    01063       goto dlcloseerror;
    01064    }
    01065    if (!dls->module)
    01066    {
    01067       error("module already closed");
    01068       goto dlcloseerror;
    01069    }
    01070
    01071    if (dls->refs == 1)
    01072    {
    01073       unsigned long options = 0;
    01074       void (*fini) (void);
    01075       if ((fini = dlsymIntern(dls, "__fini", 0)))
    01076       {
    01077          debug("calling _fini()");
    01078          fini();
    01079       }
    01080 #ifdef __ppc__
    01081       options |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES;
    01082 #endif
    01083 #if 1
    01084 /*  Currently, if a module contains c++ static destructors and it is unloaded, we
    01085  *  get a segfault in atexit(), due to compiler and dynamic loader differences of
    01086  *  opinion, this works around that.
    01087  *  I really need a way to figure out from code if this is still necessary.
    01088  */
    01089       if ((const struct section *)NULL !=
    01090          getsectbynamefromheader(get_mach_header_from_NSModule(dls->module),
    01091                            "__DATA", "__mod_term_func"))
    01092       {
    01093          options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
    01094       }
    01095 #endif
    01096 #ifdef RTLD_NODELETE
    01097       if (isFlagSet(dls->mode, RTLD_NODELETE))
    01098          options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
    01099 #endif
    01100       if (!NSUnLinkModule(dls->module, options))
    01101       {
    01102          error("unable to unlink module");
    01103          goto dlcloseerror;
    01104       }
    01105       dls->refs--;
    01106       dls->module = 0;
    01107       /* Note: the dlstatus struct dls is neither removed from the list
    01108        * nor is the memory it occupies freed. This shouldn't pose a
    01109        * problem in mostly all cases, though.
    01110        */
    01111    }
    01112    dounlock();
    01113    return 0;
    01114   dlcloseerror:
    01115    dounlock();
    01116    return 1;
    01117 }

const char* dlerror | ( | void |  | ) |

Definition at line 1119 of file dlfcn.c.

References dlerror_key, dlthread::errset, and dlthread::errstr.

Referenced by __load_resource().

    01120 {
    01121    struct dlthread  *tss;
    01122    char * err_str;
    01123    tss = pthread_getspecific(dlerror_key);
    01124    err_str = tss->errstr;
    01125    tss = pthread_getspecific(dlerror_key);
    01126    if (tss->errset == 0)
    01127       return 0;
    01128    tss->errset = 0;
    01129    return (err_str );
    01130 }

void* dlopen | ( | const char * | path,
|  | int | mode |
| ) |  |  |

Definition at line 897 of file dlfcn.c.

References dlcompat_init_func(), dolock(), dounlock(), error(), findFile(), isFlagSet(), loadModule(), lookupStatus(), reference(), dlstatus::refs, resetdlerror(), RTLD_LAZY, RTLD_NOLOAD, and RTLD_NOW.

Referenced by __load_resource().

    00898 {
    00899    const struct stat *sbuf;
    00900    struct dlstatus *dls;
    00901    const char *fullPath;
    00902    dlcompat_init_func();      /* Just in case */
    00903    dolock();
    00904    resetdlerror();
    00905    if (!path)
    00906    {
    00907       dls = &mainStatus;
    00908       goto dlopenok;
    00909    }
    00910    if (!(sbuf = findFile(path, &fullPath)))
    00911    {
    00912       error("file \"%s\" not found", path);
    00913       goto dlopenerror;
    00914    }
    00915    /* Now checks that it hasn't been closed already */
    00916    if ((dls = lookupStatus(sbuf)) && (dls->refs > 0))
    00917    {
    00918       /* debug("status found"); */
    00919       dls = reference(dls, mode);
    00920       goto dlopenok;
    00921    }
    00922 #ifdef   RTLD_NOLOAD
    00923    if (isFlagSet(mode, RTLD_NOLOAD))
    00924    {
    00925       error("no existing handle and RTLD_NOLOAD specified");
    00926       goto dlopenerror;
    00927    }
    00928 #endif
    00929    if (isFlagSet(mode, RTLD_LAZY) && isFlagSet(mode, RTLD_NOW))
    00930    {
    00931       error("how can I load something both RTLD_LAZY and RTLD_NOW?");
    00932       goto dlopenerror;
    00933    }
    00934    dls = loadModule(fullPath, sbuf, mode);
    00935
    00936   dlopenok:
    00937    dounlock();
    00938    return (void *)dls;
    00939   dlopenerror:
    00940    dounlock();
    00941    return NULL;
    00942 }

void* dlsym | ( | void *dl_restrict | handle,
|  | const char *dl_restrict | symbol |
| ) |  |  |

Definition at line 945 of file dlfcn.c.

References dlsymIntern(), dolock(), dounlock(), error(), free, and malloc.

Referenced by __load_resource().

    00946 {
    00947    int sym_len = strlen(symbol);
    00948    void *value = NULL;
    00949    char *malloc_sym = NULL;
    00950    dolock();
    00951    malloc_sym = malloc(sym_len + 2);
    00952    if (malloc_sym)
    00953    {
    00954       sprintf(malloc_sym, "_%s", symbol);
    00955       value = dlsymIntern(handle, malloc_sym, 1);
    00956       free(malloc_sym);
    00957    }
    00958    else
    00959    {
    00960       error("Unable to allocate memory");
    00961       goto dlsymerror;
    00962    }
    00963    dounlock();
    00964    return value;
    00965   dlsymerror:
    00966    dounlock();
    00967    return NULL;
    00968 }