From ae5fe7e6bca2874c5f1ef077204bb63124fb3db3 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Sun, 26 Oct 2014 18:09:41 -0700 Subject: cpukit: Add libdl with the Runtime Loader (RTL) code. This is a merge of the RTL project. --- testsuites/libtests/dl01/dl-load.c | 77 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 testsuites/libtests/dl01/dl-load.c (limited to 'testsuites/libtests/dl01/dl-load.c') diff --git a/testsuites/libtests/dl01/dl-load.c b/testsuites/libtests/dl01/dl-load.c new file mode 100644 index 0000000000..cd63cc5953 --- /dev/null +++ b/testsuites/libtests/dl01/dl-load.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2014 Chris Johns . All rights reserved. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include + +#include + +#include "dl-load.h" + +typedef int (*call_t)(int argc, char* argv[]); + + +static const char* call_1[] = { "Line 1", "Line 2" }; +static const char* call_2[] = { "Call 2, line 1", + "Call 2, line 2", + "Call 2, line 3" }; + +int dl_load_test(void) +{ + void* handle; + call_t call; + int call_ret; + int unresolved; + char* message = "loaded"; + + printf("load: /dl-o1.o\n"); + + handle = dlopen ("/dl-o1.o", RTLD_NOW | RTLD_GLOBAL); + if (!handle) + { + printf("dlopen failed: %s\n", dlerror()); + return 1; + } + + if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0) + message = "dlinfo error checking unresolved status"; + else if (unresolved) + message = "has unresolved externals"; + + printf ("handle: %p %s\n", handle, message); + + call = dlsym (handle, "rtems_main"); + if (call == NULL) + { + printf("dlsym failed: symbol not found\n"); + return 1; + } + + call_ret = call (2, call_1); + if (call_ret != 2) + { + printf("dlsym call failed: ret value bad\n"); + return 1; + } + + call_ret = call (3, call_2); + if (call_ret != 3) + { + printf("dlsym call failed: ret value bad\n"); + return 1; + } + + if (dlclose (handle) < 0) + { + printf("dlclose failed: %s\n", dlerror()); + return 1; + } + + printf ("handle: %p closed\n", handle); + + return 0; +} -- cgit v1.2.3