Home | History | Annotate | Download | only in sys
      1 /**
      2  * syslinux/module.h
      3  *
      4  * Dynamic ELF modules definitions and services.
      5  */
      6 
      7 #ifndef MODULE_H_
      8 #define MODULE_H_
      9 
     10 #include <stdio.h>
     11 #include <elf.h>
     12 #include <stdint.h>
     13 #include <setjmp.h>
     14 #include <stdbool.h>
     15 #include <linux/list.h>
     16 
     17 #if __SIZEOF_POINTER__ == 4
     18 #include <i386/module.h>
     19 #elif __SIZEOF_POINTER__ == 8
     20 #include <x86_64/module.h>
     21 #else
     22 #error "unsupported architecture"
     23 #endif
     24 
     25 /*
     26  * The maximum length of the module file name (including path), stored
     27  * in the struct module descriptor.
     28  */
     29 #define MODULE_NAME_SIZE		256
     30 
     31 /*
     32  * Some common information about what kind of modules we're dealing with
     33  */
     34 #define EXEC_MODULE			0
     35 #define LIB_MODULE			1
     36 
     37 #define MAX_NR_DEPS			64
     38 
     39 /*
     40  * Initialization and finalization function signatures
     41  */
     42 
     43 /**
     44  * module_main_t - pointer to an entry routine
     45  *
     46  * The entry routine is present only in executable modules, and represents
     47  * the entry point for the program.
     48  */
     49 typedef int (*module_main_t)(int, char**);
     50 
     51 /**
     52  * module_ctor_t - pointer to a constructor or destructor routine
     53  *
     54  * A module may have multiple routines that need to be executed before
     55  * or after the main routine. These are the constructors and
     56  * destructors, respectively.
     57  */
     58 typedef void (*module_ctor_t) (void);
     59 
     60 /**
     61  * struct elf_module - structure encapsulating a module loaded in memory.
     62  *
     63  * Each SYSLINUX ELF module must have an associated struct elf_module descriptor
     64  * that keeps track of memory allocations, symbol information, and various other
     65  * resources needed by the module itself or by other modules that depend on it.
     66  *
     67  * There are two types of modules:
     68  *  - regular modules, which are actual memory images of a loaded & linked shared
     69  *  object (ELF file). Memory is reserved for the struct elf_module structure itself
     70  *  and for the object loadable sections read from the file.
     71  *  - shallow modules, which are not associated with an ELF shared object, but contain
     72  *  metainformation about a memory region already present and containing the
     73  *  actual code and data. One particular usage of shallow modules is to access
     74  *  symbol information from the root COM32 module loaded by the SYSLINUX core.
     75  *  As their name suggests, memory is reserved only for the elf_module structure
     76  *  itself and optionally for a usually small memory region containing metainformation
     77  *  (symbol information).
     78  *
     79  *  Module descriptors are related to each other through dependency information. A module
     80  *  can depend on symbols from other modules, and in turn it can provide symbols used
     81  *  by other dependant modules. This relationship can be described as a directed
     82  *  acyclic graph (DAG). The graph is stored using double linked lists of
     83  *  predecessors and successors. There is also a global linked list containing all
     84  *  the modules currently loaded.
     85  */
     86 struct atexit;
     87 struct elf_module {
     88 	char				name[MODULE_NAME_SIZE]; 		// The module name
     89 
     90 	bool			shallow;	// Whether the module contains any code
     91 
     92 	struct list_head	required;		// Head of the required modules list
     93 	struct list_head	dependants;		// Head of module dependants list
     94 	struct list_head	list;		// The list entry in the module list
     95 
     96 	module_ctor_t		*ctors;		// module constructors
     97 	module_ctor_t		*dtors;		// module destructors
     98 	module_main_t		main_func; // The main function (for executable modules)
     99 
    100 	void				*module_addr; // The module location in the memory
    101 	Elf_Addr			base_addr;	// The base address of the module
    102 	Elf_Word			module_size; // The module size in memory
    103 
    104 	Elf_Word			*hash_table;	// The symbol hash table
    105 	Elf_Word			*ghash_table;	// The GNU style hash table
    106 	char				*str_table;		// The string table
    107 	void 				*sym_table;		// The symbol table
    108 	void				*got;			// The Global Offset Table
    109 	Elf_Dyn			*dyn_table;		// Dynamic loading information table
    110 
    111 	Elf_Word			strtable_size;	// The size of the string table
    112 	Elf_Word			syment_size;	// The size of a symbol entry
    113 	Elf_Word			symtable_size;	// The size of the symbol table
    114 
    115 
    116 	union {
    117 		// Transient - Data available while the module is loading
    118 		struct {
    119 			FILE		*_file;		// The file object of the open file
    120 			Elf_Off	_cr_offset;	// The current offset in the open file
    121 		} l;
    122 
    123 		// Process execution data
    124 		struct {
    125 			jmp_buf		process_exit;	// Exit state
    126 			struct atexit  *atexit_list;	// atexit() chain
    127 		} x;
    128 	} u;
    129 
    130 	// ELF DT_NEEDED entries for this module
    131 	int				nr_needed;
    132 	Elf_Word			needed[MAX_NR_DEPS];
    133 };
    134 
    135 /**
    136  * struct module_dep - structure encapsulating a module dependency need
    137  *
    138  * This structure represents an item in a double linked list of predecessors or
    139  * successors. The item contents is a pointer to the corresponding module descriptor.
    140  */
    141 struct module_dep {
    142 	struct list_head	list;		// The list entry in the dependency list
    143 
    144 	struct elf_module	*module;	// The target module descriptor
    145 };
    146 
    147 
    148 /**
    149  * Unload all modules that have been loaded since @name.
    150  *
    151  * Returns the struct elf_module * for @name or %NULL if no modules
    152  * have been loaded since @name.
    153  */
    154 extern struct elf_module *unload_modules_since(const char *name);
    155 
    156 extern FILE *findpath(char *name);
    157 
    158 
    159 /**
    160  * Names of symbols with special meaning (treated as special cases at linking)
    161  */
    162 #define MODULE_ELF_INIT_PTR		"__module_init_ptr"	// Initialization pointer symbol name
    163 #define MODULE_ELF_EXIT_PTR		"__module_exit_ptr"	// Finalization pointer symbol name
    164 #define MODULE_ELF_MAIN_PTR		"__module_main_ptr" // Entry pointer symbol name
    165 
    166 /**
    167  * modules_head - A global linked list containing all the loaded modules.
    168  */
    169 extern struct list_head modules_head;
    170 
    171 
    172 /**
    173  * for_each_module - iterator loop through the list of loaded modules.
    174  */
    175 #define for_each_module(m)	list_for_each_entry(m, &modules_head, list)
    176 
    177 /**
    178  * for_each_module_safe - iterator loop through the list of loaded modules safe against removal.
    179  */
    180 #define for_each_module_safe(m, n)				\
    181 	list_for_each_entry_safe(m, n, &modules_head, list)
    182 
    183 /**
    184  * module_current - return the module at the head of the module list.
    185  */
    186 static inline struct elf_module *module_current(void)
    187 {
    188 	struct elf_module *head;
    189 
    190 	head = list_entry((&modules_head)->next, typeof(*head), list);
    191 	return head;
    192 }
    193 
    194 /**
    195  * modules_init - initialize the module subsystem.
    196  *
    197  * This function must be called before any module operation is to be performed.
    198  */
    199 extern int modules_init(void);
    200 
    201 
    202 /**
    203  * modules_term - releases all resources pertaining to the module subsystem.
    204  *
    205  * This function should be called after all module operations.
    206  */
    207 extern void modules_term(void);
    208 
    209 
    210 /**
    211  * module_alloc - reserves space for a new module descriptor.
    212  * @name: 	the file name of the module to be loaded.
    213  *
    214  * The function simply allocates a new module descriptor and initializes its fields
    215  * in order to be used by subsequent loading operations.
    216  */
    217 extern struct elf_module *module_alloc(const char *name);
    218 
    219 
    220 /**
    221  * module_load - loads a regular ELF module into memory.
    222  * @module:	the module descriptor returned by module_alloc.
    223  *
    224  * The function reads the module file, checks whether the file has a
    225  * valid structure, then loads into memory the code and the data and performs
    226  * any symbol relocations. A module dependency is created automatically when the
    227  * relocated symbol is defined in a different module.
    228  *
    229  * The function returns 0 if the operation is completed successfully, and
    230  * a non-zero value if an error occurs. Possible errors include invalid module
    231  * structure, missing symbol definitions (unsatisfied dependencies) and memory
    232  * allocation issues.
    233  */
    234 extern int module_load(struct elf_module *module);
    235 
    236 
    237 /**
    238  * module_unload - unloads the module from the system.
    239  * @module: the module descriptor structure.
    240  *
    241  * The function checks to see whether the module can be safely
    242  * removed, then it executes any destructors and releases all the
    243  * associated memory. This function can be applied both for standard
    244  * modules and for shallow modules.
    245  *
    246  * A module can be safely removed from the system when no other modules reference
    247  * symbols from it.
    248  */
    249 extern int module_unload(struct elf_module *module);
    250 
    251 /**
    252  * _module_unload - unloads the module without running destructors
    253  * @module: the module descriptor structure.
    254  *
    255  * This function is the same as module_unload(), except that the
    256  * module's destructors are not executed.
    257  */
    258 extern int _module_unload(struct elf_module *module);
    259 
    260 /**
    261  * get_module_type - get type of the module
    262  * @module: the module descriptor structure.
    263  *
    264  * This function returns the type of module we're dealing with
    265  * either a library module ( LIB_MODULE ), executable module ( EXEC_MODULE ),
    266  * or an error ( UNKNOWN_MODULE ). The way it checks teh type is by checking to see
    267  * if the module has its main_func set ( in which case it's an executable ). In case
    268  * it doesn't it then checks to see if init_func is set ( in which case it's a
    269  * library module. If this isn't the case either we don't know what it is so bail out
    270  */
    271 extern int get_module_type(struct elf_module *module);
    272 
    273 /**
    274  * module_unloadable - checks whether the given module can be unloaded.
    275  * @module: the module descriptor structure
    276  *
    277  * A module can be unloaded from the system when no other modules depend on it,
    278  * that is, no symbols are referenced from it.
    279  */
    280 extern int module_unloadable(struct elf_module *module);
    281 
    282 /**
    283  * module_find - searches for a module by its name.
    284  * @name: the name of the module, as it was specified in module_alloc.
    285  *
    286  * The function returns a pointer to the module descriptor, if found, or
    287  * NULL otherwise.
    288  */
    289 extern struct elf_module *module_find(const char *name);
    290 
    291 /**
    292  * module_find_symbol - searches for a symbol definition in a given module.
    293  * @name: the name of the symbol to be found.
    294  * @module: the module descriptor structure.
    295  *
    296  * The function searches the module symbol table for a symbol matching exactly
    297  * the name provided. The operation uses the following search algorithms, in this
    298  * order:
    299  *  - If a GNU hash table is present in the module, it is used to find the symbol.
    300  *  - If the symbol cannot be found with the first method (either the hash table
    301  *  is not present or the symbol is not found) and if a regular (SysV) hash table
    302  *  is present, a search is performed on the SysV hash table. If the symbol is not
    303  *  found, NULL is returned.
    304  *  - If the second method cannot be applied, a linear search is performed by
    305  *  inspecting every symbol in the symbol table.
    306  *
    307  *  If the symbol is found, a pointer to its descriptor structure is returned, and
    308  *  NULL otherwise.
    309  */
    310 extern Elf_Sym *module_find_symbol(const char *name, struct elf_module *module);
    311 
    312 /**
    313  * global_find_symbol - searches for a symbol definition in the entire module namespace.
    314  * @name: the name of the symbol to be found.
    315  * @module: an optional (may be NULL) pointer to a module descriptor variable that
    316  * will hold the module where the symbol was found.
    317  *
    318  * The function search for the given symbol name in all the modules currently
    319  * loaded in the system, in the reverse module loading order. That is, the most
    320  * recently loaded module is searched first, followed by the previous one, until
    321  * the first loaded module is reached.
    322  *
    323  * If no module contains the symbol, NULL is returned, otherwise the return value is
    324  * a pointer to the symbol descriptor structure. If the module parameter is not NULL,
    325  * it is filled with the address of the module descriptor where the symbol is defined.
    326  */
    327 extern Elf_Sym *global_find_symbol(const char *name, struct elf_module **module);
    328 
    329 /**
    330  * module_get_absolute - converts an memory address relative to a module base address
    331  * to its absolute value in RAM.
    332  * @addr: the relative address to convert.
    333  * @module: the module whose base address is used for the conversion.
    334  *
    335  * The function returns a pointer to the absolute memory address.
    336  */
    337 static inline void *module_get_absolute(Elf_Addr addr, struct elf_module *module) {
    338 	return (void*)(module->base_addr + addr);
    339 }
    340 
    341 /**
    342  * syslinux_current - get the current module process
    343  */
    344 extern struct elf_module *__syslinux_current;
    345 static inline const struct elf_module *syslinux_current(void)
    346 {
    347 	return __syslinux_current;
    348 }
    349 
    350 
    351 #endif // MODULE_H_
    352