mirror of
https://git.proxmox.com/git/wasi-libc
synced 2025-08-17 20:47:56 +00:00

* add stubs for dlopen, dlsym, etc. This adds weak exports for the POSIX `dlopen`, `dlsym`, `dlclose`, and `dlerror` functions, allowing code which uses those features to compile. The implementations are stubs which always fail since there is currently no official standard for runtime dynamic linking. Since the symbols are weak, they can be overriden with useful, runtime-specific implementations, e.g. based on host functions or statically-generated tables (see https://github.com/dicej/component-linking-demo for an example of the latter). Signed-off-by: Joel Dice <joel.dice@fermyon.com> * move `dlopen` stubs out of libc and into libdl Per review feedback, it's easier to simply replace libdl.so with a working implementation at runtime than it is to override a handful of symbols in libc. Note that I've both added libdl.so and replaced the empty libdl.a we were previously creating with one that contains the stubs. I'm thinking we might as well be consistent about what symbols the .so and the .a contain. Otherwise, e.g. the CPython build gets confused when the dlfcn.h says `dlopen` etc. exist but libdl.a is empty. Signed-off-by: Joel Dice <joel.dice@fermyon.com> * customize dlfcn.h for WASI For WASI, we use flag values which match MacOS rather than musl. This gives `RTLD_LOCAL` a non-zero value, avoiding ambiguity and allowing us to defer the decision of whether `RTLD_LOCAL` or `RTLD_GLOBAL` should be the default when neither is specified. We also avoid declaring `dladdr`, `dlinfo`, and friends on WASI since they are neither supported nor stubbed at this time. Signed-off-by: Joel Dice <joel.dice@fermyon.com> * use musl's RTLD_* flags except for RTLD_LOCAL This minimizes the divergence from upstream while still giving us the flexibility to choose a default value later. Signed-off-by: Joel Dice <joel.dice@fermyon.com> * use `NULL` instead of `0` for null pointers Signed-off-by: Joel Dice <joel.dice@fermyon.com> --------- Signed-off-by: Joel Dice <joel.dice@fermyon.com>
57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
#ifndef _DLFCN_H
|
|
#define _DLFCN_H
|
|
|
|
#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
|
|
#ifdef __wasilibc_unmodified_upstream
|
|
#define RTLD_LOCAL 0
|
|
#else
|
|
/* For WASI, we give `RTLD_LOCAL` a non-zero value, avoiding ambiguity and
|
|
* allowing us to defer the decision of whether `RTLD_LOCAL` or `RTLD_GLOBAL`
|
|
* should be the default when neither is specified.
|
|
*/
|
|
#define RTLD_LOCAL 8
|
|
#endif
|
|
|
|
#define RTLD_NEXT ((void *)-1)
|
|
#define RTLD_DEFAULT ((void *)0)
|
|
|
|
#ifdef __wasilibc_unmodified_upstream
|
|
#define RTLD_DI_LINKMAP 2
|
|
#endif
|
|
|
|
int dlclose(void *);
|
|
char *dlerror(void);
|
|
void *dlopen(const char *, int);
|
|
void *dlsym(void *__restrict, const char *__restrict);
|
|
|
|
#if defined(__wasilibc_unmodified_upstream) && (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
|
|
|
|
#if _REDIR_TIME64
|
|
__REDIR(dlsym, __dlsym_time64);
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|