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
-2
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
-1
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 /)
-15
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.
-45
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
-57
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.
-135
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 */