Fix and improve dynamic loader

This patch fixes some issues found by Mark Stevens and
improve the dynamic loader.
This commit is contained in:
Neale Ferguson
2023-07-12 14:37:56 -03:00
committed by Xiang Xiao
parent 4d285cb14d
commit 878384fef0
7 changed files with 122 additions and 30 deletions
+3
View File
@@ -175,6 +175,9 @@
#define SHT_REL 9
#define SHT_SHLIB 10
#define SHT_DYNSYM 11
#define SHT_INIT_ARRAY 14
#define SHT_FINI_ARRAY 15
#define SHT_PREINIT_ARRAY 16
#define SHT_LOPROC 0x70000000
#define SHT_HIPROC 0x7fffffff
#define SHT_LOUSER 0x80000000
+5
View File
@@ -40,6 +40,11 @@
#define ELF32_ST_TYPE(i) ((i) & 0xf)
#define ELF32_ST_INFO(b,t) (((b) << 4) | ((t) & 0xf))
/* Generic macro to abstract ELF32/ELF64 type/bind */
#define ELF_ST_TYPE(a) ELF32_ST_TYPE(a)
#define ELF_ST_BIND(a) ELF32_ST_BIND(a)
/* Definitions for Elf32_Rel*::r_info */
#define ELF32_R_SYM(i) ((i) >> 8)
+14 -5
View File
@@ -38,14 +38,23 @@
/* See ELF-64 Object File Format: Version 1.5 Draft 2 */
#define ELF64_ST_BIND(i) ((i) >> 4)
#define ELF64_ST_TYPE(i) ((i) & 0xf)
#define ELF64_ST_INFO(b,t) (((b) << 4) | ((t) & 0xf))
/* Generic macro to abstract ELF32/ELF64 type/bind */
#define ELF_ST_TYPE(a) ELF64_ST_TYPE(a)
#define ELF_ST_BIND(a) ELF64_ST_BIND(a)
/* Definitions for Elf64_Rel*::r_info */
#define ELF64_R_SYM(i) ((i) >> 32)
#define ELF64_R_TYPE(i) ((i) & 0xffffffffL)
#define ELF64_R_INFO(s,t) (((s)<< 32) + ((t) & 0xffffffffL))
#define ELF64_R_SYM(i) ((i) >> 32)
#define ELF64_R_TYPE(i) ((i) & 0xffffffffL)
#define ELF64_R_INFO(s,t) (((s)<< 32) + ((t) & 0xffffffffL))
#define ELF_R_SYM(i) ELF64_R_SYM(i)
#define ELF_R_TYPE(i) ELF64_R_TYPE(i)
#define ELF_R_SYM(i) ELF64_R_SYM(i)
#define ELF_R_TYPE(i) ELF64_R_TYPE(i)
/****************************************************************************
* Public Type Definitions
+8
View File
@@ -173,6 +173,8 @@ struct module_s
FAR struct module_s *dependencies[CONFIG_MODLIB_MAXDEPEND];
#endif
uintptr_t finiarr; /* .fini_array */
uint16_t nfini; /* Number of entries in .fini_array */
};
/* This struct provides a description of the currently loaded instantiation
@@ -202,6 +204,12 @@ struct mod_loadinfo_s
uint8_t *iobuffer; /* File I/O buffer */
uintptr_t datasec; /* ET_DYN - data area start from Phdr */
uintptr_t segpad; /* Padding between text and data */
uintptr_t initarr; /* .init_array */
uintptr_t finiarr; /* .fini_array */
uintptr_t preiarr; /* .preinit_array */
uint16_t ninit; /* Number of .init_array entries */
uint16_t nfini; /* Number of .fini_array entries */
uint16_t nprei; /* Number of .preinit_array entries */
uint16_t symtabidx; /* Symbol table section index */
uint16_t strtabidx; /* String table section index */
uint16_t dsymtabidx; /* Dynamic symbol table section index */