diff --git a/ChangeLog.txt b/ChangeLog.txt index cb47161df..cf8de35eb 100755 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1405,4 +1405,11 @@ * system/netdb: Failed to build if CONFIG_NET_HOSTFILE was not defined because gethostbyaddr() was not available. Noted by OrbitalFox (2015-08-21). + * apps/system/symtab: Optional canned symtab inclusion to the build. When + option CONFIG_SYSTEM_SYMTAB is selected and symbol table file + libc/symtab/canned_symtab.inc is prepared then application can + use system provided complete symbol table. The option has + substantial effect on system image size. Mainly code/text. If + loading of applications at runtime is not planned do not select + this. From Pavel Pisa (2015-08-23). diff --git a/include/symtab.h b/include/symtab.h new file mode 100644 index 000000000..c1d59c51d --- /dev/null +++ b/include/symtab.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * apps/include/symtab.h + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __APPS_INCLUDE_SYMTAB_H +#define __APPS_INCLUDE_SYMTAB_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* struct symbtab_s describes one entry in the symbol table. A symbol table + * is a fixed size array of struct symtab_s. The information is intentionally + * minimal and supports only: + * + * 1. Function pointers as sym_values. Of other kinds of values need to be + * supported, then typing information would also need to be included in + * the structure. + * + * 2. Fixed size arrays. There is no explicit provisional for dynamically + * adding or removing entries from the symbol table (realloc might be + * used for that purpose if needed). The intention is to support only + * fixed size arrays completely defined at compilation or link time. + */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: symtab_initialize + * + * Description: + * Setup a user provided symbol table. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void symtab_initialize(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __APPS_INCLUDE_SYMTAB_H */ + diff --git a/system/Kconfig b/system/Kconfig index 1d32f3a7e..a7fae6f7e 100644 --- a/system/Kconfig +++ b/system/Kconfig @@ -25,6 +25,7 @@ source "$APPSDIR/system/sudoku/Kconfig" source "$APPSDIR/system/lm75/Kconfig" source "$APPSDIR/system/vi/Kconfig" source "$APPSDIR/system/stackmonitor/Kconfig" +source "$APPSDIR/system/symtab/Kconfig" source "$APPSDIR/system/cdcacm/Kconfig" source "$APPSDIR/system/composite/Kconfig" source "$APPSDIR/system/usbmsc/Kconfig" diff --git a/system/Make.defs b/system/Make.defs index c7acecd61..b818a9709 100644 --- a/system/Make.defs +++ b/system/Make.defs @@ -114,6 +114,10 @@ ifeq ($(CONFIG_SYSTEM_STACKMONITOR),y) CONFIGURED_APPS += system/stackmonitor endif +ifeq ($(CONFIG_SYSTEM_SYMTAB),y) +CONFIGURED_APPS += system/symtab +endif + ifeq ($(CONFIG_SYSTEM_USBMSC),y) CONFIGURED_APPS += system/usbmsc endif diff --git a/system/Makefile b/system/Makefile index f23bbfdcb..a5ba4e506 100644 --- a/system/Makefile +++ b/system/Makefile @@ -39,7 +39,7 @@ SUBDIRS = cdcacm cle composite cu flash_eraseall free i2c hex2bin inifile SUBDIRS += install lm75 mdio netdb nxplayer ramtest ramtron readline sdcard -SUBDIRS += stackmonitor sudoku usbmonitor usbmsc vi zmodem zoneinfo +SUBDIRS += stackmonitor sudoku symtab usbmonitor usbmsc vi zmodem zoneinfo # Create the list of installed runtime modules (INSTALLED_DIRS) diff --git a/system/symtab/.gitignore b/system/symtab/.gitignore new file mode 100644 index 000000000..83bd7b811 --- /dev/null +++ b/system/symtab/.gitignore @@ -0,0 +1,11 @@ +/Make.dep +/.depend +/.built +/*.asm +/*.rel +/*.lst +/*.sym +/*.adb +/*.lib +/*.src +/*.obj diff --git a/system/symtab/Kconfig b/system/symtab/Kconfig new file mode 100644 index 000000000..ac83a48fa --- /dev/null +++ b/system/symtab/Kconfig @@ -0,0 +1,15 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config SYSTEM_SYMTAB + bool "User-provided symbol table" + default n + depends on EXECFUNCS_HAVE_SYMTAB && LIB_BOARDCTL + select BOARDCTL_SYMTAB + ---help--- + Build and include default symbol table in the NuttX application. + The symbol table is selected by call symtab_initialize(). The + table apps/system/symtab/symtab.inc has to be generated using + mksymtab manually before this option is selected. diff --git a/system/symtab/Makefile b/system/symtab/Makefile new file mode 100644 index 000000000..196c1a786 --- /dev/null +++ b/system/symtab/Makefile @@ -0,0 +1,104 @@ +############################################################################ +# apps/system/system/Makefile +# +# Copyright (C) 2015 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +-include $(TOPDIR)/.config +-include $(TOPDIR)/Make.defs +include $(APPDIR)/Make.defs + +ifeq ($(WINTOOL),y) +INCDIROPT = -w +endif + +# Symbol table support + +ASRCS = +CSRCS = symtab.c + +AOBJS = $(ASRCS:.S=$(OBJEXT)) +COBJS = $(CSRCS:.c=$(OBJEXT)) + +SRCS = $(ASRCS) $(CSRCS) +OBJS = $(AOBJS) $(COBJS) + +ifeq ($(CONFIG_WINDOWS_NATIVE),y) + BIN = ..\..\libapps$(LIBEXT) +else +ifeq ($(WINTOOL),y) + BIN = ..\\..\\libapps$(LIBEXT) +else + BIN = ../../libapps$(LIBEXT) +endif +endif + +ROOTDEPPATH = --dep-path . + +# Common build + +VPATH = + +all: .built +.PHONY: context depend clean distclean + +$(AOBJS): %$(OBJEXT): %.S + $(call ASSEMBLE, $<, $@) + +$(COBJS) $(MAINOBJ): %$(OBJEXT): %.c + $(call COMPILE, $<, $@) + +.built: $(OBJS) + $(call ARCHIVE, $(BIN), $(OBJS)) + $(Q) touch .built + +install: + +context: + +# Create dependencies + +.depend: Makefile $(SRCS) + $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep + $(Q) touch $@ + +depend: .depend + +clean: + $(call DELFILE, .built) + $(call CLEAN) + +distclean: clean + $(call DELFILE, Make.dep) + $(call DELFILE, .depend) + +-include Make.dep diff --git a/system/symtab/README.txt b/system/symtab/README.txt new file mode 100644 index 000000000..8de5e98ac --- /dev/null +++ b/system/symtab/README.txt @@ -0,0 +1,61 @@ +symtab +====== + +Symbol Tables and Build Modes +----------------------------- +This directory provide support for a symbol table which provides all/most of +system and C library services/functions to the application and NSH. + +Symbol tables have differing usefulness in different NuttX build modes: + + 1. In the FLAT build (CONFIG_BUILD_FLAT), symbol tables are used to bind + addresses in loaded ELF or NxFLAT modules to base code that usually + resides in FLASH memory. Both OS interfaces and user/application + libraries are made available to the loaded module via symbol tables. + + 2. Symbol tables may be of value in a protected build + (CONFIG_BUILD_PROTECTED) where the newly started user task must + share resources with other user code (but should use system calls to + interact with the OS). + + 3. But in the kernel build mode (CONFIG_BUILD_KERNEL), only fully linked + executables loadable via execl(), execv(), or posix_spawan() can used. + There is no use for a symbol table with the kernel build since all + memory resources are separate; nothing is share-able with the newly + started process. + +Creating the Canned Symbol Table +-------------------------------- +The support is selected by CONFIG_SYSTEM_SYMTAB option and table has to be +prepared in advance manually. It can be prepared from NuttX top level +directory by using the following commands: + + cd + cat syscall/syscall.csv libc/libc.csv | sort > /symtab/symtab.csv + tools/mksymtab /symtab/symtab.csv /symtab/symtab.inc + +where: + is the path to the NuttX top level build directory + is the path to the top level application directory + +You may want omit syscall/syscall.csv in the above command in the protected +mode. It is optional since the system calls are provided through system +call traps. + +Your board-level start up code code then needs to select the symbol table +by calling the function symtab_initialize(): + + #include + ... + symtab_initialize(); + +Code/Text Size Implications +--------------------------- +The option can have substantial effect on system image size, mainly +code/text. That is because the instructions to generate symtab.inc +above will cause EVERY interface in the NuttX RTOS and the C library to be +included into build. Add to that the size of a huge symbol table. + +In order to reduce the code/text size, you may want to manually prune the +auto-generated symtab.inc file to remove all interfaces that you do +not wish to include into the base FLASH image. diff --git a/system/symtab/symtab.c b/system/symtab/symtab.c new file mode 100644 index 000000000..194c119fc --- /dev/null +++ b/system/symtab/symtab.c @@ -0,0 +1,79 @@ +/**************************************************************************** + * apps/system/symtab/lib_symtab.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Pavel Pisa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#ifdef CONFIG_SYSTEM_SYMTAB + +#include +#include +#include + +#include "symtab.inc" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: symtab_initialize + * + * Description: + * Setup a user provided symbol table. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void symtab_initialize(void) +{ + /* We set the symbol table indirectly through the boardctl() */ + + struct symtab_desc_s symdesc; + + symdesc.symtab = g_symtab; + symdesc.nsymbols = NSYMBOLS; + (void)boardctl(BOARDIOC_SYMTAB, (uinptr_t)&symdesc); +} + +#endif /* CONFIG_SYSTEM_SYMTAB */