c749e4bfbd
Load all sections to LMA not VMA, so the startup code(e.g. start.S) need relocate .data section to the final address(VMA) and zero .bss section by self. For example, SiFli and Actions: Background: Device with small sram, Bootloader run in sram and psram, need boot to Application, with memory overlap and without XIP. VMA of .data is in "psram" and LMA in "rom", if not enable `ELF_LOADTO_LMA`, ELF loader will load the section to VMA (will fill bootloader itself). Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
344 lines
11 KiB
C
344 lines
11 KiB
C
/****************************************************************************
|
|
* binfmt/libelf/libelf.h
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __BINFMT_LIBELF_LIBELF_H
|
|
#define __BINFMT_LIBELF_LIBELF_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/binfmt/elf.h>
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* 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(FAR const Elf_Ehdr *header);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_read
|
|
*
|
|
* Description:
|
|
* Read 'readsize' bytes from the object file at 'offset'. The data is
|
|
* read into 'buffer.' If 'buffer' is part of the ELF address environment,
|
|
* then the caller is responsible for assuring that that address
|
|
* environment is in place before calling this function (i.e., that
|
|
* elf_addrenv_select() has been called if CONFIG_ARCH_ADDRENV=y).
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_read(FAR struct elf_loadinfo_s *loadinfo, FAR uint8_t *buffer,
|
|
size_t readsize, off_t offset);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_loadphdrs
|
|
*
|
|
* Description:
|
|
* Loads program headers into memory.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_loadphdrs(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_loadshdrs
|
|
*
|
|
* Description:
|
|
* Loads section headers into memory.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_loadshdrs(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_findsection
|
|
*
|
|
* Description:
|
|
* A section by its name.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
* sectname - Name of the section to find
|
|
*
|
|
* Returned Value:
|
|
* On success, the index to the section is returned; A negated errno value
|
|
* is returned on failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_findsection(FAR struct elf_loadinfo_s *loadinfo,
|
|
FAR const char *sectname);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_findsymtab
|
|
*
|
|
* Description:
|
|
* Find the symbol table section.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_findsymtab(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_readsym
|
|
*
|
|
* Description:
|
|
* Read the ELF symbol structure at the specified index into memory.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
* index - Symbol table index
|
|
* sym - Location to return the table entry
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_readsym(FAR struct elf_loadinfo_s *loadinfo, int index,
|
|
FAR Elf_Sym *sym);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_symvalue
|
|
*
|
|
* Description:
|
|
* Get the value of a symbol. The updated value of the symbol is returned
|
|
* in the st_value field of the symbol table entry.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
* sym - Symbol table entry (value might be undefined)
|
|
* exports - The symbol table to use for resolving undefined symbols.
|
|
* nexports - Number of symbols in the symbol table.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
* EINVAL - There is something inconsistent in the symbol table (should
|
|
* only happen if the file is corrupted)
|
|
* ENOSYS - Symbol lies in common
|
|
* ESRCH - Symbol has no name
|
|
* ENOENT - Symbol undefined and not provided via a symbol table
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_symvalue(FAR struct elf_loadinfo_s *loadinfo, FAR Elf_Sym *sym,
|
|
FAR const struct symtab_s *exports, int nexports);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_freebuffers
|
|
*
|
|
* Description:
|
|
* Release all working buffers.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_freebuffers(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_allocbuffer
|
|
*
|
|
* Description:
|
|
* Perform the initial allocation of the I/O buffer, if it has not already
|
|
* been allocated.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_allocbuffer(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_reallocbuffer
|
|
*
|
|
* Description:
|
|
* Increase the size of I/O buffer by the specified buffer increment.
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_reallocbuffer(FAR struct elf_loadinfo_s *loadinfo, size_t increment);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_findctors
|
|
*
|
|
* Description:
|
|
* Find C++ static constructors.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_BINFMT_CONSTRUCTORS
|
|
int elf_loadctors(FAR struct elf_loadinfo_s *loadinfo);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: elf_loaddtors
|
|
*
|
|
* Description:
|
|
* Load pointers to static destructors into an in-memory array.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
*
|
|
* Returned Value:
|
|
* 0 (OK) is returned on success and a negated errno is returned on
|
|
* failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_BINFMT_CONSTRUCTORS
|
|
int elf_loaddtors(FAR struct elf_loadinfo_s *loadinfo);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: elf_addrenv_alloc
|
|
*
|
|
* Description:
|
|
* Allocate memory for the ELF image (textalloc and dataalloc).
|
|
* If CONFIG_ARCH_ADDRENV=n, textalloc will be allocated using kmm_zalloc()
|
|
* and dataalloc will be a offset from textalloc.
|
|
* If CONFIG_ARCH_ADDRENV=y, then textalloc and dataalloc will be allocated
|
|
* using up_addrenv_create().
|
|
* In either case, there will be a unique instance of textalloc and
|
|
* dataalloc (and stack) for each instance of a process.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
* textsize - The size (in bytes) of the .text address environment needed
|
|
* for the ELF image (read/execute).
|
|
* datasize - The size (in bytes) of the .bss/.data address environment
|
|
* needed for the ELF image (read/write).
|
|
* heapsize - The initial size (in bytes) of the heap address environment
|
|
* needed by the task. This region may be read/write only.
|
|
*
|
|
* Returned Value:
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int elf_addrenv_alloc(FAR struct elf_loadinfo_s *loadinfo, size_t textsize,
|
|
size_t datasize, size_t heapsize);
|
|
|
|
/****************************************************************************
|
|
* Name: elf_addrenv_select
|
|
*
|
|
* Description:
|
|
* Temporarily select the task's address environment.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
*
|
|
* Returned Value:
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_ARCH_ADDRENV
|
|
int elf_addrenv_select(FAR struct elf_loadinfo_s *loadinfo);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: elf_addrenv_restore
|
|
*
|
|
* Description:
|
|
* Restore the address environment before elf_addrenv_select() was called..
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
*
|
|
* Returned Value:
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_ARCH_ADDRENV
|
|
int elf_addrenv_restore(FAR struct elf_loadinfo_s *loadinfo);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: elf_addrenv_free
|
|
*
|
|
* Description:
|
|
* Release the address environment previously created by
|
|
* elf_addrenv_alloc(). This function is called only under certain error
|
|
* conditions after the module has been loaded but not yet started.
|
|
* After the module has been started, the address environment will
|
|
* automatically be freed when the module exits.
|
|
*
|
|
* Input Parameters:
|
|
* loadinfo - Load state information
|
|
*
|
|
* Returned Value:
|
|
* None.
|
|
*
|
|
****************************************************************************/
|
|
|
|
void elf_addrenv_free(FAR struct elf_loadinfo_s *loadinfo);
|
|
|
|
#endif /* __BINFMT_LIBELF_LIBELF_H */
|