File indexing completed on 2025-05-11 08:24:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #include <stdint.h>
0039 #include <dlfcn.h>
0040 #include <rtems/rtl/rtl.h>
0041
0042 static rtems_rtl_obj*
0043 dl_get_obj_from_handle (void* handle)
0044 {
0045 rtems_rtl_obj* obj;
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 if ((handle == RTLD_DEFAULT) || (handle == RTLD_SELF))
0056 obj = rtems_rtl_baseimage ();
0057 else
0058 obj = rtems_rtl_check_handle (handle);
0059
0060 return obj;
0061 }
0062
0063 void*
0064 dlopen (const char* name, int mode)
0065 {
0066 rtems_rtl_obj* obj = NULL;
0067
0068 if (!rtems_rtl_lock ())
0069 return NULL;
0070
0071 _rtld_debug.r_state = RT_ADD;
0072 _rtld_debug_state ();
0073
0074 if (name)
0075 obj = rtems_rtl_load (name, mode);
0076 else
0077 obj = rtems_rtl_baseimage ();
0078
0079 _rtld_debug.r_state = RT_CONSISTENT;
0080 _rtld_debug_state();
0081
0082 rtems_rtl_unlock ();
0083
0084 return obj;
0085 }
0086
0087 int
0088 dlclose (void* handle)
0089 {
0090 rtems_rtl_obj* obj;
0091 int r;
0092
0093 if (!rtems_rtl_lock ())
0094 return -1;
0095
0096 obj = rtems_rtl_check_handle (handle);
0097 if (!obj)
0098 {
0099 rtems_rtl_unlock ();
0100 return -1;
0101 }
0102
0103 _rtld_debug.r_state = RT_DELETE;
0104 _rtld_debug_state ();
0105
0106 r = rtems_rtl_unload (obj) ? 0 : -1;
0107
0108 _rtld_debug.r_state = RT_CONSISTENT;
0109 _rtld_debug_state ();
0110
0111 rtems_rtl_unlock ();
0112
0113 return r;
0114 }
0115
0116 void*
0117 dlsym (void* handle, const char *symbol)
0118 {
0119 rtems_rtl_obj* obj;
0120 rtems_rtl_obj_sym* sym = NULL;
0121 void* symval = NULL;
0122
0123 if (!rtems_rtl_lock ())
0124 return NULL;
0125
0126
0127
0128
0129 if (handle == RTLD_DEFAULT)
0130 {
0131 sym = rtems_rtl_symbol_global_find (symbol);
0132 }
0133 else
0134 {
0135 obj = dl_get_obj_from_handle (handle);
0136 if (obj)
0137 sym = rtems_rtl_symbol_obj_find (obj, symbol);
0138 }
0139
0140 if (sym)
0141 symval = sym->value;
0142
0143 rtems_rtl_unlock ();
0144
0145 return symval;
0146 }
0147
0148 const char*
0149 dlerror (void)
0150 {
0151 static char msg[64];
0152 int eno;
0153 eno = rtems_rtl_get_error (msg, sizeof (msg));
0154 if (eno == 0)
0155 return NULL;
0156 return msg;
0157 }
0158
0159 int
0160 dlinfo (void* handle, int request, void* p)
0161 {
0162 rtems_rtl_obj* obj;
0163 int rc = -1;
0164
0165 if (!rtems_rtl_lock () || !p)
0166 return -1;
0167
0168 obj = dl_get_obj_from_handle (handle);
0169 if (obj)
0170 {
0171 switch (request)
0172 {
0173 case RTLD_DI_UNRESOLVED:
0174 *((int*) p) = rtems_rtl_obj_unresolved (obj) ? 1 : 0;
0175 rc = 0;
0176 break;
0177 default:
0178 break;
0179 }
0180 }
0181
0182 rtems_rtl_unlock ();
0183
0184 return rc;
0185 }