diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-10-27 00:04:47 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-10-27 00:04:47 +0000 |
commit | 1ba327bd1c3e895675e7ab504af1064635fdf282 (patch) | |
tree | 615048fb87a55a2421efe353d061d0ded0d8eebf /apps/examples/elf/tests | |
parent | f1c2ce14060e4442dd59f6fa89e02b23c2d3989d (diff) | |
download | px4-nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.tar.gz px4-nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.tar.bz2 px4-nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.zip |
The ELF loader is basically functional (needs more testing)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5265 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/examples/elf/tests')
-rw-r--r-- | apps/examples/elf/tests/Makefile | 46 | ||||
-rw-r--r-- | apps/examples/elf/tests/errno/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/elf/tests/hello/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/elf/tests/longjmp/Makefile | 2 | ||||
-rwxr-xr-x | apps/examples/elf/tests/mksymtab.sh | 50 | ||||
-rw-r--r-- | apps/examples/elf/tests/mutex/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/elf/tests/pthread/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/elf/tests/signal/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/elf/tests/signal/signal.c | 163 | ||||
-rw-r--r-- | apps/examples/elf/tests/struct/Makefile | 4 | ||||
-rw-r--r-- | apps/examples/elf/tests/task/Makefile | 2 |
11 files changed, 140 insertions, 137 deletions
diff --git a/apps/examples/elf/tests/Makefile b/apps/examples/elf/tests/Makefile index c4a0eec4c..f834f6c78 100644 --- a/apps/examples/elf/tests/Makefile +++ b/apps/examples/elf/tests/Makefile @@ -34,35 +34,53 @@ ############################################################################ # Most of these do no build yet -SUBDIRS = errno hello hello++ longjmp mutex pthread signal task struct + +ALL_SUBDIRS = errno hello hello++ longjmp mutex pthread signal task struct +BUILD_SUBDIRS = errno hello task struct + +ifeq ($(CONFIG_HAVE_CXX),y) +BUILD_SUBDIRS += hello++ +endif + +ifeq ($(CONFIG_EXAMPLES_ELF_LONGJMP),y) +BUILD_SUBDIRS += longjmp +endif + +ifneq ($(CONFIG_DISABLE_PTHREAD),y) +BUILD_SUBDIRS += mutex pthread +endif + +ifneq ($(CONFIG_DISABLE_SIGNALS),y) +BUILD_SUBDIRS += signal +endif ELF_DIR = $(APPDIR)/examples/elf TESTS_DIR = $(ELF_DIR)/tests ROMFS_DIR = $(TESTS_DIR)/romfs ROMFS_IMG = $(TESTS_DIR)/romfs.img ROMFS_HDR = $(TESTS_DIR)/romfs.h -ROMFS_DIRLIST = $(TESTS_DIR)/dirlist.h -SYMTAB = $(TESTS_DIR)/symtab.h +DIRLIST_HDR = $(TESTS_DIR)/dirlist.h +SYMTAB_SRC = $(TESTS_DIR)/symtab.c define DIR_template $(1)_$(2): @$(MAKE) -C $(1) $(3) TOPDIR="$(TOPDIR)" APPDIR="$(APPDIR)" ROMFS_DIR="$(ROMFS_DIR)" CROSSDEV=$(CROSSDEV) endef -all: $(ROMFS_HDR) $(ROMFS_DIRLIST) $(SYMTAB) +all: $(ROMFS_HDR) $(DIRLIST_HDR) $(SYMTAB_SRC) .PHONY: all build clean install populate -$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),build, all))) -$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),clean,clean))) -$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),install,install))) +$(foreach DIR, $(BUILD_SUBDIRS), $(eval $(call DIR_template,$(DIR),build, all))) +$(foreach DIR, $(ALL_SUBDIRS), $(eval $(call DIR_template,$(DIR),clean,clean))) +$(foreach DIR, $(BUILD_SUBDIRS), $(eval $(call DIR_template,$(DIR),install,install))) # Build program(s) in each sud-directory -build: $(foreach DIR, $(SUBDIRS), $(DIR)_build) +build: $(foreach DIR, $(BUILD_SUBDIRS), $(DIR)_build) # Install each program in the romfs directory -install: $(foreach DIR, $(SUBDIRS), $(DIR)_install) +install: $(foreach DIR, $(BUILD_SUBDIRS), $(DIR)_install) # Create the romfs directory @@ -85,16 +103,16 @@ $(ROMFS_HDR) : $(ROMFS_IMG) # Create the dirlist.h header file from the romfs directory -$(ROMFS_DIRLIST) : populate +$(DIRLIST_HDR) : populate @$(TESTS_DIR)/mkdirlist.sh $(ROMFS_DIR) >$@ # Create the exported symbol table list from the derived *-thunk.S files -$(SYMTAB): build - @$(TESTS_DIR)/mksymtab.sh $(TESTS_DIR) >$@ +$(SYMTAB_SRC): build + @$(TESTS_DIR)/mksymtab.sh -t varlist.tmp $(ROMFS_DIR) >$@ # Clean each subdirectory -clean: $(foreach DIR, $(SUBDIRS), $(DIR)_clean) - @rm -f $(ROMFS_HDR) $(ROMFS_IMG) $(SYMTAB) +clean: $(foreach DIR, $(ALL_SUBDIRS), $(DIR)_clean) + @rm -f $(ROMFS_HDR) $(ROMFS_IMG) $(SYMTAB_SRC) varlist.tmp @rm -rf $(ROMFS_DIR) diff --git a/apps/examples/elf/tests/errno/Makefile b/apps/examples/elf/tests/errno/Makefile index 3c299b16d..92cff9e12 100644 --- a/apps/examples/elf/tests/errno/Makefile +++ b/apps/examples/elf/tests/errno/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/hello/Makefile b/apps/examples/elf/tests/hello/Makefile index c3a3dacaf..e1c396c3c 100644 --- a/apps/examples/elf/tests/hello/Makefile +++ b/apps/examples/elf/tests/hello/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/longjmp/Makefile b/apps/examples/elf/tests/longjmp/Makefile index d737718e0..0cafe05e3 100644 --- a/apps/examples/elf/tests/longjmp/Makefile +++ b/apps/examples/elf/tests/longjmp/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/mksymtab.sh b/apps/examples/elf/tests/mksymtab.sh index fa1a2d030..56be10f73 100755 --- a/apps/examples/elf/tests/mksymtab.sh +++ b/apps/examples/elf/tests/mksymtab.sh @@ -1,6 +1,24 @@ #!/bin/bash -usage="Usage: %0 <test-dir-path>" +usage="Usage: $0 [-t <tmp-file>] <test-dir-path>" + +# Check for the optional tempory file name + +tmpfile=varlist.tmp +if [ "X${1}" = "X-t" ]; then + shift + tmpfile=$1 + shift + + if [ -z "$tmpfile" ]; then + echo "ERROR: Missing <tmpfile>" + echo "" + echo $usage + exit 1 + fi +fi + +# Check for the required ROMFS directory path dir=$1 if [ -z "$dir" ]; then @@ -17,23 +35,33 @@ if [ ! -d "$dir" ]; then exit 1 fi -varlist=`find $dir -name "*-thunk.S"| xargs grep -h asciz | cut -f3 | sort | uniq` +# Extract all of the undefined symbols from the ELF files and create a +# list of sorted, unique undefined variable names. -echo "#ifndef __EXAMPLES_ELF_TESTS_SYMTAB_H" -echo "#define __EXAMPLES_ELF_TESTS_SYMTAB_H" -echo "" +varlist=`find ${dir} -executable -type f | xargs nm | fgrep ' U ' | sed -e "s/^[ ]*//g" | cut -d' ' -f2 | sort | uniq` + +# Now output the symbol table as a structure in a C source file. All +# undefined symbols are declared as void* types. If the toolchain does +# any kind of checking for function vs. data objects, then this could +# faile + +echo "#include <nuttx/compiler.h>" echo "#include <nuttx/binfmt/symtab.h>" echo "" -echo "static const struct symtab_s exports[] = " + +for var in $varlist; do + echo "extern void *${var};" +done + +echo "" +echo "const struct symtab_s exports[] = " echo "{" -for string in $varlist; do - var=`echo $string | sed -e "s/\"//g"` - echo " {$string, $var}," +for var in $varlist; do + echo " {\"${var}\", &${var}}," done echo "};" -echo "#define NEXPORTS (sizeof(exports)/sizeof(struct symtab_s))" echo "" -echo "#endif /* __EXAMPLES_ELF_TESTS_SYMTAB_H */" +echo "const int nexports = sizeof(exports) / sizeof(struct symtab_s);" diff --git a/apps/examples/elf/tests/mutex/Makefile b/apps/examples/elf/tests/mutex/Makefile index 7f0a5493e..efce216d8 100644 --- a/apps/examples/elf/tests/mutex/Makefile +++ b/apps/examples/elf/tests/mutex/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/pthread/Makefile b/apps/examples/elf/tests/pthread/Makefile index 8db290e6e..134fabe01 100644 --- a/apps/examples/elf/tests/pthread/Makefile +++ b/apps/examples/elf/tests/pthread/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/signal/Makefile b/apps/examples/elf/tests/signal/Makefile index 4338aa48d..08710aeaa 100644 --- a/apps/examples/elf/tests/signal/Makefile +++ b/apps/examples/elf/tests/signal/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/signal/signal.c b/apps/examples/elf/tests/signal/signal.c index 0d2e9e6cc..b40da7a86 100644 --- a/apps/examples/elf/tests/signal/signal.c +++ b/apps/examples/elf/tests/signal/signal.c @@ -38,6 +38,7 @@ ****************************************************************************/ #include <sys/types.h> + #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -66,22 +67,7 @@ static int sigusr2_rcvd = 0; ****************************************************************************/ /**************************************************************************** - * Name: sigusr1_sighandler - ****************************************************************************/ - -/* NOTE: it is necessary for functions that are referred to by function pointers - * pointer to be declared with global scope (at least for ARM). Otherwise, - * a relocation type that is not supported by ELF is generated by GCC. - */ - -void sigusr1_sighandler(int signo) -{ - printf("sigusr1_sighandler: Received SIGUSR1, signo=%d\n", signo); - sigusr1_rcvd = 1; -} - -/**************************************************************************** - * Name: sigusr2_sigaction + * Name: siguser_action ***************************************************************************/ /* NOTE: it is necessary for functions that are referred to by function pointers @@ -89,50 +75,33 @@ void sigusr1_sighandler(int signo) * a relocation type that is not supported by ELF is generated by GCC. */ -#ifdef __USE_POSIX199309 -void sigusr2_sigaction(int signo, siginfo_t *siginfo, void *arg) +void siguser_action(int signo, siginfo_t *siginfo, void *arg) { - printf("sigusr2_sigaction: Received SIGUSR2, signo=%d siginfo=%p arg=%p\n", + printf("siguser_action: Received signo=%d siginfo=%p arg=%p\n", signo, siginfo, arg); -#ifdef HAVE_SIGQUEUE + if (signo == SIGUSR1) + { + printf(" SIGUSR1 received\n"); + sigusr2_rcvd = 1; + } + else if (signo == SIGUSR2) + { + printf(" SIGUSR2 received\n"); + sigusr1_rcvd = 2; + } + else + { + printf(" ERROR: Unexpected signal\n"); + } + if (siginfo) { + printf("siginfo:\n"); printf(" si_signo = %d\n", siginfo->si_signo); - printf(" si_errno = %d\n", siginfo->si_errno); printf(" si_code = %d\n", siginfo->si_code); - printf(" si_pid = %d\n", siginfo->si_pid); - printf(" si_uid = %d\n", siginfo->si_uid); - printf(" si_status = %d\n", siginfo->si_status); - printf(" si_utime = %ld\n", (long)siginfo->si_utime); - printf(" si_stime = %ld\n", (long)siginfo->si_stime); printf(" si_value = %d\n", siginfo->si_value.sival_int); - printf(" si_int = %d\n", siginfo->si_int); - printf(" si_ptr = %p\n", siginfo->si_ptr); - printf(" si_addr = %p\n", siginfo->si_addr); - printf(" si_band = %ld\n", siginfo->si_band); - printf(" si_fd = %d\n", siginfo->si_fd); } -#endif - sigusr2_rcvd = 1; -} -#else -void sigusr2_sigaction(int signo) -{ - printf("sigusr2_sigaction: Received SIGUSR2, signo=%d\n", signo); - sigusr2_rcvd = 1; -} - -#endif - -/**************************************************************************** - * Name: sigusr2_sighandler - ****************************************************************************/ - -static void sigusr2_sighandler(int signo) -{ - printf("sigusr2_sighandler: Received SIGUSR2, signo=%d\n", signo); - sigusr2_rcvd = 1; } /**************************************************************************** @@ -146,39 +115,36 @@ static void sigusr2_sighandler(int signo) int main(int argc, char **argv) { struct sigaction act; - struct sigaction oact; - void (*old_sigusr1_sighandler)(int signo); - void (*old_sigusr2_sighandler)(int signo); + struct sigaction oact1; + struct sigaction oact2; pid_t mypid = getpid(); -#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE) - sigval_t sigval; -#endif + union sigval sigval; int status; printf("Setting up signal handlers from pid=%d\n", mypid); - /* Set up so that sigusr1_sighandler will respond to SIGUSR1 */ + /* Set up so that siguser_action will respond to SIGUSR1 */ - old_sigusr1_sighandler = signal(SIGUSR1, sigusr1_sighandler); - if (old_sigusr1_sighandler == SIG_ERR) + memset(&act, 0, sizeof(struct sigaction)); + act.sa_sigaction = siguser_action; + act.sa_flags = SA_SIGINFO; + + (void)sigemptyset(&act.sa_mask); + + status = sigaction(SIGUSR1, &act, &oact1); + if (status != 0) { fprintf(stderr, "Failed to install SIGUSR1 handler, errno=%d\n", errno); - exit(1); + exit(2); } - printf("Old SIGUSR1 sighandler at %p\n", old_sigusr1_sighandler); - printf("New SIGUSR1 sighandler at %p\n", sigusr1_sighandler); - - /* Set up so that sigusr2_sigaction will respond to SIGUSR2 */ - - memset(&act, 0, sizeof(struct sigaction)); - act.sa_sigaction = sigusr2_sigaction; - act.sa_flags = SA_SIGINFO; + printf("Old SIGUSR1 sighandler at %p\n", oact1.sa_handler); + printf("New SIGUSR1 sighandler at %p\n", siguser_action); - (void)sigemptyset(&act.sa_mask); + /* Set up so that siguser_action will respond to SIGUSR2 */ - status = sigaction(SIGUSR2, &act, &oact); + status = sigaction(SIGUSR2, &act, &oact2); if (status != 0) { fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n", @@ -186,18 +152,19 @@ int main(int argc, char **argv) exit(2); } - printf("Old SIGUSR2 sighandler at %p\n", oact.sa_handler); - printf("New SIGUSR2 sighandler at %p\n", sigusr2_sigaction); - printf("Raising SIGUSR1 from pid=%d\n", mypid); + printf("Old SIGUSR2 sighandler at %p\n", oact2.sa_handler); + printf("New SIGUSR2 sighandler at %p\n", siguser_action); + printf("Raising SIGUSR1 from pid=%d\n", mypid); fflush(stdout); usleep(SHORT_DELAY); - /* Send SIGUSR1 to ourselves via raise() */ + /* Send SIGUSR1 to ourselves via kill() */ - status = raise(SIGUSR1); + printf("Kill-ing SIGUSR1 from pid=%d\n", mypid); + status = kill(0, SIGUSR1); if (status != 0) { - fprintf(stderr, "Failed to raise SIGUSR1, errno=%d\n", errno); + fprintf(stderr, "Failed to kill SIGUSR1, errno=%d\n", errno); exit(3); } @@ -211,14 +178,14 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR1 not received\n"); exit(4); } + sigusr1_rcvd = 0; /* Send SIGUSR2 to ourselves */ - printf("Killing SIGUSR2 from pid=%d\n", mypid); + printf("sigqueue-ing SIGUSR2 from pid=%d\n", mypid); fflush(stdout); usleep(SHORT_DELAY); -#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE) /* Send SIGUSR2 to ourselves via sigqueue() */ sigval.sival_int = 87; @@ -230,20 +197,8 @@ int main(int argc, char **argv) } usleep(SHORT_DELAY); - printf("SIGUSR2 queued from pid=%d, sigval=97\n", mypid); -#else - /* Send SIGUSR2 to ourselves via kill() */ - - status = kill(mypid, SIGUSR2); - if (status != 0) - { - fprintf(stderr, "Failed to kill SIGUSR2, errno=%d\n", errno); - exit(5); - } + printf("SIGUSR2 queued from pid=%d, sigval=87\n", mypid); - usleep(SHORT_DELAY); - printf("SIGUSR2 killed from pid=%d\n", mypid); -#endif /* Verify that SIGUSR2 was received */ if (sigusr2_rcvd == 0) @@ -251,32 +206,33 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR2 not received\n"); exit(6); } + sigusr2_rcvd = 0; - /* Remove the sigusr2_sigaction handler and replace the SIGUSR2 + /* Remove the siguser_action handler and replace the SIGUSR2 * handler with sigusr2_sighandler. */ printf("Resetting SIGUSR2 signal handler from pid=%d\n", mypid); - old_sigusr2_sighandler = signal(SIGUSR2, sigusr2_sighandler); - if (old_sigusr2_sighandler == SIG_ERR) + status = sigaction(SIGUSR2, &oact2, &act); + if (status != 0) { - fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n", + fprintf(stderr, "Failed to install SIGUSR1 handler, errno=%d\n", errno); - exit(7); + exit(2); } - printf("Old SIGUSR2 sighandler at %p\n", old_sigusr2_sighandler); - printf("New SIGUSR2 sighandler at %p\n", sigusr2_sighandler); + printf("Old SIGUSR1 sighandler at %p\n", act.sa_handler); + printf("New SIGUSR1 sighandler at %p\n", oact1.sa_handler); - /* Verify that the handler that was removed was sigusr2_sigaction */ + /* Verify that the handler that was removed was siguser_action */ - if ((void*)old_sigusr2_sighandler != (void*)sigusr2_sigaction) + if ((void*)act.sa_handler != (void*)siguser_action) { fprintf(stderr, - "Old SIGUSR2 signhanlder (%p) is not sigusr2_sigation (%p)\n", - old_sigusr2_sighandler, sigusr2_sigaction); + "Old SIGUSR2 signal handler (%p) is not siguser_action (%p)\n", + act.sa_handler, siguser_action); exit(8); } @@ -302,6 +258,7 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR2 not received\n"); exit(10); } + sigusr2_rcvd = 0; return 0; diff --git a/apps/examples/elf/tests/struct/Makefile b/apps/examples/elf/tests/struct/Makefile index c15d8fc47..3aa0e4a57 100644 --- a/apps/examples/elf/tests/struct/Makefile +++ b/apps/examples/elf/tests/struct/Makefile @@ -36,7 +36,7 @@ -include $(TOPDIR)/.config -include $(TOPDIR)/Make.defs -CFLAGS += -I. +CELFFLAGS += -I. BIN = struct SRCS = struct_main.c struct_dummy.c @@ -46,7 +46,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" diff --git a/apps/examples/elf/tests/task/Makefile b/apps/examples/elf/tests/task/Makefile index 208b228b3..63a2eb211 100644 --- a/apps/examples/elf/tests/task/Makefile +++ b/apps/examples/elf/tests/task/Makefile @@ -45,7 +45,7 @@ all: $(BIN) $(OBJS): %.o: %.c @echo "CC: $<" - @$(CC) -c $(CFLAGS) $< -o $@ + @$(CC) -c $(CELFFLAGS) $< -o $@ $(BIN): $(OBJS) @echo "LD: $<" |