#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>

#define RTLD_LAZY 1
#define RTLD_NOW 2
#define RTLD_NOLOAD 4
#define RTLD_NODELETE 4096
#define RTLD_GLOBAL 256
#define RTLD_LOCAL 0

#define RTLD_NEXT ((void*)-1)
#define RTLD_DEFAULT ((void*)0)

#define RTLD_DI_LINKMAP 2

int dlclose(void*);
char* dlerror(void);
void* dlopen(const char*, int);
void* dlsym(void* __restrict, const char* __restrict);

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef struct {
    const char* dli_fname;
    void* dli_fbase;
    const char* dli_sname;
    void* dli_saddr;
} Dl_info;
int dladdr(const void*, Dl_info*);
int dlinfo(void*, int, void*);
#endif

#ifdef __cplusplus
}
#endif