Moving canned_symtab from nuttx/libc to apps/system

This commit is contained in:
Gregory Nutt 2015-08-23 11:33:29 -06:00
parent 9b036311c0
commit 6fc449f689
10 changed files with 16 additions and 412 deletions

View file

@ -10868,13 +10868,6 @@
whole sockaddr_in or sockaddr_in6. From Pavel Pisa (2015-08-21).
* tools/mksymtab: declare g_symtab array as conts to occupy RO
section (Flash). From Pavel Pisa (2015-08-23).
* libc/symtab: Optional canned symtab inclusion to the build. When
option CONFIG_LIBC_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).
* libc/libc.csv and syscalls/syscalls.csv: Define some symbol
export conditions, correct errno and add sleep and usleep. From
Pavel Pisa (2015-08-23).

View file

@ -1513,8 +1513,6 @@ nuttx/
|- lib/
| `- README.txt
|- libc/
| |- symtab/
| | `- README.txt
| `- README.txt
|- libnx/
| `- README.txt
@ -1575,6 +1573,8 @@ apps/
| | `- README.txt
| |- nxplayer
| | `- README.txt
| |- symtab/
| | `- README.txt
| |- usbmsc
| | `- README.txt
| |- zmodem

View file

@ -1,145 +0,0 @@
/****************************************************************************
* include/nuttx/binfmt/canned_symtab.h
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 __INCLUDE_NUTTX_BINFMT_CANNED_SYMTAB_H
#define __INCLUDE_NUTTX_BINFMT_CANNED_SYMTAB_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* 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.
*/
/* In order to full describe a symbol table, a vector containing the address
* of the symbol table and the number of elements in the symbol table is
* required.
*/
struct symtab_s; /* Forward reference */
struct symtab_desc_s
{
FAR struct symtab_s *symtab;
int nsymbols;
}
/****************************************************************************
* Public Functions
****************************************************************************/
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Name: canned_symtab_initialize
*
* Description:
* Setup system provided canned symbol table. NOTE that this a user-space
* interface only. It is not generally available to to kernel mode code
* in protected or kernel builds.
*
* Input Parameters:
* None
*
* Returned Value:
* None
*
****************************************************************************/
#if defined(CONFIG_BUILD_FLAT) || !defined(__KERNEL__)
void canned_symtab_initialize(void);
#endif
/****************************************************************************
* Name: canned_symtab_select
*
* Description:
* Setup system provided canned symbol table. This function only exists
* the kernel portion of a protected or kernel build. It is called only
* by boardctl(). I this case:
*
* - canned_symbtab_initialize() and g_symtab() lie in the user space.
* - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in
* kernel space.
*
* Access to boardctl() is provided in user space through a call gate.
*
* Input Parameters:
* symtab - The symbol table to be used
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
*
****************************************************************************/
#if (defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL)) && \
defined(__KERNEL__)
int canned_symtab_select(FAR const struct symtab_desc_s *symdesc);
#endif
#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif /* __INCLUDE_NUTTX_BINFMT_CANNED_SYMTAB_H */

View file

@ -72,9 +72,8 @@
*
* CMD: BOARDIOC_SYMTAB
* DESCRIPTION: Select a symbol table
* ARG: A pointer to an instance of struct symtab_desc_s
* (See include/nuttx/binfmt/canned_symtab.h).
* CONFIGURATION: CONFIG_LIBC_SYMTAB
* ARG: A pointer to an instance of struct boardioc_symtab_s
* CONFIGURATION: CONFIG_BOARDCTL_SYMTAB
* DEPENDENCIES: None
*
* CMD: BOARDIOC_TSCTEST_SETUP
@ -159,6 +158,18 @@ struct boardioc_graphics_s
#endif
};
/* In order to full describe a symbol table, a vector containing the address
* of the symbol table and the number of elements in the symbol table is
* required.
*/
struct symtab_s; /* Forward reference */
struct boardioc_symtab_s
{
FAR struct symtab_s *symtab;
int nsymbols;
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/

View file

@ -195,8 +195,6 @@ config EXECFUNCS_NSYMBOLS
symbols in that table. This selection provides the number of
symbols in the symbol table.
source libc/symtab/Kconfig
endif # EXECFUNCS_HAVE_SYMTAB
endif # LIBC_EXECFUNCS

View file

@ -84,7 +84,6 @@ include queue/Make.defs
include wqueue/Make.defs
include misc/Make.defs
include audio/Make.defs
include symtab/Make.defs
# REVISIT: Backslash causes problems in $(COBJS) target
DELIM := $(strip /)

View file

@ -1,15 +0,0 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
config LIBC_SYMTAB
bool "Include canned symtab for applications and shell"
default n
depends on EXECFUNCS_HAVE_SYMTAB && !BUILD_KERNEL
select LIB_BOARDCTL if !BUILD_FLAT
---help---
Build and include default symbol table in the NuttX library.
The symbol table is selected by call canned_symtab_initialize().
The table libc/symtab/canned_symtab.inc has to be generated
by mksymtab manually before this option is selected.

View file

@ -1,45 +0,0 @@
############################################################################
# libc/symtab/Make.defs
#
# Copyright (C) 2015 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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.
#
############################################################################
ifeq ($(CONFIG_LIBC_SYMTAB),y)
# Include canned symtab to the build
CSRCS += lib_symtab.c
DEPPATH += --dep-path symtab
VPATH += :symtab
endif

View file

@ -1,57 +0,0 @@
symtab
======
Symbol Tables and Build Modes
-----------------------------
This directory provide support for a canned symbol table which provides
all/most of system and libc 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_LIBC_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:
cat syscall/syscall.csv libc/libc.csv | sort >libc/symtab/canned_symtab.csv
tools/mksymtab libc/symtab/canned_symtab.csv libc/symtab/canned_symtab.inc
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 canned symbol
table by calling the OS internal function canned_symtab_initialize() in the
board-specfic board_apps_initialize() logic:
#include <nuttx/binfmt/canned_symtab.h>
...
canned_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 canned_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 canned_symtab.inc file to remove all interfaces that you do
not wish to include into the base FLASH image.

View file

@ -1,135 +0,0 @@
/****************************************************************************
* libc/symtab/lib_symtab.c
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Canned symtab implemented by Pavel Pisa <ppisa@pikron.com>
*
* 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 <nuttx/config.h>
#ifdef CONFIG_LIBC_SYMTAB
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/compiler.h>
#include <nuttx/binfmt/symtab.h>
#include <nuttx/binfmt/canned_symtab.h>
#include "canned_symtab.inc"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: canned_symtab_initialize
*
* Description:
* Setup system provided canned symbol table. NOTE that this a user-space
* interface only. It is not generally available to to kernel mode code
* in protected or kernel builds. That is because exec_setsymtab() and
* g_symtab lie in different address spaces.
*
* Input Parameters:
* None
*
* Returned Value:
* None
*
****************************************************************************/
#if defined(CONFIG_BUILD_FLAT) || !defined(__KERNEL__)
void canned_symtab_initialize(void)
{
#ifdef CONFIG_BUILD_FLAT
/* In the FLAT build, exec_symtab() can be called directly from any logic.
* Both the symbol table and the function exec_setsymtabe reside in the same
* namespace and address space.
*/
exec_setsymtab(g_symtab, NSYMBOLS);
#else
/* In the user mode portion of a protected or kernel build, we must set
* the symbol table indirectly through the boardctl() call gate that will
* proxy the call to canned_symtab_select(). In this case
*
* - canned_symbtab_initialize() and g_symtab() lie in the user space.
* - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in
* kernel space.
*
* Access to boardctl() is provided in user space throug a call gate.
*/
struct symtab_desc_s symdesc;
symdesc.symtab = g_symtab;
symdesc.nsymbols = NSYMBOLS;
(void)boardctl(BOARDIOC_SYMTAB, (uinptr_t)&symdesc);
#endif
}
#endif
/****************************************************************************
* Name: canned_symtab_select
*
* Description:
* Setup system provided canned symbol table. This function only exists
* the kernel portion of a protected or kernel build. It is called only
* by boardctl(). I this case:
*
* - canned_symbtab_initialize() and g_symtab() lie in the user space.
* - boardctl(), canned_symtabl_select(), and exec_setsymtab() reside in
* kernel space.
*
* Access to boardctl() is provided in user space through a call gate.
*
* Input Parameters:
* symtab - The symbol table to be used
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
*
****************************************************************************/
#if (defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL)) && \
defined(__KERNEL__)
int canned_symtab_select(FAR const struct symtab_desc_s *symdesc)
{
exec_setsymtab(symdesc->symtab, symdesc->nsymbols);
}
#endif
#endif /* CONFIG_LIBC_SYMTAB */