File indexing completed on 2025-05-11 08:24:33
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 #include "dl13-arm_mode.h"
0034
0035 #include <rtems/rtl/rtl-shell.h>
0036 #include <rtems/rtl/rtl-trace.h>
0037
0038 #define TEST_TRACE 0
0039 #if TEST_TRACE
0040 #define DEBUG_TRACE (RTEMS_RTL_TRACE_DETAIL | \
0041 RTEMS_RTL_TRACE_WARNING | \
0042 RTEMS_RTL_TRACE_LOAD | \
0043 RTEMS_RTL_TRACE_UNLOAD | \
0044 RTEMS_RTL_TRACE_SYMBOL | \
0045 RTEMS_RTL_TRACE_RELOC | \
0046 RTEMS_RTL_TRACE_ALLOCATOR | \
0047 RTEMS_RTL_TRACE_UNRESOLVED | \
0048 RTEMS_RTL_TRACE_ARCHIVES | \
0049 RTEMS_RTL_TRACE_DEPENDENCY)
0050 #define DL_DEBUG_TRACE DEBUG_TRACE
0051 #define DL_RTL_CMDS 1
0052 #else
0053 #define DL_DEBUG_TRACE 0
0054 #define DL_RTL_CMDS 0
0055 #endif
0056
0057 static void dl_load_dump (void)
0058 {
0059 #if DL_RTL_CMDS
0060 char* list[] = { "rtl", "list", NULL };
0061 char* sym[] = { "rtl", "sym", NULL };
0062 printf ("RTL List:\n");
0063 rtems_rtl_shell_command (2, list);
0064 printf ("RTL Sym:\n");
0065 rtems_rtl_shell_command (2, sym);
0066 #endif
0067 }
0068
0069 typedef void (*call_t)(void);
0070
0071 int dl_load_test(void)
0072 {
0073 void* handle;
0074 call_t call;
0075 int unresolved;
0076 char* message = "loaded";
0077
0078 printf("About to call arm_mode_func from %s\n", __func__);
0079 arm_mode_func();
0080
0081 #if DL_DEBUG_TRACE
0082 rtems_rtl_trace_set_mask (DL_DEBUG_TRACE);
0083 #endif
0084
0085 printf("load: /dl13-o1.o\n");
0086
0087 handle = dlopen ("/dl13-o1.o", RTLD_NOW | RTLD_GLOBAL);
0088 if (!handle)
0089 {
0090 printf("dlopen failed: %s\n", dlerror());
0091 return 1;
0092 }
0093
0094 if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
0095 message = "dlinfo error checking unresolved status";
0096 else if (unresolved)
0097 message = "has unresolved externals";
0098
0099 printf ("handle: %p %s\n", handle, message);
0100
0101 dl_load_dump ();
0102
0103 call = dlsym (handle, "dl_o1_func");
0104 if (call == NULL)
0105 {
0106 printf("dlsym failed: symbol not found\n");
0107 return 1;
0108 }
0109
0110 printf ("Calling dl_o1_func!\n");
0111 call ();
0112
0113 if (dlclose (handle) < 0)
0114 {
0115 printf("dlclose failed: %s\n", dlerror());
0116 return 1;
0117 }
0118
0119 printf ("handle: %p closed\n", handle);
0120
0121 return 0;
0122 }