diff options
Diffstat (limited to 'src/lib/libdll/features/dll')
-rw-r--r-- | src/lib/libdll/features/dll | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/lib/libdll/features/dll b/src/lib/libdll/features/dll new file mode 100644 index 0000000..691012f --- /dev/null +++ b/src/lib/libdll/features/dll @@ -0,0 +1,263 @@ +set prototyped +hdr dl,dlfcn,dll,rld_interface,mach-o/dyld +sys ldr +lib dlopen -ldl +lib dllload,loadbind,shl_load -ldl +tst dll_DYNAMIC link{ + #include <sys/types.h> + #include <link.h> + extern struct link_dynamic _DYNAMIC; + int + main() + { + return _DYNAMIC.ld_version; + } +}end +tst run{ + lib= + for d in /shlib /usr/shlib /lib /usr/lib + do if test -d $d + then for s in "*.*" "*[!a]*" + do for b in libc + do for i in $d/$b.$s + do if test -f $i + then lib=$i + fi + done + case $lib in + ?*) break 3 ;; + esac + done + done + fi + done + case $lib in + *.[0-9]*.[0-9]*) + i=`echo $lib | sed 's,\([^0-9]*[0-9]*\).*,\1,'` + if test -f $i + then lib=$i + fi + ;; + esac + # some run time linkers barf with /lib/xxx if + # /usr/lib/xxx is there + case $lib in + /usr*) ;; + *) if test -f /usr$lib + then lib=/usr$lib + fi + ;; + esac + case $lib in + "") lib=/lib/libc.so.1 ;; + esac + case $lib in + /usr/lib/*) + case `package` in + sgi.mips3) + abi=/lib32 + ;; + sgi.mips4) + abi=/lib64 + ;; + *) abi= + ;; + esac + case $abi in + ?*) if test -d $abi + then lib=`echo $lib | sed 's,/usr/lib/,,'` + lib=$abi/$lib + fi + ;; + esac + ;; + esac + echo "#define _DLL_NEXT_PATH \"$lib\"" +}end +tst - output{ + #if defined(__MVS__) && !defined(__SUSV3) + #define __SUSV3 1 + #endif + #if _hdr_dlfcn && _lib_dlopen + #include <dlfcn.h> + #endif + #if _hdr_rld_interface + #include <rld_interface.h> + #endif + int + main() + { + int i; + #if _hdr_rld_interface + void* dll; + static char* local[] = { "__elf_header", "_call_add_gp_range", "_etext" }; + #endif + printf("\n"); + printf("#if defined(__MVS__) && !defined(__SUSV3)\n"); + printf("#define __SUSV3 1\n"); + printf("#endif\n"); + #if _hdr_dlfcn && _lib_dlopen + printf("#include <dlfcn.h>\n"); + #endif + #ifndef RTLD_LAZY + i = 0; + printf("\n"); + printf("#define RTLD_LAZY 1\n"); + #else + i = 1; + #endif + #ifndef RTLD_NOW + if (i) + { + i = 0; + printf("\n"); + } + printf("#define RTLD_NOW 2\n"); + #endif + #ifndef RTLD_GLOBAL + if (i) + { + i = 0; + printf("\n"); + } + printf("#define RTLD_GLOBAL 0\n"); + #endif + #ifndef RTLD_LOCAL + if (i) + { + i = 0; + printf("\n"); + } + printf("#define RTLD_LOCAL 0\n"); + #endif + #ifndef RTLD_PARENT + if (i) + { + i = 0; + printf("\n"); + } + printf("#define RTLD_PARENT 0\n"); + #endif + #if defined(_hdr_mach_o_dyld) && !defined(RTLD_NEXT) + if (i) + { + i = 0; + printf("\n"); + } + printf("#define RTLD_NEXT ((void*)16)\n"); + #endif + #if _hdr_rld_interface + if (!(dll = dlopen(0, RTLD_LAZY))) + i = -1; + else + { + for (i = 0; i < sizeof(local) / sizeof(local[0]); i++) + if (dlsym(dll, local[i])) + break; + if (i >= sizeof(local) / sizeof(local[0])) + i = -1; + } + if (i >= 0) + { + printf("\n"); + printf("#define _DLL_RLD_SYM %s\n", local[i]); + printf("#define _DLL_RLD_SYM_STR \"%s\"\n", local[i]); + printf("#define _DLL_RLD_SYM_TYPE void*\n"); + } + #endif + printf("\n"); + printf("#define DLL_INFO_PREVER 0x0001 /* pre-suffix style version */\n"); + printf("#define DLL_INFO_DOTVER 0x0002 /* post-suffix style version */\n"); + printf("\n"); + printf("typedef unsigned long (*Dll_plugin_version_f)(void);\n"); + printf("typedef int (*Dllerror_f)(void*, void*, int, ...);\n"); + printf("\n"); + printf("typedef struct Dllinfo_s\n"); + printf("{\n"); + printf(" char** sibling; /* sibling dirs on $PATH */\n"); + printf(" char* prefix; /* library name prefix */\n"); + printf(" char* suffix; /* library name suffix */\n"); + printf(" char* env; /* library path env var */\n"); + printf(" int flags; /* DLL_INFO_* flags */\n"); + printf("#ifdef _DLLINFO_PRIVATE_\n"); + printf(" _DLLINFO_PRIVATE_\n"); + printf("#endif\n"); + printf("} Dllinfo_t;\n"); + printf("\n"); + printf("typedef struct Dllnames_s\n"); + printf("{\n"); + printf(" char* id;\n"); + printf(" char* name;\n"); + printf(" char* base;\n"); + printf(" char* type;\n"); + printf(" char* opts;\n"); + printf(" char* path;\n"); + printf(" char data[1024];\n"); + printf("} Dllnames_t;\n"); + printf("\n"); + printf("typedef struct Dllent_s\n"); + printf("{\n"); + printf(" char* path;\n"); + printf(" char* name;\n"); + printf("#ifdef _DLLENT_PRIVATE_\n"); + printf(" _DLLENT_PRIVATE_\n"); + printf("#endif\n"); + printf("} Dllent_t;\n"); + printf("\n"); + printf("typedef struct Dllscan_s\n"); + printf("{\n"); + printf(" void* pad;\n"); + printf("#ifdef _DLLSCAN_PRIVATE_\n"); + printf(" _DLLSCAN_PRIVATE_\n"); + printf("#endif\n"); + printf("} Dllscan_t;\n"); + #if !_hdr_dlfcn || !_lib_dlopen + printf("\n"); + printf("extern void* dlopen(const char*, int);\n"); + printf("extern void* dlsym(void*, const char*);\n"); + printf("extern int dlclose(void*);\n"); + printf("extern char* dlerror(void);\n"); + #endif + printf("\n"); + printf("#if _BLD_dll && defined(__EXPORT__)\n"); + printf("#define extern __EXPORT__\n"); + printf("#endif\n"); + printf("\n"); + printf("extern Dllinfo_t* dllinfo(void);\n"); + printf("extern void* dllplugin(const char*, const char*, const char*, unsigned long, unsigned long*, int, char*, size_t);\n"); + printf("extern void* dllplug(const char*, const char*, const char*, int, char*, size_t);\n"); + printf("extern void* dllfind(const char*, const char*, int, char*, size_t);\n"); + printf("extern Dllnames_t* dllnames(const char*, const char*, Dllnames_t*);\n"); + printf("extern void* dll_lib(Dllnames_t*, unsigned long, Dllerror_f, void*);\n"); + printf("extern void* dllmeth(const char*, const char*, unsigned long);\n"); + printf("extern void* dllopen(const char*, int);\n"); + printf("extern void* dllnext(int);\n"); + printf("extern void* dlllook(void*, const char*);\n"); + printf("extern int dllcheck(void*, const char*, unsigned long, unsigned long*);\n"); + printf("extern unsigned long dllversion(void*, const char*);\n"); + printf("extern char* dllerror(int);\n"); + #if _hdr_rld_interface + if (i >= 0) + { + printf("\n"); + printf("extern void* _dll_next(int, _DLL_RLD_SYM_TYPE*);\n"); + printf("#define dllnext(f) _dll_next(f, &_DLL_RLD_SYM)\n"); + } + #endif + printf("\n"); + printf("extern Dllscan_t* dllsopen(const char*, const char*, const char*);\n"); + printf("extern Dllent_t* dllsread(Dllscan_t*);\n"); + printf("extern int dllsclose(Dllscan_t*);\n"); + printf("\n"); + printf("#undef extern\n"); + #if _hdr_rld_interface + if (i >= 0) + { + printf("\n"); + printf("extern _DLL_RLD_SYM_TYPE _DLL_RLD_SYM;\n"); + } + #endif + printf("\n"); + return 0; + } +}end |