Pavel, thanks for the excellent detail provided. I will try and expand on a couple of parts being discussed.

On 27/07/2016 10:00, Pavel Pisa wrote:
On Wednesday 27 of July 2016 01:01:29 Saeed Ehteshamifar wrote:
1. How to generate *tar* array? Since on top of dl-tar.c it's been noted
that it's automatically generated. If I'm not wrong, by making a tar image,
RTEMS puts all binary objects within a single tar file and calls them
dynamically at run-time, right?

I am not sure at this moment, how it is done by mainline samples makefiles
but simplified command sequence from my examples follows.


The rtems_waf support (https://git.rtems.org/chrisj/rtems_waf.git/) now provides a simple way to add files via an embedded tar file to an executable. You can:

  rtems.root_filesystem(bld, 'rootfs',
                        ['etc/rc.conf',
                         'x',
                         'y',
                         'z'],
                        'rootfs.tar', 'rootfs-tar.o')

Just add 'rootfs-tar.o' to list of source to link. Add code to your application to untar the files:

 extern int _binary_rootfs_tar_start;
 extern int _binary_rootfs_tar_size;

 static void
 expand_rootfs_tarfile(void)
 {
   rtems_status_code sc;
   rtems_printer     printer;
   rtems_print_printer_printf(&printer);
   sc = Untar_FromMemory_Print((void *)(&_binary_rootfs_tar_start),
                               (size_t)&_binary_rootfs_tar_size,
                               &printer);
   if (sc != RTEMS_SUCCESSFUL)
     fprintf(stderr, "error: untar failed: %s\n",
             rtems_status_text(sc));
 }

2. What's the difference between dl01.exe and dl01.pre? Both are executable
but running dl01.pre leads to "unresolved externals" and the execution
hangs.

You need to link list of symbols to the base executable image
to inform runtime linker which symbols are available.

There are two ways you can manage symbols and it depends on your system architecture and available services in your running target.

You can embed the symbols in the base image. To do this you need two link passes. The first link pass brings the executable together so you can get a list of symbols. This is used to create a symbol table you add to the second link pass. The way the symbol table is created and linked allows it to adjust to a different memory map created by the second link pass.

The second method is loading an external symbol table. This is a single link process and again you create a symbols object file which is external. Instead of a 2nd phase of linking you simply make the symbol's object file available to the running target and you dynamically load it before any other modules. In this case the symbol addresses are fixed to the addresses in the executable.

An example of an embedded symbol table is a target that does not have a flash file system or a network to load external symbols. It is also used when you do not want to have to configuration control the kernel image and the symbols. The two link passes added complexity to your build system.

An example of external symbols is a team development environment where a boot loader such as iPXE or uboot loads a kernel from the network and you load the symbols via the network as well. When you move to a production build the symbols are loaded into a local file system.

Chris
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to