File indexing completed on 2025-05-11 08:24:32
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 #include <stdio.h>
0029
0030 #include <dlfcn.h>
0031
0032 #include "dl-load.h"
0033
0034 #include <rtems/rtl/rtl-shell.h>
0035 #include <rtems/rtl/rtl-trace.h>
0036
0037 #define TEST_TRACE 0
0038 #if TEST_TRACE
0039 #define DL_DEBUG_TRACE (RTEMS_RTL_TRACE_ALL & ~RTEMS_RTL_TRACE_ALLOCATOR)
0040 #define DL_RTL_CMDS 1
0041 #else
0042 #define DL_DEBUG_TRACE 0
0043 #define DL_RTL_CMDS 0
0044 #endif
0045
0046 typedef int (*call_t)(int argc, const char* argv[]);
0047
0048 static const char* call_args[] = { "1", "2", "3", "4" };
0049
0050 static void* dl_load_obj(const char* name)
0051 {
0052 void* handle;
0053 int unresolved;
0054 char* message = "loaded";
0055
0056 printf("load: %s\n", name);
0057
0058 handle = dlopen (name, RTLD_NOW | RTLD_GLOBAL);
0059 if (!handle)
0060 {
0061 printf("dlopen failed: %s\n", dlerror());
0062 return NULL;
0063 }
0064
0065 if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
0066 message = "dlinfo error checking unresolved status";
0067 else if (unresolved)
0068 message = "has unresolved externals";
0069
0070 printf ("handle: %p %s\n", handle, message);
0071
0072 return handle;
0073 }
0074
0075 int dl_load_test(void)
0076 {
0077 void* o1;
0078 void* o2;
0079 call_t call;
0080 int call_ret;
0081 int ret;
0082
0083 #if DL_DEBUG_TRACE
0084 rtems_rtl_trace_set_mask (DL_DEBUG_TRACE);
0085 #endif
0086
0087 o1 = dl_load_obj("/dl02-o1.o");
0088 if (!o1)
0089 return 1;
0090 o2 = dl_load_obj("/dl02-o2.o");
0091 if (!o2)
0092 return 1;
0093
0094 #if DL_RTL_CMDS
0095 {
0096 char* list[] = { "rtl", "list", NULL };
0097 rtems_rtl_shell_command (2, list);
0098 char* sym[] = { "rtl", "sym", NULL };
0099 rtems_rtl_shell_command (2, sym);
0100 }
0101 #endif
0102
0103 call = dlsym (o1, "rtems_main");
0104 if (call == NULL)
0105 {
0106 printf("dlsym failed: symbol not found\n");
0107 return 1;
0108 }
0109
0110 call_ret = call (4, call_args);
0111 if (call_ret != 4)
0112 {
0113 printf("dlsym call failed: ret value bad\n");
0114 return 1;
0115 }
0116
0117 ret = 0;
0118
0119 if (dlclose (o1) < 0)
0120 {
0121 printf("dlclose o1 failed: %s\n", dlerror());
0122 ret = 1;
0123 }
0124
0125 printf ("handle: %p closed\n", o1);
0126
0127 if (dlclose (o2) < 0)
0128 {
0129 printf("dlclose o1 failed: %s\n", dlerror());
0130 ret = 1;
0131 }
0132
0133 printf ("handle: %p closed\n", o2);
0134
0135 return ret;
0136 }