Changeset 2825
- Timestamp:
- Oct 22, 2006, 5:57:19 PM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 8 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/Makefile.kmk
r2821 r2825 27 27 28 28 # 29 # The kLDr DLL. 30 # 29 # Template for testcases. 30 # 31 TEMPLATE_TST = Testcase template 32 ifneq ($(filter win nt win32 win64,$(BUILD_TARGET)),) 33 TEMPLATE_TST_TOOL = VCC70 34 TEMPLATE_TST_CFLAGS = -W3 -Zi -Zl -MD 35 TEMPLATE_TST_CFLAGS.release = -O2 36 TEMPLATE_TST_ASFLAGS = -f win 37 TEMPLATE_TST_DEFS = __WIN__ 38 TEMPLATE_TST_SDKS = WIN32SDK 39 #kLdr_SDKS.x86 = WIN32SDK 40 #kLdr_SDKS.amd64 = WIN64SDK 41 42 ## @todo this is a kBuild bug! 43 TEMPLATE_TST_LIBS = \ 44 $$(PATH_TOOL_VCC70_LIB)/msvcrt.lib 45 else 46 ifneq ($(filter os2,$(BUILD_TARGET)),) 47 TEMPLATE_TST_TOOL = GCC3OMF 48 TEMPLATE_TST_ASFLAGS = -f obj 49 TEMPLATE_TST_LIBS = os2 gcc end 50 else 51 TEMPLATE_TST_TOOL = GCC3 52 TEMPLATE_TST_ASFLAGS = -f elf 53 TEMPLATE_TST_LIBS = gcc 54 endif 55 TEMPLATE_TST_CFLAGS = -Wall -pedantic -g 56 TEMPLATE_TST_CFLAGS.release = -O2 57 TEMPLATE_TST_LDFLAGS = 58 endif 59 TEMPLATE_TST_INCS = . 60 61 62 # 63 # The kLdr DLL. 64 # 31 65 DLLS = kLdr 32 kLdr_TOOL = GCC3OMF33 66 kLdr_ASTOOL = NASM 34 kLdr_ASFLAGS = -f obj 35 kLdr_CFLAGS = -Wall -pedantic 36 kLdr_LDFLAGS = -nostdlib 37 kLdr_LIBS = os2 gcc end 67 ifneq ($(filter win nt win32 win64,$(BUILD_TARGET)),) 68 kLdr_TOOL = GCC3 69 kLdr_TOOL = VCC70 70 kLdr_CFLAGS = -W3 -Zl 71 kLdr_ASFLAGS = -f win 72 kLdr_DEFS = __WIN__ 73 kLdr_SDKS = WIN32SDK 74 #kLdr_SDKS.x86 = WIN32SDK 75 #kLdr_SDKS.amd64 = WIN64SDK 76 else 77 ifneq ($(filter os2,$(BUILD_TARGET)),) 78 kLdr_TOOL = GCC3OMF 79 kLdr_ASFLAGS = -f obj 80 kLdr_LIBS = os2 gcc end 81 else 82 kLdr_TOOL = GCC3 83 kLdr_ASFLAGS = -f elf 84 kLdr_LIBS = gcc 85 endif 86 kLdr_CFLAGS = -Wall -pedantic 87 kLdr_LDFLAGS = -nostdlib 88 endif 89 kLdr_INCS = . 38 90 kLdr_SOURCES = \ 39 91 kLdr.c \ 92 kLdrHlp.c \ 93 kLdrHlpHeap.c \ 94 kLdrRdr.c \ 95 kLdrRdrFile.c \ 40 96 kLdrLX.c 41 97 kLdr_SOURCES.os2 = \ … … 45 101 # 46 102 # The OS/2 stub program. 47 # 48 PROGRAMS = kLdrExeStub-os2103 # 104 PROGRAMS.os2 = kLdrExeStub-os2 49 105 kLdrExeStub-os2_TOOL = GCC3OMF 50 106 kLdrExeStub-os2_ASTOOL = NASM … … 53 109 kLdrExeStub-os2_LIBS = $(TARGET_kLdr) 54 110 kLdrExeStub-os2_SOURCES = kLdrExeStub-os2.asm 55 111 56 112 ## 57 113 ## The (stub) utility. 58 ## 114 ## 59 115 #PROGRAMS = kLdrUtil 60 116 117 118 # 119 # Heap testcase. 120 # 121 PROGRAMS += tstkLdrHeap 122 tstkLdrHeap_TEMPLATE = TST 123 tstkLdrHeap_SOURCES = \ 124 tstkLdrHeap.c \ 125 kLdrHlp.c \ 126 kLdrHlpHeap.c \ 127 61 128 62 129 # generate rules. -
trunk/kLdr/kLdr.c
r2824 r2825 49 49 #include "kLdrHlp.h" 50 50 51 51 #if 0 52 52 /******************************************************************************* 53 53 * Global Variables * … … 195 195 } 196 196 197 #endif -
trunk/kLdr/kLdr.h
r2824 r2825 34 34 /* kLdr depend on size_t, [u]intNN_t, [u]intptr_t and some related constants. */ 35 35 #include <sys/types.h> 36 #include <stdint.h> 37 38 39 /** A KLDRMOD handle. */ 40 typedef struct KLDRMOD *HKLDRMOD; 36 #include <stddef.h> 37 #ifdef _MSC_VER 38 typedef signed char int8_t; 39 typedef unsigned char uint8_t; 40 typedef signed short int16_t; 41 typedef unsigned short uint16_t; 42 typedef signed int int32_t; 43 typedef unsigned int uint32_t; 44 typedef signed __int64 int64_t; 45 typedef unsigned __int64 uint64_t; 46 typedef uint64_t uintmax_t; 47 #else 48 # include <stdint.h> 49 #endif 50 51 52 /** @defgroup grp_kLdrRdr kLdrRdr - The file provider 53 * @{ */ 54 55 /** Pointer to a file provider instance core. */ 56 typedef struct KLDRRDR *PKLDRRDR; 57 /** Pointer to a file provider instance core pointer. */ 58 typedef struct KLDRRDR **PPKLDRRDR; 59 60 /** 61 * File provider instance operations. 62 */ 63 typedef struct KLDRRDROPS 64 { 65 /** The name of this file provider. */ 66 const char *pszName; 67 /** Pointer to the next file provider. */ 68 const struct KLDRRDROPS *pNext; 69 70 /** Try create a new file provider instance. 71 * 72 * @returns 0 on success, OS specific error code on failure. 73 * @param ppRdr Where to store the file provider instance. 74 * @param pszFilename The filename to open. 75 */ 76 int (* pfnCreate)( PPKLDRRDR ppRdr, const char *pszFilename); 77 /** Destroy the file provider instance. 78 * 79 * @returns 0 on success, OS specific error code on failure. 80 * On failure, the file provider instance will be in an indeterminate state - don't touch it! 81 * @param pRdr The file provider instance. 82 */ 83 int (* pfnDestroy)( PKLDRRDR pRdr); 84 /** Read bits from the file. 85 * 86 * @returns 0 on success, OS specific error code on failure. 87 * @param pRdr The file provider instance. 88 * @param pvBuf Where to put the bits. 89 * @param cb The number of bytes to read. 90 * @param off Where to start reading. 91 */ 92 int (* pfnRead)( PKLDRRDR pRdr, void *pvBuf, size_t cb, off_t off); 93 /** Map all the file bits into memory (read only). 94 * 95 * @returns 0 on success, OS specific error code on failure. 96 * @param pRdr The file provider instance. 97 * @param ppvBits Where to store the address of the mapping. 98 * The size can be obtained using pfnSize. 99 */ 100 int (* pfnAllMap)( PKLDRRDR pRdr, const void **ppvBits); 101 /** Unmap a file bits mapping obtained by KLDRRDROPS::pfnAllMap. 102 * 103 * @returns 0 on success, OS specific error code on failure. 104 * @param pRdr The file provider instance. 105 * @param pvBits The mapping address. 106 */ 107 int (* pfnAllUnmap)(PKLDRRDR pRdr, const void *pvBits); 108 /** @todo generic mmap/MapViewOfFile */ 109 /** Get the file size. 110 * 111 * @returns The file size. Returns -1 on failure. 112 * @param pRdr The file provider instance. 113 */ 114 off_t (* pfnSize)( PKLDRRDR pRdr); 115 /** Get the file pointer offset. 116 * 117 * @returns The file pointer offset. Returns -1 on failure. 118 * @param pRdr The file provider instance. 119 */ 120 off_t (* pfnTell)( PKLDRRDR pRdr); 121 /** Get the file name. 122 * 123 * @returns The file size. Returns -1 on failure. 124 * @param pRdr The file provider instance. 125 */ 126 const char * (* pfnName)(PKLDRRDR pRdr); 127 } KLDRRDROPS; 128 /** Pointer to file provider operations. */ 129 typedef KLDRRDROPS *PKLDRRDROPS; 130 /** Pointer to const file provider operations. */ 131 typedef const KLDRRDROPS *PCKLDRRDROPS; 132 133 134 /** 135 * File provider instance core. 136 */ 137 typedef struct KLDRRDR 138 { 139 /** Pointer to the file provider operations. */ 140 PCKLDRRDROPS pOps; 141 } KLDRRDR; 142 143 void kLdrRdrAddProvider(PKLDRRDROPS pAdd); 144 145 int kLdrRdrOpen( PPKLDRRDR ppRdr, const char *pszFilename); 146 int kLdrRdrClose( PKLDRRDR pRdr); 147 int kLdrRdrRead( PKLDRRDR pRdr, void *pvBuf, size_t cb, off_t off); 148 int kLdrRdrAllMap( PKLDRRDR pRdr, const void **ppvBits); 149 int kLdrRdrAllUnmap(PKLDRRDR pRdr, const void *pvBits); 150 off_t kLdrRdrSize( PKLDRRDR pRdr); 151 off_t kLdrRdrTell( PKLDRRDR pRdr); 152 const char *kLdrRdrName(PKLDRRDR pRdr); 153 154 /** @} */ 155 156 157 158 /** @defgroup grp_kLdrMod kLdrMod - The executable image intepreter 159 * @{ */ 41 160 42 161 /** … … 81 200 82 201 /** 83 * The state of a module.84 */85 typedef enum KLDRSTATE86 {87 /** The usual invalid 0 enum. */88 KLDRSTATE_INVALID = 0,89 /** kldrOpen succeeded.90 * Modules in this state will be freed at */91 KLDRSTATE_OPEN,92 /** Dependencies has been loaded. */93 KLDRSTATE_DEPS,94 /** Fixups has been applied. */95 KLDRSTATE_FIXED,96 /** The module has been initialized. */97 KLDRSTATE_INITED,98 /** The module is loaded successfully. */99 KLDRSTATE_LOADED,100 /** The end of valid states (exclusive) */101 KLDRSTATE_END,102 /** The usual 32-bit blowup. */103 KLDRSTATE_32BIT_HACK = 0x7fffffff104 } KLDRSTATE;105 106 107 /**108 202 * Loader module. 109 203 */ 110 204 typedef struct KLDRMOD 111 205 { 112 /** Pointer to the next module. */ 113 struct KLDRMOD *pNext; 114 /** Pointer to the previous module. */ 115 struct KLDRMOD *pPrev; 116 /** Our module handle. */ 117 HKLDRMOD hmod; 206 /** Magic number. */ 207 uint32_t u32Magic; 208 /** The type of module this is. */ 209 KLDRTYPE enmType; 118 210 /** The module data. */ 119 211 void *pvData; 120 /** The type of module this is. */121 KLDRTYPE enmType;122 /** The module state. */123 KLDRSTATE enmState;124 /** The number of references. */125 uint32_t cRefs;126 /** The number of dynamic references. */127 uint32_t cDynRefs;128 /** Magic number. */129 uint32_t u32Magic;130 /** Set if this is the executable module. */131 uint32_t fExecutable : 1;132 /** Global DLL (set) or specific DLL (clear). */133 uint32_t fGlobal : 1;134 /** Load stage one. */135 uint32_t fLoadStageOne : 1;136 /** Reserved for future use. */137 uint32_t fReserved : 29;138 212 /** The filename length (bytes). */ 139 213 uint32_t cchFilename; … … 150 224 } KLDRMOD, *PKLDRMOD, **PPKLDRMOD; 151 225 152 /** Pointer to the head module (the executable). */ 153 extern PKLDRMOD kLdrModuleHead; 154 /** Pointer to the tail module. */ 155 extern PKLDRMOD kLdrModuleTail; 156 /** The Library search path. */ 157 extern char kLdrLibraryPath[4096]; 226 227 int kLdrModOpen(const char *pszFilename, PPKLDRMOD ppMod); 228 int kLdrModClose(PKLDRMOD pMod); 229 int kLdrModGetSymbol(PKLDRMOD pMod, const void *pvBits, uintmax_t BaseAddress, const char *pszSymbol, uintmax_t *pValue, unsigned *pfType); 230 int kLdrModGetSymbol(PKLDRMOD pMod, const void *pvBits, uintmax_t BaseAddress, const char *pszSymbol, uintmax_t *pValue, unsigned *pfType); 231 232 size_t kLdrModSize(PKLDRMOD pMod); 233 234 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, const char *pszModule, const char *pszSymbol, unsigned uSymbol, uintmax_t *pValue, void *pvUser); 235 typedef FNKLDRMODGETIMPORT *PFNKLDRMODGETIMPORT; 236 int kLdrModGetBits(PKLDRMOD pMod, void *pvBits, uintmax_t BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 237 int kLdrModRelocate(PKLDRMOD pMod, void *pvBits, uintmax_t NewBaseAddress, uintmax_t OldBaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 238 239 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, const char *pszSymbol, unsigned uSymbol, uintmax_t Value, void *pvUser); 240 typedef FNKLDRMODENUMSYMS *PFNKLDRMODENUMSYMS; 241 int kLdrModEnumSymbols(PKLDRMOD pMod, unsigned fFlags, const void *pvBits, uintmax_t BaseAddress, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser); 242 /** @name kLdrModEnumSymbols flags. 243 * @{ */ 244 /** Returns ALL kinds of symbols. The default is to only return public/exported symbols. */ 245 #define KLDRMOD_ENUM_SYMBOL_FLAGS_ALL 0x00000001 246 /** @} */ 247 248 /** @} */ 249 250 251 252 253 /** @defgroup grp_kLdrDy kLdrDy - The dynamic loader 254 * @{ */ 255 256 /** The h*/ 257 typedef struct KLDRDY *PKLDRDY; 258 259 /* 260 int kLdrLoadDll(const char *pszFilename, unsigned fFlags, unsigned long *pvmod); 261 */ 158 262 159 263 /** @name Process Bootstrapping … … 176 280 /** @} */ 177 281 178 /** @name The Internal APIs 179 * @internal 180 * @{ */ 181 int kldrOpenExe(const char *pszFilename, PPKLDRMOD ppMod) 182 int kldrOpen(const char *pszFilename, unsigned fFlags, PPKLDRMOD ppMod); 183 int kldrClose(PKLDRMOD pMod); 184 185 void kldrFailure(const char *pszFilename, ...); 186 /** @} */ 187 188 /* 189 int kLdrLoadDll(const char *pszFilename, unsigned fFlags, unsigned long *pvmod); 190 */ 191 192 #ifndef NULL 193 # define NULL 0 194 #endif 282 /** @} */ 195 283 196 284 #ifdef __cplusplus -
trunk/kLdr/kLdrHlp.h
r2824 r2825 29 29 #define __kLdrHlp_h__ 30 30 31 /** @defgroup grp_kLdrHlp kLdrHlp - Helper Functions 32 * @internal 33 * @{ */ 31 34 /** Get the minimum of two values. */ 32 35 #define KLDR_MIN(a, b) ((a) <= (b) ? (a) : (b)) 33 36 34 #ifdef __OS2__ 37 /** Align a size_t value. */ 38 #define KLDR_ALIGN_Z(val, align) ( ((val) + ((align) - 1)) & ~(size_t)((align) - 1) ) 39 /** Align a void * value. */ 40 #define KLDR_ALIGN_P(pv, align) ( (void *)( ((uintptr_t)(pv) + ((align) - 1)) & ~(uintptr_t)((align) - 1) ) ) 41 42 /* 43 * Compiler specific helpers. 44 * (I.e. operations that tend to have compiler intrinsic implementations). 45 */ 46 #ifdef __GNUC__ 47 /** memcmp */ 48 # define kLdrMemComp(a,b,c) __builtin_memcmp(a,b,c) 49 /** memcpy */ 50 # define kLdrMemCopy(a,b,c) __builtin_memcpy(a,b,c) 51 /** memset */ 52 # define kLdrMemSet(a,b,c) __builtin_memset(a,b,c) 53 /** strlen */ 54 # define kLdrStrLen(a) __builtin_strlen(a) 55 /** alloca */ 56 # define kLdrAllocA(a) __builtin_alloca(a) 57 /** int3 */ 58 # define kldrHlpBreakpoint() do { __asm__ __volatile__ ("int3\n\tnop"); } while (0) 59 /** NULL */ 60 # ifndef NULL 61 # define NULL 0 62 # endif 63 #endif 64 65 #ifdef _MSC_VER 66 # include <string.h> 67 # include <malloc.h> 68 # pragma intrinsic(memcmp, memcpy, memset, strlen, __debugbreak) 69 /** memcmp */ 70 # define kLdrMemComp(a,b,c) memcmp(a,b,c) 71 /** memcpy */ 72 # define kLdrMemCopy(a,b,c) memcpy(a,b,c) 73 /** memset */ 74 # define kLdrMemSet(a,b,c) memset(a,b,c) 75 /** strlen */ 76 # define kLdrStrLen(a) strlen(a) 77 /** alloca */ 78 # define kLdrAllocA(a) alloca(a) 79 /** int3 */ 80 # define kldrHlpBreakpoint() __debugbreak() 81 /** NULL */ 82 # ifndef NULL 83 # define NULL 0 84 # endif 85 #endif 86 87 #if !defined(kLdrMemComp) \ 88 || !defined(kLdrMemCopy) \ 89 || !defined(kLdrMemSet) \ 90 || !defined(kLdrStrLen) \ 91 || !defined(kLdrAllocA) \ 92 || !defined(kldrHlpBreakpoint) 93 # error "Needs porting to your compiler." 94 #endif 95 35 96 36 97 int kldrSemInit(void); … … 41 102 int kldrSemGlobalRelease(void); 42 103 43 /** Loader file handle. */44 typedef unsigned long KLDRFILE;45 /** Pointer to a loader file handle. */46 typedef KLDRFILE *PKLDRFILE;47 48 int kldrFileOpen(const char *pszFilename, PKLDRFILE pFile);49 int kldrFileClose(KLDRFILE File);50 int kldrFileRead(KLDRFILE File, off_t off, void *pv, size_t cb);51 52 int kldrGetEnv(const char *pszVar, char *pszVar, size_t *pcchVar)53 54 void *kldrAlloc(size_t cb);55 void kldrFree(void *pv);56 57 104 int kldrPrivateAlloc(void *pv, size_t cb, unsigned fFlags, void **ppv); 58 105 int kldrPrivateFree(void *pv, size_t cb); 59 int kldrSharedAlloc(void *pv, size_t cb, unsigned fFlags, const char *pszFilename, KLDRFILEFile, void **ppv);106 int kldrSharedAlloc(void *pv, size_t cb, unsigned fFlags, const char *pszFilename, void *File, void **ppv); 60 107 int kldrSharedFree(void *pv, size_t cb); 61 108 62 void kldrExit(int rc); 109 int kldrHlpHeapInit(void); 110 void kldrHlpHeapTerm(void); 111 void kldrHlpHeapDonate(void *pv, size_t cb); 112 void * kldrHlpAlloc(size_t cb); 113 void kldrHlpFree(void *pv); 63 114 64 /* #elif __WIN__ */ 115 int kldrHlpGetEnv(const char *pszVar, char *pszVal, size_t *pcchVal); 116 void kldrHlpExit(int rc); 117 void kldrHlpAssertMsg(const char *pszExpr, const char *pszFile, unsigned iLine, const char *pszFunction); 65 118 66 #else 119 /** Assertion macro. 120 * Users should wrap it since this is ALWAYS compiled in. */ 121 #define kldrHlpAssert(expr) \ 122 do { \ 123 if (!(expr)) \ 124 { \ 125 kldrHlpAssertMsg(#expr, __FILE__, __LINE__, __FUNCTION__); \ 126 kldrHlpBreakpoint(); \ 127 } \ 128 } while (0) 67 129 68 130 131 /** @} */ 69 132 70 #endif71 72 /*73 * Compiler specific helpers.74 * (I.e. operations that tend to have compiler intrinsic implementations).75 */76 #ifdef __GNUC__77 /** memcpy */78 # define kLdrMemCopy(a,b,c) __builtin_memcpy(a,b,c)79 /** memset */80 # define kLdrMemSet(a,b,c) __builtin_memset(a,b,c)81 #endif82 83 #ifndef kLdrMemCopy84 # error "Needs porting to your compiler."85 #endif86 133 87 134 #endif /* __kLdrHlp_h__ */ 135
Note:
See TracChangeset
for help on using the changeset viewer.