<div dir="ltr"><div><div><div><div><div>Hello,<br><br></div>I'm trying to run my app that uses dynamic linking via WAF (I've tried the same app via OMK and it's working). Even though the dynamic module (hello.o) loads successfully (have double checked with RTEMS shell too), it has unresolved symbols issue after a call to:<br>dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved)<br><br></div>Here is my code (<b>init.c</b>):<br><br>#include <rtems.h><br>#include <stdlib.h><br>#include <stdio.h><br>#include <sys/types.h><br><br>#include <rtems/printer.h><br><br>#include <dlfcn.h><br><br>#include <rtems/rtl/rtl.h><br>#include <rtems/untar.h><br><br>#include <rtems/imfs.h><br><br>#include <rtems/shellconfig.h><br>#include <rtems/monitor.h><br>#include <rtems/shell.h><br><br>extern int _binary_dl_tar_start;<br>extern int _binary_dl_tar_size;<br><br>typedef int (*call_t)();<br><br>static void expand_rootfs_tarfile(void)<br>{<br>  rtems_status_code sc;<br>  rtems_printer     printer;<br>  rtems_print_printer_printf(&printer);<br>  sc = Untar_FromMemory_Print((void *)(&_binary_dl_tar_start),<br>                              (size_t)&_binary_dl_tar_size,<br>                              &printer);<br>  if (sc != RTEMS_SUCCESSFUL)<br>    fprintf(stderr, "error: untar failed: %s\n",<br>            rtems_status_text(sc));<br>}<br><br>rtems_task Init(<br>  rtems_task_argument ignored<br>)<br>{<br>  call_t hellooo;<br>  int    unresolved;<br><br>  expand_rootfs_tarfile();<br><br>  void* handle = dlopen ("hello.o", RTLD_NOW | RTLD_GLOBAL);<br>  if (!handle)<br>  {<br>    printf("dlopen failed: %s\n", dlerror());<br>    exit(1);<br>  }<br>  printf ("handle: %p \n", handle);<br><br>  if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)<br>    printf ("dlinfo failed\n");<br>  else if (unresolved)<br>    printf ("unresolved externals\n");<br><br>  hellooo = dlsym (handle, "hello");<br>  if (hellooo == NULL)<br>  {<br>    printf("dlsym failed: symbol not found\n");<br>    exit(1);<br>  }<br>  hellooo();<br>  printf ("___\n");<br><br>  if (dlclose (handle) < 0)<br>  {<br>    printf("dlclose failed: %s\n", dlerror());<br>    exit(1);<br>  }<br><br>  printf ("handle: %p closed\n", handle);<br><br>  exit(0);<br>}<br><br>/* configuration information */<br><br>#include <bsp.h><br><br>#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32<br>#define CONFIGURE_MAXIMUM_TASKS 4<br>#define CONFIGURE_MINIMUM_TASK_STACK_SIZE (8U * 1024U)<br>#define CONFIGURE_EXTRA_TASK_STACKS (8 * 1024)<br>#define CONFIGURE_MAXIMUM_POSIX_KEYS             16<br>#define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS  16<br><br>#define CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER<br>#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER<br>#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM<br>#define CONFIGURE_FILESYSTEM_DOSFS<br>#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER<br>#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER<br>#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK // for rtems shell.<br><br>#define CONFIGURE_INIT_TASK_PRIORITY    100<br>#define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \<br>                                           RTEMS_NO_TIMESLICE | \<br>                                           RTEMS_NO_ASR | \<br>                                           RTEMS_INTERRUPT_LEVEL(0))<br><br>#define CONFIGURE_RTEMS_INIT_TASKS_TABLE<br><br>#define CONFIGURE_INIT<br>#include <rtems/confdefs.h><br><br><br><br></div><b>hello.c</b>:<br>#include <stdio.h><br>#include <stdlib.h><br><br>int hello ()<br>{<br>  printf("\n\n*** HELLO WORLD ***\n");<br>  printf("Hello World\n");<br>  printf("*** END OF HELLO WORLD ***\n");<br>  return 0;<br>}<br><br><br></div><b>wscript</b> (I manually copied hello.o from o-optimiezed to where wscript file lies):<br>import rtems_waf.rtems as rtems<br><br>def init(ctx):<br>    rtems.init(ctx)<br><br>def options(opt):<br>    rtems.options(opt)<br><br>def configure(conf):<br>    rtems.configure(conf)<br><br>def build(bld):<br>    rtems.build(bld)<br>    <br>    rtems.root_filesystem(bld, 'dl',<br>        ['hello.o'],<br>        'dl.tar', 'dl-tar.o')<br><br><br><br></div><b>Makefile</b>:<br>#<br>#  RTEMS_MAKEFILE_PATH is typically set in an environment variable<br>#<br><br>PGM=${ARCH}/dl.exe<br><br># optional managers required<br>MANAGERS=all<br><br># C source names<br>CSRCS = init.c hello.c<br>COBJS = $(CSRCS:%.c=${ARCH}/%.o)<br>COBJS += build/i386-rtems4.12-pc386/dl-tar.o<br><br>include $(RTEMS_MAKEFILE_PATH)/Makefile.inc<br>include $(RTEMS_CUSTOM)<br>include $(PROJECT_ROOT)/make/leaf.cfg<br><br>OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)<br><br>all:    ${ARCH} $(PGM)<br><br>$(PGM): $(OBJS)<br>    $(make-exe)<br><br><div><br></div><div><br></div><div><b>qemu's output:<br></b>qemu-system-i386 -kernel o-optimize/dl.exe -append "--console=/dev/com1" -serial stdio<br>i386: isr=0 irr=1<br>untar: memory at 0x14b244 (10240)<br>untar: file: hello.o (8000)<br>handle: 0x16ed04 <br>unresolved externals<br><br>FATAL ERROR - Executive shutdown! Any key to reboot...qemu: terminating on signal 2<br>s<br></div><div><br></div><div>What is this error about and what am I doing wrong?<br><br></div><div>Best Regards,<br></div><div>Saeed<br></div></div>