Unified · Split
| @@ -222,6 +222,7 @@ typedef struct Section { · 221 unmodified lines | ||
| 222 | 222 | |
| 223 | 223 | typedef struct DLLReference { |
| 224 | 224 | int level; |
| 225 | + void *handle; | |
| 225 | 226 | char name[1]; |
| 226 | 227 | } DLLReference; |
| 227 | 228 | |
| @@ -9486,8 +9487,6 @@ static void preprocess_init(TCCState *s1) · 9258 unmodified lines | ||
| 9486 | 9487 | vtop = vstack - 1; |
| 9487 | 9488 | s1->pack_stack[0] = 0; |
| 9488 | 9489 | s1->pack_stack_ptr = s1->pack_stack; |
| 9489 | − | |
| 9490 | − macro_ptr = NULL; | |
| 9491 | 9490 | } |
| 9492 | 9491 | |
| 9493 | 9492 | /* compile the C file opened in 'file'. Return non zero if errors. */ |
| @@ -10095,6 +10094,8 @@ static void tcc_cleanup(void) · 601 unmodified lines | ||
| 10095 | 10094 | cstr_free(&tokcstr); |
| 10096 | 10095 | /* reset symbol stack */ |
| 10097 | 10096 | sym_free_first = NULL; |
| 10097 | + /* cleanup from error/setjmp */ | |
| 10098 | + macro_ptr = NULL; | |
| 10098 | 10099 | } |
| 10099 | 10100 | |
| 10100 | 10101 | TCCState *tcc_new(void) |
| @@ -10227,6 +10228,14 @@ void tcc_delete(TCCState *s1) · 126 unmodified lines | ||
| 10227 | 10228 | for(i = 1; i < s1->nb_sections; i++) |
| 10228 | 10229 | free_section(s1->sections[i]); |
| 10229 | 10230 | tcc_free(s1->sections); |
| 10231 | + | |
| 10232 | + /* free any loaded DLLs */ | |
| 10233 | + for ( i = 0; i < s1->nb_loaded_dlls; i++) | |
| 10234 | + { | |
| 10235 | + DLLReference *ref = s1->loaded_dlls[i]; | |
| 10236 | + if ( ref->handle ) | |
| 10237 | + dlclose(ref->handle); | |
| 10238 | + } | |
| 10230 | 10239 | |
| 10231 | 10240 | /* free loaded dlls array */ |
| 10232 | 10241 | dynarray_reset(&s1->loaded_dlls, &s1->nb_loaded_dlls); |
| @@ -2276,7 +2276,7 @@ static int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level) · 2275 unmodified lines | ||
| 2276 | 2276 | // printf("loading dll '%s'\n", soname); |
| 2277 | 2277 | |
| 2278 | 2278 | /* add the dll and its level */ |
| 2279 | − dllref = tcc_malloc(sizeof(DLLReference) + strlen(soname)); | |
| 2279 | + dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname)); | |
| 2280 | 2280 | dllref->level = level; |
| 2281 | 2281 | strcpy(dllref->name, soname); |
| 2282 | 2282 | dynarray_add((void ***)&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref); |
| @@ -465,6 +465,8 @@ ST_FN int pe_find_import(TCCState * s1, const char *symbol) · 464 unmodified lines | ||
| 465 | 465 | # include <dlfcn.h> |
| 466 | 466 | # define LoadLibrary(s) dlopen(s, RTLD_NOW) |
| 467 | 467 | # define GetProcAddress(h,s) dlsym(h, s) |
| 468 | +#else | |
| 469 | +# define dlclose(h) FreeLibrary(h) | |
| 468 | 470 | #endif |
| 469 | 471 | |
| 470 | 472 | /* for the -run option: dynamically load symbol from dll */ |
| @@ -472,16 +474,21 @@ void *resolve_sym(struct TCCState *s1, const char *symbol, int type) · 1 unmodified line | ||
| 472 | 474 | { |
| 473 | 475 | char buffer[100]; |
| 474 | 476 | int sym_index, dll_index; |
| 475 | − void *hModule, *addr, **m; | |
| 477 | + void *addr, **m; | |
| 478 | + DLLReference *dllref; | |
| 476 | 479 | |
| 477 | 480 | sym_index = pe_find_import(s1, symbol); |
| 478 | 481 | if (0 == sym_index) |
| 479 | 482 | return NULL; |
| 480 | 483 | dll_index = ((Elf32_Sym *)s1->dynsymtab_section->data + sym_index)->st_value; |
| 481 | − hModule = LoadLibrary(s1->loaded_dlls[dll_index-1]->name); | |
| 482 | − addr = GetProcAddress(hModule, symbol); | |
| 484 | + dllref = s1->loaded_dlls[dll_index-1]; | |
| 485 | + if ( !dllref->handle ) | |
| 486 | + { | |
| 487 | + dllref->handle = LoadLibrary(dllref->name); | |
| 488 | + } | |
| 489 | + addr = GetProcAddress(dllref->handle, symbol); | |
| 483 | 490 | if (NULL == addr) |
| 484 | − addr = GetProcAddress(hModule, get_alt_symbol(buffer, symbol)); | |
| 491 | + addr = GetProcAddress(dllref->handle, get_alt_symbol(buffer, symbol)); | |
| 485 | 492 | |
| 486 | 493 | if (addr && STT_OBJECT == type) { |
| 487 | 494 | /* need to return a pointer to the address for data objects */ |
| @@ -1413,9 +1420,8 @@ PUB_FN int pe_load_def_file(TCCState *s1, int fd) · 925 unmodified lines | ||
| 1413 | 1420 | continue; |
| 1414 | 1421 | |
| 1415 | 1422 | case 2: |
| 1416 | − dllref = tcc_malloc(sizeof(DLLReference) + strlen(dllname)); | |
| 1423 | + dllref = tcc_mallocz(sizeof(DLLReference) + strlen(dllname)); | |
| 1417 | 1424 | strcpy(dllref->name, dllname); |
| 1418 | − dllref->level = 0; | |
| 1419 | 1425 | dynarray_add((void ***) &s1->loaded_dlls, &s1->nb_loaded_dlls, dllref); |
| 1420 | 1426 | ++state; |
| 1421 | 1427 | |