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