更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_load_elf.h
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _LOS_LOAD_ELF_H
33#define _LOS_LOAD_ELF_H
34
35#include "los_ld_elf_pri.h"
36#include "los_elf_auxvec_pri.h"
37#include "los_process_pri.h"
38#include "los_memory.h"
40#include "los_strnlen_user.h"
41#include "los_user_put.h"
42#include "los_user_get.h"
43#include "user_copy.h"
44#include "sys/stat.h"
45#ifdef LOSCFG_DRIVERS_TZDRIVER
46#include "fs/file.h"
47#endif
48#include "unistd.h"
49
50#ifdef __cplusplus
51#if __cplusplus
52extern "C" {
53#endif /* __cplusplus */
54#endif /* __cplusplus */
55
56#define INTERP_FULL_PATH "/lib/libc.so" ///< 解析器路径
57#define INVALID_FD (-1)///< 无效文件描述符,用于初始值.
58#define STRINGS_COUNT_MAX 256 ///< argv[], envp[]最大数量
59#define ELF_PHDR_NUM_MAX 128 ///< ELF最大段数量
60#define FILE_LENGTH_MAX 0x1000000 ///< 段占用的文件大小 最大1M
61#define MEM_SIZE_MAX 0x1000000 ///< 运行时占用进程空间内存大小最大1M
62
63#ifndef FILE_PATH_MAX
64#define FILE_PATH_MAX PATH_MAX
65#endif
66#ifndef FILE_PATH_MIN
67#define FILE_PATH_MIN 2
68#endif
69
70#define USER_STACK_SIZE 0x100000 ///< 用户态空间栈大小1M
71#define USER_PARAM_BYTE_MAX 0x1000 ///< 4K
72#define USER_STACK_TOP_MAX USER_ASPACE_TOP_MAX ///< 用户空间栈顶位置
73
74#define EXEC_MMAP_BASE 0x02000000 //可执行文件分配基地址
75
76#ifdef LOSCFG_ASLR
77#define RANDOM_MASK ((((USER_ASPACE_TOP_MAX + GB - 1) & (-GB)) >> 3) - 1)
78#endif
79
80#define STACK_ALIGN_SIZE 0x10 ///< 栈对齐
81#define RANDOM_VECTOR_SIZE 1
82
83/* The permissions on sections in the program header. | 对段的操作权限*/
84#define PF_R 0x4 ///< 只读
85#define PF_W 0x2 ///< 只写
86#define PF_X 0x1 ///< 可执行
87
88/**@struct
89 * @brief ELF信息结构体
90 */
91typedef struct {
92 LD_ELF_EHDR elfEhdr; ///< ELF头信息
93 LD_ELF_PHDR *elfPhdr; ///< ELF程序头信息,也称段头信息
94 UINT32 fileLen; ///< 文件长度
95 INT32 procfd; ///< 文件描述符
96} ELFInfo;
97
98/**@struct
99 * @brief ELF加载信息
100 */
101typedef struct {
102 ELFInfo execInfo; ///< 可执行文件信息
103 ELFInfo interpInfo;///< 解析器文件信息 lib/libc.so
104 const CHAR *fileName; ///< 文件名称
105 CHAR *execName; ///< 程序名称
106 INT32 argc; ///< 参数个数
107 INT32 envc; ///< 环境变量个数
108 CHAR *const *argv; ///< 参数数组
109 CHAR *const *envp; ///< 环境变量数组
110 UINTPTR stackTop; ///< 栈底位置,递减满栈下,stackTop是高地址位
111 UINTPTR stackTopMax;///< 栈最大上限
112 UINTPTR stackBase; ///< 栈顶位置,栈基地址
113 UINTPTR stackParamBase;///< 栈参数空间,放置启动ELF时的外部参数,大小为 USER_PARAM_BYTE_MAX 4K
114 UINT32 stackSize; ///< 栈大小
115 INT32 stackProt; ///< LD_PT_GNU_STACK栈的权限 ,例如(RW)
116 UINTPTR argStart; ///< 开始参数位置
117 UINTPTR loadAddr; ///< 加载地址
118 UINTPTR elfEntry; ///< 装载点地址 即: _start 函数地址
119 UINTPTR topOfMem; ///< 虚拟空间顶部位置,loadInfo->topOfMem = loadInfo->stackTopMax - sizeof(UINTPTR);
120 UINTPTR oldFiles; ///< 旧空间的文件映像
121 LosVmSpace *newSpace; ///< 新虚拟空间
122 LosVmSpace *oldSpace; ///< 旧虚拟空间
125/// 不超过用户空间顶部位置
126STATIC INLINE BOOL OsIsBadUserAddress(VADDR_T vaddr)
127{
128 return (vaddr >= USER_STACK_TOP_MAX);
129}
130
131extern UINT32 OsGetRndOffset(INT32 randomDevFD);
132extern INT32 OsLoadELFFile(ELFLoadInfo *loadInfo);
133
134#ifdef __cplusplus
135#if __cplusplus
136}
137#endif /* __cplusplus */
138#endif /* __cplusplus */
139
140#endif /* _LOS_ELF_LIB_H */
INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
STATIC INLINE BOOL OsIsBadUserAddress(VADDR_T vaddr)
不超过用户空间顶部位置
Definition: los_load_elf.h:126
UINT32 OsGetRndOffset(INT32 randomDevFD)
Definition: los_load_elf.c:719
signed int INT32
Definition: los_typedef.h:60
unsigned long VADDR_T
Definition: los_typedef.h:208
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
size_t BOOL
Definition: los_typedef.h:88
LD_ELF_EHDR elfEhdr
ELF头信息
Definition: los_load_elf.h:92
INT32 procfd
文件描述符
Definition: los_load_elf.h:95
UINT32 fileLen
文件长度
Definition: los_load_elf.h:94
LD_ELF_PHDR * elfPhdr
ELF程序头信息,也称段头信息
Definition: los_load_elf.h:93
UINTPTR topOfMem
虚拟空间顶部位置,loadInfo->topOfMem = loadInfo->stackTopMax - sizeof(UINTPTR);
Definition: los_load_elf.h:119
LosVmSpace * oldSpace
旧虚拟空间
Definition: los_load_elf.h:122
ELFInfo execInfo
可执行文件信息
Definition: los_load_elf.h:102
UINT32 stackSize
栈大小
Definition: los_load_elf.h:114
UINTPTR elfEntry
装载点地址 即: _start 函数地址
Definition: los_load_elf.h:118
CHAR *const * envp
环境变量数组
Definition: los_load_elf.h:109
CHAR * execName
程序名称
Definition: los_load_elf.h:105
UINTPTR stackParamBase
栈参数空间,放置启动ELF时的外部参数,大小为 USER_PARAM_BYTE_MAX 4K
Definition: los_load_elf.h:113
UINTPTR argStart
开始参数位置
Definition: los_load_elf.h:116
CHAR *const * argv
参数数组
Definition: los_load_elf.h:108
INT32 argc
参数个数
Definition: los_load_elf.h:106
INT32 envc
环境变量个数
Definition: los_load_elf.h:107
const CHAR * fileName
文件名称
Definition: los_load_elf.h:104
UINTPTR oldFiles
旧空间的文件映像
Definition: los_load_elf.h:120
UINTPTR stackTopMax
栈最大上限
Definition: los_load_elf.h:111
LosVmSpace * newSpace
新虚拟空间
Definition: los_load_elf.h:121
INT32 randomDevFD
Definition: los_load_elf.h:123
ELFInfo interpInfo
解析器文件信息 lib/libc.so
Definition: los_load_elf.h:103
UINTPTR stackBase
栈顶位置,栈基地址
Definition: los_load_elf.h:112
UINTPTR stackTop
栈底位置,递减满栈下,stackTop是高地址位
Definition: los_load_elf.h:110
UINTPTR loadAddr
加载地址
Definition: los_load_elf.h:117
INT32 stackProt
LD_PT_GNU_STACK栈的权限 ,例如(RW)
Definition: los_load_elf.h:115
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
Definition: los_vm_map.h:146