123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #include "lt__private.h"
- #include "lt_dlloader.h"
- #define get_vtable dld_link_LTX_get_vtable
- LT_BEGIN_C_DECLS
- LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
- LT_END_C_DECLS
- static int vl_exit (lt_user_data loader_data);
- static lt_module vm_open (lt_user_data loader_data, const char *filename,
- lt_dladvise advise);
- static int vm_close (lt_user_data loader_data, lt_module module);
- static void * vm_sym (lt_user_data loader_data, lt_module module,
- const char *symbolname);
- static lt_dlvtable *vtable = 0;
- lt_dlvtable *
- get_vtable (lt_user_data loader_data)
- {
- if (!vtable)
- {
- vtable = lt__zalloc (sizeof *vtable);
- }
- if (vtable && !vtable->name)
- {
- vtable->name = "lt_dld_link";
- vtable->module_open = vm_open;
- vtable->module_close = vm_close;
- vtable->find_sym = vm_sym;
- vtable->dlloader_exit = vl_exit;
- vtable->dlloader_data = loader_data;
- vtable->priority = LT_DLLOADER_APPEND;
- }
- if (vtable && (vtable->dlloader_data != loader_data))
- {
- LT__SETERROR (INIT_LOADER);
- return 0;
- }
- return vtable;
- }
- #if defined HAVE_DLD_H
- # include <dld.h>
- #endif
- static int
- vl_exit (lt_user_data loader_data LT__UNUSED)
- {
- vtable = NULL;
- return 0;
- }
- static lt_module
- vm_open (lt_user_data loader_data LT__UNUSED, const char *filename,
- lt_dladvise advise LT__UNUSED)
- {
- lt_module module = lt__strdup (filename);
- if (dld_link (filename) != 0)
- {
- LT__SETERROR (CANNOT_OPEN);
- FREE (module);
- }
- return module;
- }
- static int
- vm_close (lt_user_data loader_data LT__UNUSED, lt_module module)
- {
- int errors = 0;
- if (dld_unlink_by_file ((char*)(module), 1) != 0)
- {
- LT__SETERROR (CANNOT_CLOSE);
- ++errors;
- }
- else
- {
- FREE (module);
- }
- return errors;
- }
- static void *
- vm_sym (lt_user_data loader_data LT__UNUSED, lt_module module LT__UNUSED,
- const char *name)
- {
- void *address = dld_get_func (name);
- if (!address)
- {
- LT__SETERROR (SYMBOL_NOT_FOUND);
- }
- return address;
- }
|