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