This source file includes following definitions.
- get_vtable
- vl_exit
- vm_open
- vm_close
- vm_sym
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include "lt__private.h"
33 #include "lt_dlloader.h"
34
35
36
37
38
39 #define get_vtable dld_link_LTX_get_vtable
40
41 LT_BEGIN_C_DECLS
42 LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
43 LT_END_C_DECLS
44
45
46
47
48 static int vl_exit (lt_user_data loader_data);
49 static lt_module vm_open (lt_user_data loader_data, const char *filename,
50 lt_dladvise advise);
51 static int vm_close (lt_user_data loader_data, lt_module module);
52 static void * vm_sym (lt_user_data loader_data, lt_module module,
53 const char *symbolname);
54
55 static lt_dlvtable *vtable = 0;
56
57
58
59
60 lt_dlvtable *
61 get_vtable (lt_user_data loader_data)
62 {
63 if (!vtable)
64 {
65 vtable = lt__zalloc (sizeof *vtable);
66 }
67
68 if (vtable && !vtable->name)
69 {
70 vtable->name = "lt_dld_link";
71 vtable->module_open = vm_open;
72 vtable->module_close = vm_close;
73 vtable->find_sym = vm_sym;
74 vtable->dlloader_exit = vl_exit;
75 vtable->dlloader_data = loader_data;
76 vtable->priority = LT_DLLOADER_APPEND;
77 }
78
79 if (vtable && (vtable->dlloader_data != loader_data))
80 {
81 LT__SETERROR (INIT_LOADER);
82 return 0;
83 }
84
85 return vtable;
86 }
87
88
89
90
91
92
93 #if defined(HAVE_DLD_H)
94 # include <dld.h>
95 #endif
96
97
98
99 static int
100 vl_exit (lt_user_data LT__UNUSED loader_data)
101 {
102 vtable = NULL;
103 return 0;
104 }
105
106
107
108
109 static lt_module
110 vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
111 lt_dladvise LT__UNUSED advise)
112 {
113 lt_module module = lt__strdup (filename);
114
115 if (module && dld_link (filename) != 0)
116 {
117 LT__SETERROR (CANNOT_OPEN);
118 FREE (module);
119 }
120
121 return module;
122 }
123
124
125
126 static int
127 vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
128 {
129 int errors = 0;
130
131 if (dld_unlink_by_file ((char*)(module), 1) != 0)
132 {
133 LT__SETERROR (CANNOT_CLOSE);
134 ++errors;
135 }
136 else
137 {
138 FREE (module);
139 }
140
141 return errors;
142 }
143
144
145
146 static void *
147 vm_sym (lt_user_data LT__UNUSED loader_data, lt_module LT__UNUSED module,
148 const char *name)
149 {
150 void *address = dld_get_func (name);
151
152 if (!address)
153 {
154 LT__SETERROR (SYMBOL_NOT_FOUND);
155 }
156
157 return address;
158 }