mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 23:03:27 +08:00
Add framework to support loadable ELF modules (not much logic in place yet)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5250 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -3506,3 +3506,8 @@
|
|||||||
ld.script files with the common one in this directory.
|
ld.script files with the common one in this directory.
|
||||||
* configs/hymini-stm32v/scripts: Replace all of the identical
|
* configs/hymini-stm32v/scripts: Replace all of the identical
|
||||||
ld.script files with the common one in this directory.
|
ld.script files with the common one in this directory.
|
||||||
|
* configs/lpcxpresso-lpc1768/scripts: Replace all of the identical
|
||||||
|
ld.script files with the common one in this directory.
|
||||||
|
* binfmt/elf.c, binfmt/libelf, include/elf.h, include/nuttx/elf.h: Add
|
||||||
|
basic framework for loadable ELF module support. The initial check-
|
||||||
|
in is non-functional and is simply the framework for ELF support.
|
||||||
|
|||||||
@@ -395,6 +395,10 @@ menu "Memory Management"
|
|||||||
source mm/Kconfig
|
source mm/Kconfig
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
menu "Binary Formats"
|
||||||
|
source binfmt/Kconfig
|
||||||
|
endmenu
|
||||||
|
|
||||||
menu "Library Routines"
|
menu "Library Routines"
|
||||||
source lib/Kconfig
|
source lib/Kconfig
|
||||||
source libxx/Kconfig
|
source libxx/Kconfig
|
||||||
|
|||||||
@@ -2,3 +2,37 @@
|
|||||||
# For a description of the syntax of this configuration file,
|
# For a description of the syntax of this configuration file,
|
||||||
# see misc/tools/kconfig-language.txt.
|
# see misc/tools/kconfig-language.txt.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
config BINFMT_DISABLE
|
||||||
|
bool "Disble BINFMT support"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
By default, support for loadable binary formats is built. This logic
|
||||||
|
may be suppressed be defining this setting.
|
||||||
|
|
||||||
|
if !BINFMT_DISABLE
|
||||||
|
|
||||||
|
config NXFLAT
|
||||||
|
bool "Enable the NXFLAT Binary Format"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable support for the NXFLAT binary format. Default: n
|
||||||
|
|
||||||
|
if NXFLAT
|
||||||
|
include binfmt/libnxflat/Kconfig
|
||||||
|
endif
|
||||||
|
|
||||||
|
config ELF
|
||||||
|
bool "Enable the ELF Binary Format"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable support for the ELF binary format. Default: n
|
||||||
|
|
||||||
|
if ELF
|
||||||
|
include binfmt/libelf/Kconfig
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
config SYMTAB_ORDEREDBYNAME
|
||||||
|
bool "Symbol Tables Ordered by Name"
|
||||||
|
default n
|
||||||
|
|||||||
+27
-28
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# nxflat/Makefile
|
# nxflat/Makefile
|
||||||
#
|
#
|
||||||
# Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2007-2009, 2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -36,55 +36,54 @@
|
|||||||
-include $(TOPDIR)/Make.defs
|
-include $(TOPDIR)/Make.defs
|
||||||
|
|
||||||
ifeq ($(WINTOOL),y)
|
ifeq ($(WINTOOL),y)
|
||||||
INCDIROPT = -w
|
INCDIROPT = -w
|
||||||
endif
|
endif
|
||||||
CFLAGS += ${shell $(TOPDIR)/tools/incdir.sh $(INCDIROPT) "$(CC)" $(TOPDIR)/sched}
|
CFLAGS += ${shell $(TOPDIR)/tools/incdir.sh $(INCDIROPT) "$(CC)" $(TOPDIR)/sched}
|
||||||
|
|
||||||
ifeq ($(CONFIG_NXFLAT),y)
|
# Basic BINFMT source files
|
||||||
include libnxflat/Make.defs
|
|
||||||
LIBNXFLAT_CSRCS += nxflat.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
BINFMT_ASRCS =
|
BINFMT_ASRCS =
|
||||||
BINFMT_CSRCS = binfmt_globals.c binfmt_register.c binfmt_unregister.c \
|
BINFMT_CSRCS = binfmt_globals.c binfmt_register.c binfmt_unregister.c \
|
||||||
binfmt_loadmodule.c binfmt_unloadmodule.c binfmt_execmodule.c \
|
binfmt_loadmodule.c binfmt_unloadmodule.c binfmt_execmodule.c \
|
||||||
binfmt_exec.c binfmt_dumpmodule.c
|
binfmt_exec.c binfmt_dumpmodule.c
|
||||||
|
|
||||||
SYMTAB_ASRCS =
|
# Symbol table source files
|
||||||
SYMTAB_CSRCS = symtab_findbyname.c symtab_findbyvalue.c \
|
|
||||||
symtab_findorderedbyname.c symtab_findorderedbyvalue.c
|
|
||||||
|
|
||||||
SUBDIRS = libnxflat
|
BINFMT_CSRCS += symtab_findbyname.c symtab_findbyvalue.c \
|
||||||
|
symtab_findorderedbyname.c symtab_findorderedbyvalue.c
|
||||||
|
|
||||||
ASRCS = $(BINFMT_ASRCS) $(SYMTAB_ASRCS) $(LIBNXFLAT_ASRCS)
|
# Add configured binary modules
|
||||||
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
|
||||||
|
|
||||||
CSRCS = $(BINFMT_CSRCS) $(SYMTAB_CSRCS) $(LIBNXFLAT_CSRCS)
|
VPATH =
|
||||||
COBJS = $(CSRCS:.c=$(OBJEXT))
|
SUBDIRS =
|
||||||
|
|
||||||
SRCS = $(ASRCS) $(CSRCS)
|
include libnxflat/Make.defs
|
||||||
OBJS = $(AOBJS) $(COBJS)
|
include libelf/Make.defs
|
||||||
|
|
||||||
BIN = libbinfmt$(LIBEXT)
|
BINFMT_AOBJS = $(BINFMT_ASRCS:.S=$(OBJEXT))
|
||||||
|
BINFMT_COBJS = $(BINFMT_CSRCS:.c=$(OBJEXT))
|
||||||
|
|
||||||
VPATH = libnxflat
|
BINFMT_SRCS = $(BINFMT_ASRCS) $(BINFMT_CSRCS)
|
||||||
|
BINFMT_OBJS = $(BINFMT_AOBJS) $(BINFMT_COBJS)
|
||||||
|
|
||||||
all: $(BIN)
|
BIN = libbinfmt$(LIBEXT)
|
||||||
|
|
||||||
$(AOBJS): %$(OBJEXT): %.S
|
all: $(BIN)
|
||||||
|
|
||||||
|
$(BINFMT_AOBJS): %$(OBJEXT): %.S
|
||||||
$(call ASSEMBLE, $<, $@)
|
$(call ASSEMBLE, $<, $@)
|
||||||
|
|
||||||
$(COBJS): %$(OBJEXT): %.c
|
$(BINFMT_COBJS): %$(OBJEXT): %.c
|
||||||
$(call COMPILE, $<, $@)
|
$(call COMPILE, $<, $@)
|
||||||
|
|
||||||
$(BIN): $(OBJS)
|
$(BIN): $(BINFMT_OBJS)
|
||||||
@( for obj in $(OBJS) ; do \
|
@( for obj in $(BINFMT_OBJS) ; do \
|
||||||
$(call ARCHIVE, $@, $${obj}); \
|
$(call ARCHIVE, $@, $${obj}); \
|
||||||
done ; )
|
done ; )
|
||||||
|
|
||||||
.depend: Makefile $(SRCS)
|
.depend: Makefile $(BINFMT_SRCS)
|
||||||
@$(MKDEP) --dep-path . --dep-path libnxflat \
|
@$(MKDEP) --dep-path . --dep-path libnxflat \
|
||||||
$(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
|
$(CC) -- $(CFLAGS) -- $(BINFMT_SRCS) >Make.dep
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
depend: .depend
|
depend: .depend
|
||||||
|
|||||||
+259
@@ -0,0 +1,259 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/elf.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/binfmt.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ELF
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be
|
||||||
|
* defined or CONFIG_ELF_DUMPBUFFER does nothing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT)
|
||||||
|
# undef CONFIG_ELF_DUMPBUFFER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ELF_DUMPBUFFER
|
||||||
|
# define elf_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n)
|
||||||
|
#else
|
||||||
|
# define elf_dumpbuffer(m,b,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
# define MIN(a,b) (a < b ? a : b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int elf_loadbinary(FAR struct binary_s *binp);
|
||||||
|
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_BINFMT)
|
||||||
|
static void elf_dumploadinfo(FAR struct elf_loadinfo_s *loadinfo);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static struct binfmt_s g_elfbinfmt =
|
||||||
|
{
|
||||||
|
NULL, /* next */
|
||||||
|
elf_loadbinary, /* load */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_dumploadinfo
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_BINFMT)
|
||||||
|
static void elf_dumploadinfo(FAR struct elf_loadinfo_s *loadinfo)
|
||||||
|
{
|
||||||
|
unsigned long dsize = loadinfo->datasize + loadinfo->bsssize;
|
||||||
|
|
||||||
|
bdbg("LOAD_INFO:\n");
|
||||||
|
bdbg(" ISPACE:\n");
|
||||||
|
bdbg(" ispace: %08lx\n", loadinfo->ispace);
|
||||||
|
bdbg(" entryoffs: %08lx\n", loadinfo->entryoffs);
|
||||||
|
bdbg(" isize: %08lx\n", loadinfo->isize);
|
||||||
|
|
||||||
|
bdbg(" DSPACE:\n");
|
||||||
|
bdbg(" dspace: %08lx\n", loadinfo->dspace);
|
||||||
|
if (loadinfo->dspace != NULL)
|
||||||
|
{
|
||||||
|
bdbg(" crefs: %d\n", loadinfo->dspace->crefs);
|
||||||
|
bdbg(" region: %08lx\n", loadinfo->dspace->region);
|
||||||
|
}
|
||||||
|
bdbg(" datasize: %08lx\n", loadinfo->datasize);
|
||||||
|
bdbg(" bsssize: %08lx\n", loadinfo->bsssize);
|
||||||
|
bdbg(" (pad): %08lx\n", loadinfo->dsize - dsize);
|
||||||
|
bdbg(" stacksize: %08lx\n", loadinfo->stacksize);
|
||||||
|
bdbg(" dsize: %08lx\n", loadinfo->dsize);
|
||||||
|
|
||||||
|
bdbg(" RELOCS:\n");
|
||||||
|
bdbg(" relocstart: %08lx\n", loadinfo->relocstart);
|
||||||
|
bdbg(" reloccount: %d\n", loadinfo->reloccount);
|
||||||
|
|
||||||
|
bdbg(" HANDLES:\n");
|
||||||
|
bdbg(" filfd: %d\n", loadinfo->filfd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define elf_dumploadinfo(i)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_loadbinary
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Verify that the file is an ELF binary and, if so, load the ELF
|
||||||
|
* binary into memory
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int elf_loadbinary(struct binary_s *binp)
|
||||||
|
{
|
||||||
|
struct elf_loadinfo_s loadinfo; /* Contains globals for libelf */
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
bvdbg("Loading file: %s\n", binp->filename);
|
||||||
|
|
||||||
|
/* Initialize the xflat library to load the program binary. */
|
||||||
|
|
||||||
|
ret = elf_init(binp->filename, &loadinfo);
|
||||||
|
elf_dumploadinfo(&loadinfo);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to initialize for load of NXFLT program: %d\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load the program binary */
|
||||||
|
|
||||||
|
ret = elf_load(&loadinfo);
|
||||||
|
elf_dumploadinfo(&loadinfo);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to load NXFLT program binary: %d\n", ret);
|
||||||
|
goto errout_with_init;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bind the program to the exported symbol table */
|
||||||
|
|
||||||
|
ret = elf_bind(&loadinfo, binp->exports, binp->nexports);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to bind symbols program binary: %d\n", ret);
|
||||||
|
goto errout_with_load;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the load information */
|
||||||
|
|
||||||
|
binp->entrypt = (main_t)(loadinfo.ispace + loadinfo.entryoffs);
|
||||||
|
binp->ispace = (void*)loadinfo.ispace;
|
||||||
|
binp->dspace = (void*)loadinfo.dspace;
|
||||||
|
binp->isize = loadinfo.isize;
|
||||||
|
binp->stacksize = loadinfo.stacksize;
|
||||||
|
|
||||||
|
elf_dumpbuffer("Entry code", (FAR const uint8_t*)binp->entrypt,
|
||||||
|
MIN(binp->isize - loadinfo.entryoffs,512));
|
||||||
|
|
||||||
|
elf_uninit(&loadinfo);
|
||||||
|
return OK;
|
||||||
|
|
||||||
|
errout_with_load:
|
||||||
|
elf_unload(&loadinfo);
|
||||||
|
errout_with_init:
|
||||||
|
elf_uninit(&loadinfo);
|
||||||
|
errout:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* ELF support is built unconditionally. However, it order to
|
||||||
|
* use this binary format, this function must be called during system
|
||||||
|
* format in order to register the ELF binary format.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* This is a NuttX internal function so it follows the convention that
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_initialize(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Register ourselves as a binfmt loader */
|
||||||
|
|
||||||
|
bvdbg("Registering ELF\n");
|
||||||
|
|
||||||
|
ret = register_binfmt(&g_elfbinfmt);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to register binfmt: %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_uninitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Unregister the ELF binary loader
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void elf_uninitialize(void)
|
||||||
|
{
|
||||||
|
unregister_binfmt(&g_elfbinfmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ELF */
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#
|
||||||
|
# For a description of the syntax of this configuration file,
|
||||||
|
# see misc/tools/kconfig-language.txt.
|
||||||
|
#
|
||||||
|
|
||||||
|
config ELF_DUMPBUFFER
|
||||||
|
bool "Dump ELF buffers"
|
||||||
|
default n
|
||||||
|
depends on DEBUG && DEBUG_VERBOSE
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
############################################################################
|
||||||
|
# binfmt/libelf/Make.defs
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 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_ELF),y)
|
||||||
|
|
||||||
|
# ELF application interfaces
|
||||||
|
|
||||||
|
BINFMT_CSRCS += elf.c
|
||||||
|
|
||||||
|
# ELF library
|
||||||
|
|
||||||
|
BINFMT_CSRCS = libelf_init.c libelf_uninit.c libelf_load.c \
|
||||||
|
libelf_unload.c libelf_verify.c libelf_read.c \
|
||||||
|
libelf_bind.c
|
||||||
|
|
||||||
|
# Hook the libelf subdirectory into the build
|
||||||
|
|
||||||
|
VPATH += libelf
|
||||||
|
SUBDIRS += libelf
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* examples/elf/gnu-elf-gotoff.ld
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009, 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
ISPACE : ORIGIN = 0x0, LENGTH = 2097152
|
||||||
|
DSPACE : ORIGIN = 0x0, LENGTH = 2097152
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* The XFLAT program image is divided into two segments:
|
||||||
|
*
|
||||||
|
* (1) ISpace (Instruction Space). This is the segment that contains
|
||||||
|
* code (.text). Everything in the segment should be fetch-able
|
||||||
|
* machine PC instructions (jump, branch, call, etc.).
|
||||||
|
* (2) DSpace (Data Space). This is the segment that contains both
|
||||||
|
* read-write data (.data, .bss) as well as read-only data (.rodata).
|
||||||
|
* Everything in this segment should be access-able with machine
|
||||||
|
* PIC load and store instructions.
|
||||||
|
*
|
||||||
|
* Older versions of GCC (at least up to GCC 4.3.3), use GOT-relative
|
||||||
|
* addressing to access RO data. In that case, read-only data (.rodata) must
|
||||||
|
* reside in D-Space and this linker script should be used.
|
||||||
|
*
|
||||||
|
* Newer versions of GCC (at least as of GCC 4.6.3), use PC-relative
|
||||||
|
* addressing to access RO data. In that case, read-only data (.rodata) must
|
||||||
|
* reside in I-Space and this linker script should NOT be used with those
|
||||||
|
* newer tools.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text 0x00000000 :
|
||||||
|
{
|
||||||
|
/* ISpace is located at address 0. Every (unrelocated) ISpace
|
||||||
|
* address is an offset from the begining of this segment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
text_start = . ;
|
||||||
|
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
*(.gnu.warning)
|
||||||
|
*(.stub)
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
*(.jcr)
|
||||||
|
|
||||||
|
/* C++ support: The .init and .fini sections contain XFLAT-
|
||||||
|
* specific logic to manage static constructors and destructors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
*(.init)
|
||||||
|
*(.fini)
|
||||||
|
|
||||||
|
/* This is special code area at the end of the normal
|
||||||
|
text section. It contains a small lookup table at
|
||||||
|
the start followed by the code pointed to by entries
|
||||||
|
in the lookup table. */
|
||||||
|
|
||||||
|
. = ALIGN (4) ;
|
||||||
|
PROVIDE(__ctbp = .);
|
||||||
|
*(.call_table_data)
|
||||||
|
*(.call_table_text)
|
||||||
|
|
||||||
|
_etext = . ;
|
||||||
|
|
||||||
|
} > ISPACE
|
||||||
|
|
||||||
|
/* DSpace is also located at address 0. Every (unrelocated) DSpace
|
||||||
|
* address is an offset from the begining of this segment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.data 0x00000000 :
|
||||||
|
{
|
||||||
|
/* In this model, .rodata is access using PC-relative addressing
|
||||||
|
* and, hence, must also reside in the .text section.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__data_start = . ;
|
||||||
|
*(.rodata)
|
||||||
|
*(.rodata1)
|
||||||
|
*(.rodata.*)
|
||||||
|
*(.gnu.linkonce.r*)
|
||||||
|
|
||||||
|
*(.data)
|
||||||
|
*(.data1)
|
||||||
|
*(.data.*)
|
||||||
|
*(.gnu.linkonce.d*)
|
||||||
|
*(.data1)
|
||||||
|
*(.eh_frame)
|
||||||
|
*(.gcc_except_table)
|
||||||
|
|
||||||
|
*(.gnu.linkonce.s.*)
|
||||||
|
*(__libc_atexit)
|
||||||
|
*(__libc_subinit)
|
||||||
|
*(__libc_subfreeres)
|
||||||
|
*(.note.ABI-tag)
|
||||||
|
|
||||||
|
/* C++ support. For each global and static local C++ object,
|
||||||
|
* GCC creates a small subroutine to construct the object. Pointers
|
||||||
|
* to these routines (not the routines themselves) are stored as
|
||||||
|
* simple, linear arrays in the .ctors section of the object file.
|
||||||
|
* Similarly, pointers to global/static destructor routines are
|
||||||
|
* stored in .dtors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
*(.gnu.linkonce.d.*)
|
||||||
|
|
||||||
|
_ctors_start = . ;
|
||||||
|
*(.ctors)
|
||||||
|
_ctors_end = . ;
|
||||||
|
_dtors_start = . ;
|
||||||
|
*(.dtors)
|
||||||
|
_dtors_end = . ;
|
||||||
|
|
||||||
|
_edata = . ;
|
||||||
|
edata = ALIGN( 0x10 ) ;
|
||||||
|
} > DSPACE
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
__bss_start = _edata ;
|
||||||
|
*(.dynsbss)
|
||||||
|
*(.sbss)
|
||||||
|
*(.sbss.*)
|
||||||
|
*(.scommon)
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(.bss.*)
|
||||||
|
*(.bss*)
|
||||||
|
*(.gnu.linkonce.b*)
|
||||||
|
*(COMMON)
|
||||||
|
end = ALIGN( 0x10 ) ;
|
||||||
|
_end = ALIGN( 0x10 ) ;
|
||||||
|
} > DSPACE
|
||||||
|
|
||||||
|
.got 0 : { *(.got.plt) *(.got) }
|
||||||
|
.junk 0 : { *(.rel*) *(.rela*) }
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_info 0 : { *(.debug_info) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_bind.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
#include <nuttx/symtab.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be
|
||||||
|
* defined or CONFIG_ELF_DUMPBUFFER does nothing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT)
|
||||||
|
# undef CONFIG_ELF_DUMPBUFFER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ELF_DUMPBUFFER
|
||||||
|
# define elf_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n)
|
||||||
|
#else
|
||||||
|
# define elf_dumpbuffer(m,b,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_bind
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Bind the imported symbol names in the loaded module described by
|
||||||
|
* 'loadinfo' using the exported symbol values provided by 'symtab'.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_bind(FAR struct elf_loadinfo_s *loadinfo,
|
||||||
|
FAR const struct symtab_s *exports, int nexports)
|
||||||
|
{
|
||||||
|
#warning "Missing logic"
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_init.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be
|
||||||
|
* defined or CONFIG_ELF_DUMPBUFFER does nothing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT)
|
||||||
|
# undef CONFIG_ELF_DUMPBUFFER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ELF_DUMPBUFFER
|
||||||
|
# define elf_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n)
|
||||||
|
#else
|
||||||
|
# define elf_dumpbuffer(m,b,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function is called to configure the library to process an ELF
|
||||||
|
* program binary.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_init(FAR const char *filename, FAR struct elf_loadinfo_s *loadinfo)
|
||||||
|
{
|
||||||
|
uint32_t datastart;
|
||||||
|
uint32_t dataend;
|
||||||
|
uint32_t bssstart;
|
||||||
|
uint32_t bssend;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
bvdbg("filename: %s loadinfo: %p\n", filename, loadinfo);
|
||||||
|
|
||||||
|
/* Clear the load info structure */
|
||||||
|
|
||||||
|
memset(loadinfo, 0, sizeof(struct elf_loadinfo_s));
|
||||||
|
|
||||||
|
/* Open the binary file */
|
||||||
|
|
||||||
|
loadinfo->filfd = open(filename, O_RDONLY);
|
||||||
|
if (loadinfo->filfd < 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to open ELF binary %s: %d\n", filename, ret);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the ELF header from offset 0 */
|
||||||
|
|
||||||
|
ret = elf_read(loadinfo, (char*)&loadinfo->header,
|
||||||
|
sizeof(struct elf_hdr_s), 0);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
bdbg("Failed to read ELF header: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
elf_dumpbuffer("ELF header", (FAR const uint8_t*)&loadinfo->header,
|
||||||
|
sizeof(struct elf_hdr_s));
|
||||||
|
|
||||||
|
/* Verify the ELF header */
|
||||||
|
|
||||||
|
if (elf_verifyheader(&loadinfo->header) != 0)
|
||||||
|
{
|
||||||
|
/* This is not an error because we will be called to attempt loading
|
||||||
|
* EVERY binary. Returning -ENOEXEC simply informs the system that
|
||||||
|
* the file is not an ELF file. Besides, if there is something worth
|
||||||
|
* complaining about, nelf_verifyheader() has already
|
||||||
|
* done so.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bdbg("Bad ELF header\n");
|
||||||
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save all of the input values in the loadinfo structure
|
||||||
|
* and extract some additional information from the xflat
|
||||||
|
* header. Note that the information in the xflat header is in
|
||||||
|
* network order.
|
||||||
|
*/
|
||||||
|
|
||||||
|
datastart = ntohl(loadinfo->header.h_datastart);
|
||||||
|
dataend = ntohl(loadinfo->header.h_dataend);
|
||||||
|
bssstart = dataend;
|
||||||
|
bssend = ntohl(loadinfo->header.h_bssend);
|
||||||
|
|
||||||
|
/* And put this information into the loadinfo structure as well.
|
||||||
|
*
|
||||||
|
* Note that:
|
||||||
|
*
|
||||||
|
* isize = the address range from 0 up to datastart.
|
||||||
|
* datasize = the address range from datastart up to dataend
|
||||||
|
* bsssize = the address range from dataend up to bssend.
|
||||||
|
*/
|
||||||
|
|
||||||
|
loadinfo->entryoffs = ntohl(loadinfo->header.h_entry);
|
||||||
|
loadinfo->isize = datastart;
|
||||||
|
|
||||||
|
loadinfo->datasize = dataend - datastart;
|
||||||
|
loadinfo->bsssize = bssend - dataend;
|
||||||
|
loadinfo->stacksize = ntohl(loadinfo->header.h_stacksize);
|
||||||
|
|
||||||
|
/* This is the initial dspace size. We'll re-calculate this later
|
||||||
|
* after the memory has been allocated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
loadinfo->dsize = bssend - datastart;
|
||||||
|
|
||||||
|
/* Get the offset to the start of the relocations (we'll relocate
|
||||||
|
* this later).
|
||||||
|
*/
|
||||||
|
|
||||||
|
loadinfo->relocstart = ntohl(loadinfo->header.h_relocstart);
|
||||||
|
loadinfo->reloccount = ntohs(loadinfo->header.h_reloccount);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_load.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(x,y) ((x) > (y) ? (x) : (y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_load
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Loads the binary into memory, allocating memory, performing relocations
|
||||||
|
* and inializing the data and bss segments.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_load(FAR struct elf_loadinfo_s *loadinfo)
|
||||||
|
{
|
||||||
|
# warning "Missing logic"
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_read.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#undef ELF_DUMP_READDATA /* Define to dump all file data read */
|
||||||
|
#define DUMPER lib_rawprintf /* If ELF_DUMP_READDATA is defined, this
|
||||||
|
* is the API used to dump data */
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_dumpreaddata
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(ELF_DUMP_READDATA)
|
||||||
|
static inline void elf_dumpreaddata(char *buffer, int buflen)
|
||||||
|
{
|
||||||
|
uint32_t *buf32 = (uint32_t*)buffer;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (i = 0; i < buflen; i += 32)
|
||||||
|
{
|
||||||
|
DUMPER("%04x:", i);
|
||||||
|
for (j = 0; j < 32; j += sizeof(uint32_t))
|
||||||
|
{
|
||||||
|
DUMPER(" %08x", *buf32++);
|
||||||
|
}
|
||||||
|
DUMPER("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define elf_dumpreaddata(b,n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_read
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Read 'readsize' bytes from the object file at 'offset'
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_read(struct elf_loadinfo_s *loadinfo, char *buffer, int readsize, int offset)
|
||||||
|
{
|
||||||
|
ssize_t nbytes; /* Number of bytes read */
|
||||||
|
off_t rpos; /* Position returned by lseek */
|
||||||
|
char *bufptr; /* Next buffer location to read into */
|
||||||
|
int bytesleft; /* Number of bytes of .data left to read */
|
||||||
|
int bytesread; /* Total number of bytes read */
|
||||||
|
|
||||||
|
bvdbg("Read %d bytes from offset %d\n", readsize, offset);
|
||||||
|
|
||||||
|
/* Seek to the position in the object file where the initialized
|
||||||
|
* data is saved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bytesread = 0;
|
||||||
|
bufptr = buffer;
|
||||||
|
bytesleft = readsize;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rpos = lseek(loadinfo->filfd, offset, SEEK_SET);
|
||||||
|
if (rpos != offset)
|
||||||
|
{
|
||||||
|
bdbg("Failed to seek to position %d: %d\n", offset, errno);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the file data at offset into the user buffer */
|
||||||
|
|
||||||
|
nbytes = read(loadinfo->filfd, bufptr, bytesleft);
|
||||||
|
if (nbytes < 0)
|
||||||
|
{
|
||||||
|
if (errno != EINTR)
|
||||||
|
{
|
||||||
|
bdbg("Read of .data failed: %d\n", errno);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nbytes == 0)
|
||||||
|
{
|
||||||
|
bdbg("Unexpected end of file\n");
|
||||||
|
return -ENODATA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bytesread += nbytes;
|
||||||
|
bytesleft -= nbytes;
|
||||||
|
bufptr += nbytes;
|
||||||
|
offset += nbytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (bytesread < readsize);
|
||||||
|
|
||||||
|
elf_dumpreaddata(buffer, readsize);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_uninit.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_uninit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Releases any resources committed by elf_init(). This essentially
|
||||||
|
* undoes the actions of elf_init.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_uninit(struct elf_loadinfo_s *loadinfo)
|
||||||
|
{
|
||||||
|
if (loadinfo->filfd >= 0)
|
||||||
|
{
|
||||||
|
close(loadinfo->filfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/libelf_unload.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_unload
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function unloads the object from memory. This essentially
|
||||||
|
* undoes the actions of elf_load.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_unload(struct elf_loadinfo_s *loadinfo)
|
||||||
|
{
|
||||||
|
/* Reset the contents of the info structure. */
|
||||||
|
|
||||||
|
/* Release the memory segments */
|
||||||
|
|
||||||
|
if (loadinfo->ispace)
|
||||||
|
{
|
||||||
|
kfree((void*)loadinfo->ispace, loadinfo->isize);
|
||||||
|
loadinfo->ispace = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadinfo->dspace)
|
||||||
|
{
|
||||||
|
kfree((void*)loadinfo->dspace);
|
||||||
|
loadinfo->dspace = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* binfmt/libelf/elf_verify.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <nuttx/elf.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Constant Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_verifyheader
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Given the header from a possible ELF executable, verify that it
|
||||||
|
* is an ELF executable.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int elf_verifyheader(const struct elf_hdr_s *header)
|
||||||
|
{
|
||||||
|
if (!header)
|
||||||
|
{
|
||||||
|
bdbg("NULL ELF header!");
|
||||||
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
#warning "Missing Logic"
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -2,3 +2,8 @@
|
|||||||
# For a description of the syntax of this configuration file,
|
# For a description of the syntax of this configuration file,
|
||||||
# see misc/tools/kconfig-language.txt.
|
# see misc/tools/kconfig-language.txt.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
config NXFLAT_DUMPBUFFER
|
||||||
|
bool "Dump NXFLAT buffers"
|
||||||
|
default n
|
||||||
|
depends on DEBUG && DEBUG_VERBOSE
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# nxflat/lib/Make.defs
|
# binfmt/libnxflat/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
@@ -33,7 +33,21 @@
|
|||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
LIBNXFLAT_ASRCS =
|
ifeq ($(CONFIG_NXFLAT),y)
|
||||||
LIBNXFLAT_CSRCS = libnxflat_init.c libnxflat_uninit.c libnxflat_load.c \
|
|
||||||
libnxflat_unload.c libnxflat_verify.c libnxflat_read.c \
|
# NXFLAT application interfaces
|
||||||
libnxflat_bind.c
|
|
||||||
|
BINFMT_CSRCS += nxflat.c
|
||||||
|
|
||||||
|
# NXFLAT library
|
||||||
|
|
||||||
|
BINFMT_CSRCS = libnxflat_init.c libnxflat_uninit.c libnxflat_load.c \
|
||||||
|
libnxflat_unload.c libnxflat_verify.c libnxflat_read.c \
|
||||||
|
libnxflat_bind.c
|
||||||
|
|
||||||
|
# Hook the libnxflat subdirectory into the build
|
||||||
|
|
||||||
|
VPATH += libnxflat
|
||||||
|
SUBDIRS += libnxflat
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
@@ -263,7 +263,6 @@ static inline int nxflat_gotrelocs(FAR struct nxflat_loadinfo_s *loadinfo)
|
|||||||
result = OK;
|
result = OK;
|
||||||
switch (NXFLAT_RELOC_TYPE(reloc.r_info))
|
switch (NXFLAT_RELOC_TYPE(reloc.r_info))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* NXFLAT_RELOC_TYPE_REL32I Meaning: Object file contains a 32-bit offset
|
/* NXFLAT_RELOC_TYPE_REL32I Meaning: Object file contains a 32-bit offset
|
||||||
* into I-Space at the offset.
|
* into I-Space at the offset.
|
||||||
* Fixup: Add mapped I-Space address to the offset.
|
* Fixup: Add mapped I-Space address to the offset.
|
||||||
@@ -329,6 +328,7 @@ static inline int nxflat_gotrelocs(FAR struct nxflat_loadinfo_s *loadinfo)
|
|||||||
nxflat_dumpbuffer("GOT", (FAR const uint8_t*)relocs, nrelocs * sizeof(struct nxflat_reloc_s));
|
nxflat_dumpbuffer("GOT", (FAR const uint8_t*)relocs, nrelocs * sizeof(struct nxflat_reloc_s));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,7 +388,7 @@ static inline int nxflat_bindimports(FAR struct nxflat_loadinfo_s *loadinfo,
|
|||||||
offset < loadinfo->isize + loadinfo->dsize);
|
offset < loadinfo->isize + loadinfo->dsize);
|
||||||
|
|
||||||
imports = (struct nxflat_import_s*)
|
imports = (struct nxflat_import_s*)
|
||||||
(offset - loadinfo->isize + loadinfo->dspace->region);
|
(offset - loadinfo->isize + loadinfo->dspace->region);
|
||||||
|
|
||||||
/* Now, traverse the list of imported symbols and attempt to bind
|
/* Now, traverse the list of imported symbols and attempt to bind
|
||||||
* each symbol to the value exported by from the exported symbol
|
* each symbol to the value exported by from the exported symbol
|
||||||
@@ -396,41 +396,41 @@ static inline int nxflat_bindimports(FAR struct nxflat_loadinfo_s *loadinfo,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < nimports; i++)
|
for (i = 0; i < nimports; i++)
|
||||||
{
|
{
|
||||||
bvdbg("Import[%d] (%08p) offset: %08x func: %08x\n",
|
bvdbg("Import[%d] (%08p) offset: %08x func: %08x\n",
|
||||||
i, &imports[i], imports[i].i_funcname, imports[i].i_funcaddress);
|
i, &imports[i], imports[i].i_funcname, imports[i].i_funcaddress);
|
||||||
|
|
||||||
/* Get a pointer to the imported symbol name. The name itself
|
/* Get a pointer to the imported symbol name. The name itself
|
||||||
* lies in the TEXT segment. But the reference to the name
|
* lies in the TEXT segment. But the reference to the name
|
||||||
* lies in DATA segment. Therefore, the name reference should
|
* lies in DATA segment. Therefore, the name reference should
|
||||||
* have been relocated when the module was loaded.
|
* have been relocated when the module was loaded.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
offset = imports[i].i_funcname;
|
offset = imports[i].i_funcname;
|
||||||
DEBUGASSERT(offset < loadinfo->isize);
|
DEBUGASSERT(offset < loadinfo->isize);
|
||||||
|
|
||||||
symname = (char*)(offset + loadinfo->ispace + sizeof(struct nxflat_hdr_s));
|
symname = (char*)(offset + loadinfo->ispace + sizeof(struct nxflat_hdr_s));
|
||||||
|
|
||||||
/* Find the exported symbol value for this this symbol name. */
|
/* Find the exported symbol value for this this symbol name. */
|
||||||
|
|
||||||
#ifdef CONFIG_SYMTAB_ORDEREDBYNAME
|
#ifdef CONFIG_SYMTAB_ORDEREDBYNAME
|
||||||
symbol = symtab_findorderedbyname(exports, symname, nexports);
|
symbol = symtab_findorderedbyname(exports, symname, nexports);
|
||||||
#else
|
#else
|
||||||
symbol = symtab_findbyname(exports, symname, nexports);
|
symbol = symtab_findbyname(exports, symname, nexports);
|
||||||
#endif
|
#endif
|
||||||
if (!symbol)
|
if (!symbol)
|
||||||
{
|
{
|
||||||
bdbg("Exported symbol \"%s\" not found\n", symname);
|
bdbg("Exported symbol \"%s\" not found\n", symname);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* And put this into the module's import structure. */
|
/* And put this into the module's import structure. */
|
||||||
|
|
||||||
imports[i].i_funcaddress = (uint32_t)symbol->sym_value;
|
imports[i].i_funcaddress = (uint32_t)symbol->sym_value;
|
||||||
|
|
||||||
bvdbg("Bound import[%d] (%08p) to export '%s' (%08x)\n",
|
bvdbg("Bound import[%d] (%08p) to export '%s' (%08x)\n",
|
||||||
i, &imports[i], symname, imports[i].i_funcaddress);
|
i, &imports[i], symname, imports[i].i_funcaddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump the relocation import table */
|
/* Dump the relocation import table */
|
||||||
@@ -441,6 +441,7 @@ static inline int nxflat_bindimports(FAR struct nxflat_loadinfo_s *loadinfo,
|
|||||||
nxflat_dumpbuffer("Imports", (FAR const uint8_t*)imports, nimports * sizeof(struct nxflat_import_s));
|
nxflat_dumpbuffer("Imports", (FAR const uint8_t*)imports, nimports * sizeof(struct nxflat_import_s));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,9 +485,10 @@ int nxflat_bind(FAR struct nxflat_loadinfo_s *loadinfo,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
memset((void*)(loadinfo->dspace->region + loadinfo->datasize),
|
memset((void*)(loadinfo->dspace->region + loadinfo->datasize),
|
||||||
0, loadinfo->bsssize);
|
0, loadinfo->bsssize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,10 +56,6 @@
|
|||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: nxflat_swap32
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
@@ -91,10 +91,10 @@ int nxflat_verifyheader(const struct nxflat_hdr_s *header)
|
|||||||
if (strncmp(header->h_magic, NXFLAT_MAGIC, 4) != 0)
|
if (strncmp(header->h_magic, NXFLAT_MAGIC, 4) != 0)
|
||||||
{
|
{
|
||||||
bdbg("Unrecognized magic=\"%c%c%c%c\"\n",
|
bdbg("Unrecognized magic=\"%c%c%c%c\"\n",
|
||||||
header->h_magic[0], header->h_magic[1],
|
header->h_magic[0], header->h_magic[1],
|
||||||
header->h_magic[2], header->h_magic[3]);
|
header->h_magic[2], header->h_magic[3]);
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# configs/lpcxpresso-lpc1768/dhcpd/Make.defs
|
# configs/lpcxpresso-lpc1768/dhcpd/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -86,14 +86,14 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/dhcpd/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/dhcpd/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(CROSSDEV)gcc
|
CC = $(CROSSDEV)gcc
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# configs/lpcxpresso-lpc1768/nsh/Make.defs
|
# configs/lpcxpresso-lpc1768/nsh/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -86,14 +86,14 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nsh/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nsh/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(CROSSDEV)gcc
|
CC = $(CROSSDEV)gcc
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* configs/lpcxpresso-lpc1768/nsh/ld.script
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* The LPC1768 has 512Kb of FLASH beginning at address 0x0000:0000 and
|
|
||||||
* 64Kb of total SRAM: 32Kb of SRAM in the CPU block beginning at address
|
|
||||||
* 0x10000000 and 32Kb of AHB SRAM in two banks of 16Kb beginning at addresses
|
|
||||||
* 0x20070000 and 0x20080000. Here we assume that .data and .bss will all fit
|
|
||||||
* into the 32Kb CPU SRAM address range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
|
|
||||||
sram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_stext)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
_stext = ABSOLUTE(.);
|
|
||||||
*(.vectors)
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.fixup)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
*(.gnu.linkonce.t.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.got)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
_etext = ABSOLUTE(.);
|
|
||||||
} > flash
|
|
||||||
|
|
||||||
_eronly = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = ABSOLUTE(.);
|
|
||||||
*(.data .data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
_edata = ABSOLUTE(.);
|
|
||||||
} > sram AT > flash
|
|
||||||
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >sram
|
|
||||||
|
|
||||||
__exidx_start = ABSOLUTE(.);
|
|
||||||
.ARM.exidx : {
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
} >sram
|
|
||||||
__exidx_end = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
_sbss = ABSOLUTE(.);
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
_ebss = ABSOLUTE(.);
|
|
||||||
} > sram
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# configs/lpcxpresso-lpc1768/nx/Make.defs
|
# configs/lpcxpresso-lpc1768/nx/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -86,14 +86,14 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nx/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/nx/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(CROSSDEV)gcc
|
CC = $(CROSSDEV)gcc
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* configs/lpcxpresso-lpc1768/nx/ld.script
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* The LPC1768 has 512Kb of FLASH beginning at address 0x0000:0000 and
|
|
||||||
* 64Kb of total SRAM: 32Kb of SRAM in the CPU block beginning at address
|
|
||||||
* 0x10000000 and 32Kb of AHB SRAM in two banks of 16Kb beginning at addresses
|
|
||||||
* 0x20070000 and 0x20080000. Here we assume that .data and .bss will all fit
|
|
||||||
* into the 32Kb CPU SRAM address range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
|
|
||||||
sram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_stext)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
_stext = ABSOLUTE(.);
|
|
||||||
*(.vectors)
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.fixup)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
*(.gnu.linkonce.t.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.got)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
_etext = ABSOLUTE(.);
|
|
||||||
} > flash
|
|
||||||
|
|
||||||
_eronly = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = ABSOLUTE(.);
|
|
||||||
*(.data .data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
_edata = ABSOLUTE(.);
|
|
||||||
} > sram AT > flash
|
|
||||||
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >sram
|
|
||||||
|
|
||||||
__exidx_start = ABSOLUTE(.);
|
|
||||||
.ARM.exidx : {
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
} >sram
|
|
||||||
__exidx_end = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
_sbss = ABSOLUTE(.);
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
_ebss = ABSOLUTE(.);
|
|
||||||
} > sram
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# configs/lpcxpresso-lpc1768/ostest/Make.defs
|
# configs/lpcxpresso-lpc1768/ostest/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -86,14 +86,14 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/ostest/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/ostest/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(CROSSDEV)gcc
|
CC = $(CROSSDEV)gcc
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* configs/lpcxpresso-lpc1768/ostest/ld.script
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* The LPC1768 has 512Kb of FLASH beginning at address 0x0000:0000 and
|
|
||||||
* 64Kb of total SRAM: 32Kb of SRAM in the CPU block beginning at address
|
|
||||||
* 0x10000000 and 32Kb of AHB SRAM in two banks of 16Kb beginning at addresses
|
|
||||||
* 0x20070000 and 0x20080000. Here we assume that .data and .bss will all fit
|
|
||||||
* into the 32Kb CPU SRAM address range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
|
|
||||||
sram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_stext)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
_stext = ABSOLUTE(.);
|
|
||||||
*(.vectors)
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.fixup)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
*(.gnu.linkonce.t.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.got)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
_etext = ABSOLUTE(.);
|
|
||||||
} > flash
|
|
||||||
|
|
||||||
_eronly = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = ABSOLUTE(.);
|
|
||||||
*(.data .data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
_edata = ABSOLUTE(.);
|
|
||||||
} > sram AT > flash
|
|
||||||
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >sram
|
|
||||||
|
|
||||||
__exidx_start = ABSOLUTE(.);
|
|
||||||
.ARM.exidx : {
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
} >sram
|
|
||||||
__exidx_end = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
_sbss = ABSOLUTE(.);
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
_ebss = ABSOLUTE(.);
|
|
||||||
} > sram
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
}
|
|
||||||
+4
-3
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* configs/lpcxpresso-lpc1768/dhcpd/ld.script
|
* configs/lpcxpresso-lpc1768/scripts/ld.script
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -94,7 +94,8 @@ SECTIONS
|
|||||||
_ebss = ABSOLUTE(.);
|
_ebss = ABSOLUTE(.);
|
||||||
} > sram
|
} > sram
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
/* Stabs debugging sections */
|
||||||
|
|
||||||
.stab 0 : { *(.stab) }
|
.stab 0 : { *(.stab) }
|
||||||
.stabstr 0 : { *(.stabstr) }
|
.stabstr 0 : { *(.stabstr) }
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
@@ -86,7 +86,7 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/thttpd/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
NXFLATLDSCRIPT = -T "${shell cygpath -w $(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld}"
|
NXFLATLDSCRIPT = -T "${shell cygpath -w $(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld}"
|
||||||
else
|
else
|
||||||
@@ -94,7 +94,7 @@ else
|
|||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/thttpd/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
NXFLATLDSCRIPT = -T"$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld"
|
NXFLATLDSCRIPT = -T"$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* configs/lpcxpresso-lpc1768/thttpd/ld.script
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* The LPC1768 has 512Kb of FLASH beginning at address 0x0000:0000 and
|
|
||||||
* 64Kb of total SRAM: 32Kb of SRAM in the CPU block beginning at address
|
|
||||||
* 0x10000000 and 32Kb of AHB SRAM in two banks of 16Kb beginning at addresses
|
|
||||||
* 0x20070000 and 0x20080000. Here we assume that .data and .bss will all fit
|
|
||||||
* into the 32Kb CPU SRAM address range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
|
|
||||||
sram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_stext)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
_stext = ABSOLUTE(.);
|
|
||||||
*(.vectors)
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.fixup)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
*(.gnu.linkonce.t.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.got)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
_etext = ABSOLUTE(.);
|
|
||||||
} > flash
|
|
||||||
|
|
||||||
_eronly = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = ABSOLUTE(.);
|
|
||||||
*(.data .data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
_edata = ABSOLUTE(.);
|
|
||||||
} > sram AT > flash
|
|
||||||
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >sram
|
|
||||||
|
|
||||||
__exidx_start = ABSOLUTE(.);
|
|
||||||
.ARM.exidx : {
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
} >sram
|
|
||||||
__exidx_end = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
_sbss = ABSOLUTE(.);
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
_ebss = ABSOLUTE(.);
|
|
||||||
} > sram
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# configs/lpcxpresso-lpc1768/usbstorage/Make.defs
|
# configs/lpcxpresso-lpc1768/usbstorage/Make.defs
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@@ -86,14 +86,14 @@ ifeq ($(WINTOOL),y)
|
|||||||
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/usbstorage/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
MAXOPTIMIZATION = -O2
|
MAXOPTIMIZATION = -O2
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/usbstorage/ld.script
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(CROSSDEV)gcc
|
CC = $(CROSSDEV)gcc
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* configs/lpcxpresso-lpc1768/usbstorage/ld.script
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/* The LPC1768 has 512Kb of FLASH beginning at address 0x0000:0000 and
|
|
||||||
* 64Kb of total SRAM: 32Kb of SRAM in the CPU block beginning at address
|
|
||||||
* 0x10000000 and 32Kb of AHB SRAM in two banks of 16Kb beginning at addresses
|
|
||||||
* 0x20070000 and 0x20080000. Here we assume that .data and .bss will all fit
|
|
||||||
* into the 32Kb CPU SRAM address range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
|
|
||||||
sram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_stext)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.text : {
|
|
||||||
_stext = ABSOLUTE(.);
|
|
||||||
*(.vectors)
|
|
||||||
*(.text .text.*)
|
|
||||||
*(.fixup)
|
|
||||||
*(.gnu.warning)
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
*(.gnu.linkonce.t.*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
*(.got)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
_etext = ABSOLUTE(.);
|
|
||||||
} > flash
|
|
||||||
|
|
||||||
_eronly = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = ABSOLUTE(.);
|
|
||||||
*(.data .data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
CONSTRUCTORS
|
|
||||||
_edata = ABSOLUTE(.);
|
|
||||||
} > sram AT > flash
|
|
||||||
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >sram
|
|
||||||
|
|
||||||
__exidx_start = ABSOLUTE(.);
|
|
||||||
.ARM.exidx : {
|
|
||||||
*(.ARM.exidx*)
|
|
||||||
} >sram
|
|
||||||
__exidx_end = ABSOLUTE(.);
|
|
||||||
|
|
||||||
.bss : {
|
|
||||||
_sbss = ABSOLUTE(.);
|
|
||||||
*(.bss .bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
_ebss = ABSOLUTE(.);
|
|
||||||
} > sram
|
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
||||||
.debug_info 0 : { *(.debug_info) }
|
|
||||||
.debug_line 0 : { *(.debug_line) }
|
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* include/elf.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 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_ELF_H
|
||||||
|
#define __INCLUDE_ELF_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __INCLUDE_ELF_H */
|
||||||
@@ -0,0 +1,259 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* include/nuttx/elf.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009, 2012 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_ELF_H
|
||||||
|
#define __INCLUDE_NUTTX_ELF_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <elf.h>
|
||||||
|
#include <nuttx/sched.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* This struct provides a desciption of the currently loaded instantiation
|
||||||
|
* of an ELF binary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct elf_loadinfo_s
|
||||||
|
{
|
||||||
|
/* Instruction Space (ISpace): This region contains the ELF file header
|
||||||
|
* plus everything from the text section. Ideally, will have only one mmap'ed
|
||||||
|
* text section instance in the system for each module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t ispace; /* Address where hdr/text is loaded */
|
||||||
|
uint32_t entryoffs; /* Offset from ispace to entry point */
|
||||||
|
uint32_t isize; /* Size of ispace. */
|
||||||
|
|
||||||
|
/* Data Space (DSpace): This region contains all information that in referenced
|
||||||
|
* as data (other than the stack which is separately allocated). There will be
|
||||||
|
* a unique instance of DSpace (and stack) for each instance of a process.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FAR struct dspace_s *dspace; /* Allocated D-Space (data/bss/etc) */
|
||||||
|
uint32_t datasize; /* Size of data segment in dspace */
|
||||||
|
uint32_t bsssize; /* Size of bss segment in dspace */
|
||||||
|
uint32_t stacksize; /* Size of stack (not allocated) */
|
||||||
|
uint32_t dsize; /* Size of dspace (may be large than parts) */
|
||||||
|
|
||||||
|
/* This is temporary memory where relocation records will be loaded. */
|
||||||
|
|
||||||
|
uint32_t relocstart; /* Start of array of struct flat_reloc */
|
||||||
|
uint16_t reloccount; /* Number of elements in reloc array */
|
||||||
|
|
||||||
|
/* File descriptors */
|
||||||
|
|
||||||
|
int filfd; /* Descriptor for the file being loaded */
|
||||||
|
|
||||||
|
/* This is a copy of the ELF header (still in network order) */
|
||||||
|
|
||||||
|
FAR struct elf_hdr_s header;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C" {
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* These are APIs exported by libelf (and may be used outside of NuttX):
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_verifyheader
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Given the header from a possible ELF executable, verify that it is
|
||||||
|
* an ELF executable.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_verifyheader(FAR const struct elf_hdr_s *header);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function is called to configure the library to process an ELF
|
||||||
|
* program binary.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_init(FAR const char *filename,
|
||||||
|
FAR struct elf_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_uninit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Releases any resources committed by elf_init(). This essentially
|
||||||
|
* undoes the actions of elf_init.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_uninit(FAR struct elf_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_load
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Loads the binary into memory, allocating memory, performing relocations
|
||||||
|
* and inializing the data and bss segments.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_load(FAR struct elf_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_read
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Read 'readsize' bytes from the object file at 'offset'
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_read(FAR struct elf_loadinfo_s *loadinfo, FAR char *buffer,
|
||||||
|
FAR int readsize, int offset);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_bind
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Bind the imported symbol names in the loaded module described by
|
||||||
|
* 'loadinfo' using the exported symbol values provided by 'symtab'.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct symtab_s;
|
||||||
|
EXTERN int elf_bind(FAR struct elf_loadinfo_s *loadinfo,
|
||||||
|
FAR const struct symtab_s *exports, int nexports);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_unload
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function unloads the object from memory. This essentially
|
||||||
|
* undoes the actions of elf_load.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_unload(struct elf_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* These are APIs used internally only by NuttX:
|
||||||
|
****************************************************************************/
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* ELF support is built unconditionally. However, it order to
|
||||||
|
* use this binary format, this function must be called during system
|
||||||
|
* format in order to register the ELF binary format.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* This is a NuttX internal function so it follows the convention that
|
||||||
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN int elf_initialize(void);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: elf_uninitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Unregister the ELF binary loader
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
EXTERN void elf_uninitialize(void);
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __INCLUDE_NUTTX_ELF_H */
|
||||||
+19
-19
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* include/nuttx/nxflat.h
|
* include/nuttx/nxflat.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009, 2012 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -110,22 +110,22 @@ extern "C" {
|
|||||||
* These are APIs exported by libnxflat (and may be used outside of NuttX):
|
* These are APIs exported by libnxflat (and may be used outside of NuttX):
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_verifyheader
|
* Name: nxflat_verifyheader
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Given the header from a possible NXFLAT executable, verify that it
|
* Given the header from a possible NXFLAT executable, verify that it is
|
||||||
* is an NXFLAT executable.
|
* an NXFLAT executable.
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_verifyheader(const struct nxflat_hdr_s *header);
|
EXTERN int nxflat_verifyheader(const struct nxflat_hdr_s *header);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_init
|
* Name: nxflat_init
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -136,12 +136,12 @@ EXTERN int nxflat_verifyheader(const struct nxflat_hdr_s *header);
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_init(const char *filename,
|
EXTERN int nxflat_init(const char *filename,
|
||||||
struct nxflat_loadinfo_s *loadinfo);
|
struct nxflat_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_uninit
|
* Name: nxflat_uninit
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -152,11 +152,11 @@ EXTERN int nxflat_init(const char *filename,
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_uninit(struct nxflat_loadinfo_s *loadinfo);
|
EXTERN int nxflat_uninit(struct nxflat_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_load
|
* Name: nxflat_load
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -170,11 +170,11 @@ EXTERN int nxflat_uninit(struct nxflat_loadinfo_s *loadinfo);
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_load(struct nxflat_loadinfo_s *loadinfo);
|
EXTERN int nxflat_load(struct nxflat_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_read
|
* Name: nxflat_read
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -184,12 +184,12 @@ EXTERN int nxflat_load(struct nxflat_loadinfo_s *loadinfo);
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_read(struct nxflat_loadinfo_s *loadinfo, char *buffer,
|
EXTERN int nxflat_read(struct nxflat_loadinfo_s *loadinfo, char *buffer,
|
||||||
int readsize, int offset);
|
int readsize, int offset);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_bind
|
* Name: nxflat_bind
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -202,13 +202,13 @@ EXTERN int nxflat_read(struct nxflat_loadinfo_s *loadinfo, char *buffer,
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
struct symtab_s;
|
struct symtab_s;
|
||||||
EXTERN int nxflat_bind(FAR struct nxflat_loadinfo_s *loadinfo,
|
EXTERN int nxflat_bind(FAR struct nxflat_loadinfo_s *loadinfo,
|
||||||
FAR const struct symtab_s *exports, int nexports);
|
FAR const struct symtab_s *exports, int nexports);
|
||||||
|
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_unload
|
* Name: nxflat_unload
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -219,14 +219,14 @@ EXTERN int nxflat_bind(FAR struct nxflat_loadinfo_s *loadinfo,
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_unload(struct nxflat_loadinfo_s *loadinfo);
|
EXTERN int nxflat_unload(struct nxflat_loadinfo_s *loadinfo);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* These are APIs used internally only by NuttX:
|
* These are APIs used internally only by NuttX:
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/***********************************************************************
|
/****************************************************************************
|
||||||
* Name: nxflat_initialize
|
* Name: nxflat_initialize
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -239,7 +239,7 @@ EXTERN int nxflat_unload(struct nxflat_loadinfo_s *loadinfo);
|
|||||||
* 0 (OK) is returned on success and a negated errno is returned on
|
* 0 (OK) is returned on success and a negated errno is returned on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
***********************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
EXTERN int nxflat_initialize(void);
|
EXTERN int nxflat_initialize(void);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user