1 /* 2 * Copyright 2007-2009, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT license. 4 */ 5 #ifndef _IMAGE_H 6 #define _IMAGE_H 7 8 9 #include <OS.h> 10 #include <sys/param.h> 11 12 13 typedef int32 image_id; 14 15 typedef enum { 16 B_APP_IMAGE = 1, 17 B_LIBRARY_IMAGE, 18 B_ADD_ON_IMAGE, 19 B_SYSTEM_IMAGE 20 } image_type; 21 22 typedef struct { 23 image_id id; 24 image_type type; 25 int32 sequence; 26 int32 init_order; 27 void (*init_routine)(); 28 void (*term_routine)(); 29 dev_t device; 30 ino_t node; 31 char name[MAXPATHLEN]; 32 void *text; 33 void *data; 34 int32 text_size; 35 int32 data_size; 36 37 // Haiku R1 extensions 38 int32 api_version; // the Haiku API version used by the image 39 int32 abi; // the Haiku ABI used by the image 40 } image_info; 41 42 // flags for clear_caches() 43 #define B_FLUSH_DCACHE 0x0001 /* data cache */ 44 #define B_FLUSH_ICACHE 0x0004 /* instruction cache */ 45 #define B_INVALIDATE_DCACHE 0x0002 46 #define B_INVALIDATE_ICACHE 0x0008 47 48 // symbol types 49 #define B_SYMBOL_TYPE_DATA 0x1 50 #define B_SYMBOL_TYPE_TEXT 0x2 51 #define B_SYMBOL_TYPE_ANY 0x5 52 53 // initialization/termination functions of shared objects 54 #define B_INIT_BEFORE_FUNCTION_NAME "initialize_before" 55 #define B_INIT_AFTER_FUNCTION_NAME "initialize_after" 56 #define B_TERM_BEFORE_FUNCTION_NAME "terminate_before" 57 #define B_TERM_AFTER_FUNCTION_NAME "terminate_after" 58 59 #define B_APP_IMAGE_SYMBOL ((void*)(addr_t)0) 60 // value that can be used instead of a pointer to a symbol in the program 61 // image. 62 #define B_CURRENT_IMAGE_SYMBOL ((void*)&__haiku_init_before) 63 // pointer to a symbol in the callers image 64 65 // flags for _kern_load_image() (private API) 66 enum { 67 B_WAIT_TILL_LOADED = 0x01, 68 // Wait till the loader has loaded and relocated 69 // (but not yet initialized) the application 70 // image and all dependencies. If not supplied, 71 // the function returns before the loader 72 // started to do anything at all, i.e. it 73 // returns success, even if the executable 74 // doesn't exist. 75 }; 76 77 #ifdef __cplusplus 78 extern "C" { 79 #endif 80 81 thread_id load_image(int32 argc, const char **argv, const char **environ); 82 image_id load_add_on(const char *path); 83 status_t unload_add_on(image_id image); 84 status_t get_image_symbol(image_id image, const char *name, int32 symbolType, 85 void **_symbolLocation); 86 status_t get_nth_image_symbol(image_id image, int32 n, char *nameBuffer, 87 int32 *_nameLength, int32 *_symbolType, void **_symbolLocation); 88 void clear_caches(void *address, size_t length, uint32 flags); 89 90 #define get_image_info(image, info) \ 91 _get_image_info((image), (info), sizeof(*(info))) 92 #define get_next_image_info(team, cookie, info) \ 93 _get_next_image_info((team), (cookie), (info), sizeof(*(info))) 94 95 /* private, use the macros above */ 96 status_t _get_image_info(image_id image, image_info *info, size_t size); 97 status_t _get_next_image_info(team_id team, int32 *cookie, image_info *info, 98 size_t size); 99 100 /* private */ 101 void __haiku_init_before(image_id id); 102 103 #ifdef __cplusplus 104 } 105 #endif 106 107 #endif /* _IMAGE_H */ 108