/*-1* SPDX-License-Identifier: BSD-3-Clause2*3* Copyright (c) 19944* The Regents of the University of California. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14* 3. Neither the name of the University nor the names of its contributors15* may be used to endorse or promote products derived from this software16* without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND19* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE21* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE22* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL23* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS24* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT26* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY27* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGE.29*/3031#ifndef _DLFCN_H_32#define _DLFCN_H_3334#include <sys/cdefs.h>35#include <sys/_types.h>3637/*38* Modes and flags for dlopen().39*/40#define RTLD_LAZY 1 /* Bind function calls lazily. */41#define RTLD_NOW 2 /* Bind function calls immediately. */42#define RTLD_MODEMASK 0x343#define RTLD_GLOBAL 0x100 /* Make symbols globally available. */44#define RTLD_LOCAL 0 /* Opposite of RTLD_GLOBAL, and the default. */45#define RTLD_TRACE 0x200 /* Trace loaded objects and exit. */46#define RTLD_NODELETE 0x01000 /* Do not remove members. */47#define RTLD_NOLOAD 0x02000 /* Do not load if not already loaded. */48#define RTLD_DEEPBIND 0x04000 /* Put symbols from the dso ahead of49the global list */5051/*52* Request arguments for dlinfo().53*/54#define RTLD_DI_LINKMAP 2 /* Obtain link map. */55#define RTLD_DI_SERINFO 4 /* Obtain search path info. */56#define RTLD_DI_SERINFOSIZE 5 /* ... query for required space. */57#define RTLD_DI_ORIGIN 6 /* Obtain object origin */58#define RTLD_DI_MAX RTLD_DI_ORIGIN5960/*61* Special handle arguments for dlsym()/dlinfo().62*/63#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */64#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */65#define RTLD_SELF ((void *) -3) /* Search the caller itself. */6667#if __BSD_VISIBLE6869#ifndef _SIZE_T_DECLARED70typedef __size_t size_t;71#define _SIZE_T_DECLARED72#endif7374/*75* Structure filled in by dladdr().76*/77typedef struct dl_info {78const char *dli_fname; /* Pathname of shared object. */79void *dli_fbase; /* Base address of shared object. */80const char *dli_sname; /* Name of nearest symbol. */81void *dli_saddr; /* Address of nearest symbol. */82} Dl_info;8384/*-85* The actual type declared by this typedef is immaterial, provided that86* it is a function pointer. Its purpose is to provide a return type for87* dlfunc() which can be cast to a function pointer type without depending88* on behavior undefined by the C standard, which might trigger a compiler89* diagnostic. We intentionally declare a unique type signature to force90* a diagnostic should the application not cast the return value of dlfunc()91* appropriately.92*/93struct __dlfunc_arg {94int __dlfunc_dummy;95};9697typedef void (*dlfunc_t)(struct __dlfunc_arg);9899/*100* Structures, returned by the RTLD_DI_SERINFO dlinfo() request.101*/102typedef struct dl_serpath {103char * dls_name; /* single search path entry */104unsigned int dls_flags; /* path information */105} Dl_serpath;106107typedef struct dl_serinfo {108size_t dls_size; /* total buffer size */109unsigned int dls_cnt; /* number of path entries */110Dl_serpath dls_serpath[1]; /* there may be more than one */111} Dl_serinfo;112113#endif /* __BSD_VISIBLE */114115__BEGIN_DECLS116/* XSI functions first. */117int dlclose(void *);118char *dlerror(void);119void *dlopen(const char *, int);120void *dlsym(void * __restrict, const char * __restrict);121122#if __BSD_VISIBLE123void *fdlopen(int, int);124int dladdr(const void * __restrict, Dl_info * __restrict);125dlfunc_t dlfunc(void * __restrict, const char * __restrict);126int dlinfo(void * __restrict, int, void * __restrict);127void dllockinit(void *_context,128void *(*_lock_create)(void *_context),129void (*_rlock_acquire)(void *_lock),130void (*_wlock_acquire)(void *_lock),131void (*_lock_release)(void *_lock),132void (*_lock_destroy)(void *_lock),133void (*_context_destroy)(void *_context));134void *dlvsym(void * __restrict, const char * __restrict,135const char * __restrict);136#endif /* __BSD_VISIBLE */137__END_DECLS138139#endif /* !_DLFCN_H_ */140141142