xref: /haiku/headers/private/runtime_loader/runtime_loader.h (revision 2b76973fa2401f7a5edf68e6470f3d3210cbcff3)
1 /*
2  * Copyright 2008-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2003-2011, Axel Dörfler, axeld@pinc-software.de.
4  * Distributed under the terms of the MIT License.
5  *
6  * Copyright 2002, Manuel J. Petit. All rights reserved.
7  * Copyright 2001, Travis Geiselbrecht. All rights reserved.
8  * Distributed under the terms of the NewOS License.
9  */
10 
11 #ifndef _RUNTIME_LOADER_H
12 #define _RUNTIME_LOADER_H
13 
14 #include <image.h>
15 #include <OS.h>
16 
17 #include <elf32.h>
18 #include <elf64.h>
19 
20 
21 // #pragma mark - runtime loader libroot interface
22 
23 
24 struct user_space_program_args;
25 struct SymbolLookupInfo;
26 
27 struct rld_export {
28 	// runtime loader API export
29 	image_id (*load_add_on)(char const *path, uint32 flags);
30 	status_t (*unload_add_on)(image_id imageID);
31 	image_id (*load_library)(char const *path, uint32 flags, void **_handle);
32 	status_t (*unload_library)(void* handle);
33 	status_t (*get_image_symbol)(image_id imageID, char const *symbolName,
34 		int32 symbolType, bool recursive, image_id *_inImage, void **_location);
35 	status_t (*get_library_symbol)(void* handle, void* caller,
36 		const char* symbolName, void **_location);
37 	status_t (*get_nth_image_symbol)(image_id imageID, int32 num,
38 		char *symbolName, int32 *nameLength, int32 *symbolType,
39 		void **_location);
40 	status_t (*get_nearest_symbol_at_address)(void* address,
41 		image_id* _imageID,	char** _imagePath, char** _symbolName,
42 		int32* _type, void** _location);
43 	status_t (*test_executable)(const char *path, char *interpreter);
44 	status_t (*get_executable_architecture)(const char *path,
45 		const char** _architecture);
46 	status_t (*get_next_image_dependency)(image_id id, uint32 *cookie,
47 		const char **_name);
48 
49 	status_t (*reinit_after_fork)();
50 
51 	void (*call_atexit_hooks_for_range)(addr_t start, addr_t size);
52 
53 	void (*call_termination_hooks)();
54 
55 	const struct user_space_program_args *program_args;
56 	const void* commpage_address;
57 	int abi_version;
58 };
59 
60 extern struct rld_export *__gRuntimeLoader;
61 
62 
63 // #pragma mark - runtime loader debugger interface
64 
65 
66 struct RuntimeLoaderSymbolPatcher;
67 
68 typedef struct elf_region_t {
69 	area_id		id;
70 	addr_t		start;
71 	addr_t		size;
72 	addr_t		vmstart;
73 	addr_t		vmsize;
74 	addr_t		fdstart;
75 	addr_t		fdsize;
76 	long		delta;
77 	uint32		flags;
78 } elf_region_t;
79 
80 typedef struct elf_version_info {
81 	uint32		hash;			// version name hash
82 	const char	*name;			// version name
83 	const char	*file_name;		// dependency file name (needed versions only)
84 } elf_version_info;
85 
86 typedef struct image_t {
87 	// image identification
88 	char				path[B_PATH_NAME_LENGTH];
89 	char				name[B_OS_NAME_LENGTH];
90 	image_id			id;
91 	image_type			type;
92 
93 	struct image_t		*next;
94 	struct image_t		*prev;
95 	int32				ref_count;
96 	uint32				flags;
97 
98 	uint32				api_version;
99 	uint32				abi;
100 
101 	addr_t 				entry_point;
102 	addr_t				init_routine;
103 	addr_t				term_routine;
104 	addr_t 				dynamic_ptr; 	// pointer to the dynamic section
105 
106 	// pointer to symbol participation data structures
107 	uint32				*symhash;
108 	elf_sym				*syms;
109 	char				*strtab;
110 	elf_rel				*rel;
111 	int					rel_len;
112 	elf_rela			*rela;
113 	int					rela_len;
114 	elf_rel				*pltrel;
115 	int					pltrel_len;
116 
117 	uint32				num_needed;
118 	struct image_t		**needed;
119 
120 	// versioning related structures
121 	uint32				num_version_definitions;
122 	elf_verdef			*version_definitions;
123 	uint32				num_needed_versions;
124 	elf_verneed			*needed_versions;
125 	elf_versym			*symbol_versions;
126 	elf_version_info	*versions;
127 	uint32				num_versions;
128 
129 #ifdef __cplusplus
130 	elf_sym*			(*find_undefined_symbol)(struct image_t* rootImage,
131 							struct image_t* image,
132 							const SymbolLookupInfo& lookupInfo,
133 							struct image_t** foundInImage);
134 #else
135 	elf_sym*			(*find_undefined_symbol)(struct image_t* rootImage,
136 							struct image_t* image,
137 							const struct SymbolLookupInfo* lookupInfo,
138 							struct image_t** foundInImage);
139 #endif
140 
141 	// Singly-linked list of symbol patchers for symbols defined respectively
142 	// referenced by this image.
143 	struct RuntimeLoaderSymbolPatcher	*defined_symbol_patchers;
144 	struct RuntimeLoaderSymbolPatcher	*undefined_symbol_patchers;
145 
146 	// describes the text and data regions
147 	uint32				num_regions;
148 	elf_region_t		regions[1];
149 } image_t;
150 
151 typedef struct image_queue_t {
152 	image_t *head;
153 	image_t *tail;
154 } image_queue_t;
155 
156 // image_t::flags
157 #define	IMAGE_FLAG_RTLD_MASK			0x03
158 			// RTLD_{LAZY,NOW} | RTLD_{LOCAL,GLOBAL}
159 
160 #define STRING(image, offset) ((char*)(&(image)->strtab[(offset)]))
161 #define SYMNAME(image, sym) STRING(image, (sym)->st_name)
162 #define SYMBOL(image, num) (&(image)->syms[num])
163 #define HASHTABSIZE(image) ((image)->symhash[0])
164 #define HASHBUCKETS(image) ((unsigned int*)&(image)->symhash[2])
165 #define HASHCHAINS(image) ((unsigned int*)&(image)->symhash[2+HASHTABSIZE(image)])
166 
167 
168 // The name of the area the runtime loader creates for debugging purposes.
169 #define RUNTIME_LOADER_DEBUG_AREA_NAME	"_rld_debug_"
170 
171 // The contents of the runtime loader debug area.
172 typedef struct runtime_loader_debug_area {
173 	image_queue_t	*loaded_images;
174 } runtime_loader_debug_area;
175 
176 
177 // #pragma mark - runtime loader add-on interface
178 
179 
180 // symbol patcher callback
181 typedef void runtime_loader_symbol_patcher(void* cookie,
182 	struct image_t* rootImage, struct image_t* image, const char* name,
183 	struct image_t** foundInImage, void** symbol, int32* type);
184 
185 // interface provided to add-ons
186 struct runtime_loader_add_on_export {
187 	status_t	(*register_defined_symbol_patcher)(struct image_t* image,
188 					runtime_loader_symbol_patcher* patcher, void* cookie);
189 	void		(*unregister_defined_symbol_patcher)(struct image_t* image,
190 					runtime_loader_symbol_patcher* patcher, void* cookie);
191 	status_t	(*register_undefined_symbol_patcher)(struct image_t* image,
192 					runtime_loader_symbol_patcher* patcher, void* cookie);
193 	void		(*unregister_undefined_symbol_patcher)(struct image_t* image,
194 					runtime_loader_symbol_patcher* patcher, void* cookie);
195 };
196 
197 
198 #define RUNTIME_LOADER_ADD_ON_VERSION	1
199 
200 typedef struct runtime_loader_add_on {
201 	uint32	version;
202 	uint32	flags;
203 
204 	// called after the add-on image has been loaded
205 	void	(*init)(struct rld_export* standardInterface,
206 				struct runtime_loader_add_on_export* addOnInterface);
207 
208 	// called whenever the respective image event occurs
209 	void	(*image_loaded)(struct image_t* image);
210 	void	(*image_relocated)(struct image_t* image);
211 	void	(*image_initialized)(struct image_t* image);
212 	void	(*image_uninitializing)(struct image_t* image);
213 	void	(*image_unloading)(struct image_t* image);
214 } runtime_loader_add_on;
215 
216 // This is the variable a preloaded shared object has to export to get picked up
217 // by the runtime loader as an add-on.
218 extern runtime_loader_add_on __gRuntimeLoaderAddOn;
219 
220 #endif	// _RUNTIME_LOADER_H
221