More ELF loader changes

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5261 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-10-25 22:10:56 +00:00
parent 9358ec5a1f
commit 90d055bbfa
13 changed files with 93 additions and 19 deletions

View File

@ -297,6 +297,53 @@ examples/discover
CONFIG_EXAMPLES_DISCOVER_DRIPADDR - Router IP address
CONFIG_EXAMPLES_DISCOVER_NETMASK - Network Mask
examples/elf
^^^^^^^^^^^^
This example builds a small ELF loader test case. This includes several
test programs under examples/elf tests. These tests are build using
the relocatable ELF format and installed in a ROMFS file system. At run time,
each program in the ROMFS file system is executed. Requires CONFIG_ELF.
Other configuration options:
CONFIG_EXAMPLES_ELF_DEVMINOR - The minor device number of the ROMFS block.
For example, the N in /dev/ramN. Used for registering the RAM block driver
that will hold the ROMFS file system containing the ELF executables to be
tested. Default: 0
CONFIG_EXAMPLES_ELF_DEVPATH - The path to the ROMFS block driver device. This
must match EXAMPLES_ELF_DEVMINOR. Used for registering the RAM block driver
that will hold the ROMFS file system containing the ELF executables to be
tested. Default: "/dev/ram0"
NOTES:
1. Your top-level nuttx/Make.defs file must include an approproate definition,
LDELFFLAGS, to generate a relocatable ELF object. With GNU LD, this should
include '-r' and '-e main' (or _main on some platforms).
LDELFFLAGS = -r -e main
If you use GCC to link, you make also need to include '-nostdlib' or
'-nostartfiles' and '-nodefaultlibs'.
2. This example also requires genromfs. genromfs can be build as part of the
nuttx toolchain. Or can built from the genromfs sources that can be found
at misc/tools/genromfs-0.5.2.tar.gz. In any event, the PATH variable must
include the path to the genromfs executable.
3. ELF size: The ELF files in this example are, be default, quite large
because they include a lot of "build garbage". You can greately reduce the
size of the ELF binaries are using the objcopy --strip-unneeded command to
remove un-necessary information from the ELF files.
4. Simulator. You cannot use this example with the the NuttX simulator on
Cygwin. That is because the Cygwin GCC does not generate ELF file but
rather some Windows-native binary format.
If you really want to do this, you can create a NuttX x86 buildroot toolchain
and use that be build the ELF executables for the ROMFS file system.
examples/ftpc
^^^^^^^^^^^^^

View File

@ -10,4 +10,20 @@ config EXAMPLES_ELF
Enable the ELF loader example
if EXAMPLES_ELF
config EXAMPLES_ELF_DEVMINOR
int "ROMFS Minor Device Number"
default 0
---help---
The minor device number of the ROMFS block. For example, the N in /dev/ramN.
Used for registering the RAM block driver that will hold the ROMFS file system
containing the ELF executables to be tested. Default: 0
config EXAMPLES_ELF_DEVPATH
string "ROMFS Devie Path"
default "/dev/ram0"
---help---
The path to the ROMFS block driver device. This must match EXAMPLES_ELF_DEVMINOR.
Used for registering the RAM block driver that will hold the ROMFS file system
containing the ELF executables to be tested. Default: "/dev/ram0"
endif

View File

@ -61,7 +61,7 @@ ROOTDEPPATH = --dep-path .
VPATH =
all: .built
.PHONY: headers clean depend disclean
.PHONY: headers clean_tests clean depend disclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
@ -72,7 +72,7 @@ $(COBJS): %$(OBJEXT): %.c
headers:
@$(MAKE) -C tests TOPDIR="$(TOPDIR)" APPDIR="$(APPDIR)" CROSSDEV=$(CROSSDEV)
.built: $(OBJS)
.built: headers $(OBJS)
@( for obj in $(OBJS) ; do \
$(call ARCHIVE, $(BIN), $${obj}); \
done ; )
@ -88,7 +88,10 @@ context:
depend: .depend
clean:
clean_tests:
@$(MAKE) -C tests TOPDIR="$(TOPDIR)" APPDIR="$(APPDIR)" CROSSDEV=$(CROSSDEV) clean
clean: clean_tests
@rm -f *.o *~ .*.swp .built
$(call CLEAN)

View File

@ -89,9 +89,16 @@
#define SECTORSIZE 512
#define NSECTORS(b) (((b)+SECTORSIZE-1)/SECTORSIZE)
#define ROMFSDEV "/dev/ram0"
#define MOUNTPT "/mnt/romfs"
#ifndef CONFIG_EXAMPLES_ELF_DEVMINOR
# define CONFIG_EXAMPLES_ELF_DEVMINOR 0
#endif
#ifndef CONFIG_EXAMPLES_ELF_DEVPATH
# define CONFIG_EXAMPLES_ELF_DEVPATH "/dev/ram0"
#endif
/* If CONFIG_DEBUG is enabled, use dbg instead of printf so that the
* output will be synchronous with the debug output.
*/
@ -166,8 +173,9 @@ int elf_main(int argc, char *argv[])
/* Create a ROM disk for the ROMFS filesystem */
message("Registering romdisk\n");
ret = romdisk_register(0, romfs_img, NSECTORS(romfs_img_len), SECTORSIZE);
message("Registering romdisk at /dev/ram%d\n", CONFIG_EXAMPLES_ELF_DEVMINOR);
ret = romdisk_register(CONFIG_EXAMPLES_ELF_DEVMINOR, romfs_img,
NSECTORS(romfs_img_len), SECTORSIZE);
if (ret < 0)
{
err("ERROR: romdisk_register failed: %d\n", ret);
@ -178,13 +186,13 @@ int elf_main(int argc, char *argv[])
/* Mount the file system */
message("Mounting ROMFS filesystem at target=%s with source=%s\n",
MOUNTPT, ROMFSDEV);
MOUNTPT, CONFIG_EXAMPLES_ELF_DEVPATH);
ret = mount(ROMFSDEV, MOUNTPT, "romfs", MS_RDONLY, NULL);
ret = mount(CONFIG_EXAMPLES_ELF_DEVPATH, MOUNTPT, "romfs", MS_RDONLY, NULL);
if (ret < 0)
{
err("ERROR: mount(%s,%s,romfs) failed: %s\n",
ROMFSDEV, MOUNTPT, errno);
CONFIG_EXAMPLES_ELF_DEVPATH, MOUNTPT, errno);
elf_uninitialize();
}
@ -219,6 +227,6 @@ int elf_main(int argc, char *argv[])
sleep(4);
}
message("End-of-Test.. Exit-ing\n");
message("End-of-Test.. Exiting\n");
return 0;
}

View File

@ -39,7 +39,7 @@
BIN = errno
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -64,7 +64,7 @@ all: $(BIN1) $(BIN2) $(BIN3) $(BIN4)
$(OBJS): %.o: %.cpp
@echo "CC: $<"
@$(CXX) -c $(CXXPICFLAGS) $< -o $@
@$(CXX) -c $(CXXFLAGS) $< -o $@
# This contains libstdc++ stubs to that you can build C++ code
# without actually having libstdc++

View File

@ -39,7 +39,7 @@
BIN = hello
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -39,7 +39,7 @@
BIN = longjmp
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -39,7 +39,7 @@
BIN = mutex
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -39,7 +39,7 @@
BIN = pthread
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -39,7 +39,7 @@
BIN = signal
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)

View File

@ -38,7 +38,7 @@
CFLAGS += -I.
BIN = struct
BIN = struct
SRCS = struct_main.c struct_dummy.c
OBJS = $(SRCS:.c=.o)

View File

@ -39,7 +39,7 @@
BIN = task
SRCS = $(BIN).c
OBJS = $(BIN:.c=.o)
OBJS = $(SRCS:.c=.o)
all: $(BIN)