summaryrefslogtreecommitdiff
path: root/libbsd/libdl/dl_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbsd/libdl/dl_main.c')
-rw-r--r--libbsd/libdl/dl_main.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/libbsd/libdl/dl_main.c b/libbsd/libdl/dl_main.c
new file mode 100644
index 0000000..70e23fe
--- /dev/null
+++ b/libbsd/libdl/dl_main.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2018 Chris Johns <chrisj@rtems.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <dlfcn.h>
+
+#include <rtems.h>
+#include <rtems/rtl/rtl-shell.h>
+#include <rtems/rtl/rtl-trace.h>
+#include <rtems/untar.h>
+
+#include "libbsd-dl-rootfs-tar.h"
+
+#define EXAMPLE_NAME "LIBBSD LIBDL 1"
+
+#define ARCHIVE_TRACE (RTEMS_RTL_TRACE_DETAIL | \
+ RTEMS_RTL_TRACE_WARNING | \
+ RTEMS_RTL_TRACE_LOAD | \
+ RTEMS_RTL_TRACE_UNLOAD | \
+ RTEMS_RTL_TRACE_SYMBOL | \
+ RTEMS_RTL_TRACE_RELOC | \
+ RTEMS_RTL_TRACE_ALLOCATOR | \
+ RTEMS_RTL_TRACE_UNRESOLVED | \
+ RTEMS_RTL_TRACE_ARCHIVES | \
+ RTEMS_RTL_TRACE_DEPENDENCY)
+#define EXAMPLE_DEBUG_TRACE ARCHIVE_TRACE
+
+#define TARFILE_START libbsd_dl_rootfs_tar
+#define TARFILE_SIZE libbsd_dl_rootfs_tar_size
+
+typedef int (*call_sig)(void);
+
+static void
+dl_load_dump (void)
+{
+#if LIBDL01_CMDS
+ char* list[] = { "rtl", "list", NULL };
+ char* sym[] = { "rtl", "sym", NULL };
+ printf ("RTL List:\n");
+ rtems_rtl_shell_command (2, list);
+ printf ("RTL Sym:\n");
+ rtems_rtl_shell_command (2, sym);
+#endif
+}
+
+static void
+example_fatal_error (void)
+{
+ rtems_status_code sc = rtems_task_wake_after( 3 );
+ assert(sc == RTEMS_SUCCESSFUL);
+ assert( 0 );
+}
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ const char* name = "dl_libbsd.o";
+ void* handle;
+ int unresolved = 0;
+ call_sig call;
+ int te;
+
+ puts( "\n\nExample: " EXAMPLE_NAME );
+
+ te = Untar_FromMemory((void *)TARFILE_START, (size_t)TARFILE_SIZE);
+ if (te != 0)
+ {
+ printf("untar failed: %d\n", te);
+ example_fatal_error();
+ }
+
+#if EXAMPLE_DEBUG_TRACE
+ rtems_rtl_trace_set_mask (EXAMPLE_DEBUG_TRACE);
+#endif
+
+ printf("load: %s\n", name);
+
+ handle = dlopen (name, RTLD_NOW | RTLD_GLOBAL);
+ if (handle == NULL)
+ {
+ printf("error: loading %s failed: %s\n", name, dlerror ());
+ example_fatal_error ();
+ }
+
+ printf ("handle: %p loaded\n", handle);
+
+ if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) != 0)
+ {
+ printf ("error: cannot get module's unresolved status\n");
+ example_fatal_error ();
+ }
+
+ printf ("unresolved: %p: %s \n", handle, unresolved == 0 ? "resolved" : "UNRESOLVED");
+
+ if (unresolved != 0)
+ {
+ printf ("error: module has unresolved externals\n");
+ example_fatal_error ();
+ }
+
+ call = dlsym (handle, "rtems_main");
+ if (call == NULL)
+ {
+ printf ("error: cannot find symbol: rtems_main\n");
+ example_fatal_error ();
+ }
+
+ call ();
+
+ if (dlclose (handle) != 0)
+ {
+ printf ("error: unloading %s failed: %d\n", name, dlerror ());
+ example_fatal_error ();
+ }
+}
+
+/*
+ * Configure RTEMS.
+ */
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
+
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+
+#define CONFIGURE_UNLIMITED_ALLOCATION_SIZE 32
+#define CONFIGURE_UNLIMITED_OBJECTS
+#define CONFIGURE_UNIFIED_WORK_AREAS
+
+#define CONFIGURE_STACK_CHECKER_ENABLED
+
+#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (64 * 1024)
+#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 4
+#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (1 * 1024 * 1024)
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT_TASK_STACK_SIZE (32 * 1024)
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>