| @@ -813,28 +813,24 @@ static void pe_build_imports(struct pe_info *pe) · 812 unmodified lines |
| 813 | hdr->Name = v + rva_base; | 813 | hdr->Name = v + rva_base; |
| 814 | | 814 | |
| 815 | for (k = 0, n = p->sym_count; k <= n; ++k) { | 815 | for (k = 0, n = p->sym_count; k <= n; ++k) { |
| 816 | int ordinal = 0; | | |
| 817 | if (k < n) { | 816 | if (k < n) { |
| 818 | int iat_index = p->symbols[k]->iat_index; | 817 | int iat_index = p->symbols[k]->iat_index; |
| 819 | int sym_index = p->symbols[k]->sym_index; | 818 | int sym_index = p->symbols[k]->sym_index; |
| 820 | ElfW(Sym) *imp_sym = (ElfW(Sym) *)pe->s1->dynsymtab_section->data + sym_index; | 819 | ElfW(Sym) *imp_sym = (ElfW(Sym) *)pe->s1->dynsymtab_section->data + sym_index; |
| 821 | ElfW(Sym) *org_sym = (ElfW(Sym) *)symtab_section->data + iat_index; | 820 | ElfW(Sym) *org_sym = (ElfW(Sym) *)symtab_section->data + iat_index; |
| 822 | const char *name = pe->s1->dynsymtab_section->link->data + imp_sym->st_name; | 821 | const char *name = pe->s1->dynsymtab_section->link->data + imp_sym->st_name; |
| | 822 | int ordinal; |
| 823 | | 823 | |
| 824 | org_sym->st_value = thk_ptr; | 824 | org_sym->st_value = thk_ptr; |
| 825 | org_sym->st_shndx = pe->thunk->sh_num; | 825 | org_sym->st_shndx = pe->thunk->sh_num; |
| 826 | v = pe->thunk->data_offset + rva_base; | 826 | |
| 827 | | 827 | if (dllref) |
| 828 | /* ordinal or name */ | 828 | v = 0, ordinal = imp_sym->st_value; /* ordinal from pe_load_def */ |
| 829 | ordinal = imp_sym->st_value; /* from pe_load_def, temperary use */ | 829 | else |
| 830 | //if (ordinal) printf("ordinal: %d\n", ordinal); | 830 | ordinal = 0, v = imp_sym->st_value; /* address from tcc_add_symbol() */ |
| 831 | if (!ordinal) { | 831 | |
| 832 | section_ptr_add(pe->thunk, sizeof(WORD)); /* hint, not used */ | | |
| 833 | put_elf_str(pe->thunk, name); | | |
| 834 | } | | |
| 835 | #ifdef TCC_IS_NATIVE | 832 | #ifdef TCC_IS_NATIVE |
| 836 | if (pe->type == PE_RUN) { | 833 | if (pe->type == PE_RUN) { |
| 837 | v = imp_sym->st_value; | | |
| 838 | if (dllref) { | 834 | if (dllref) { |
| 839 | if ( !dllref->handle ) | 835 | if ( !dllref->handle ) |
| 840 | dllref->handle = LoadLibrary(dllref->name); | 836 | dllref->handle = LoadLibrary(dllref->name); |
| @@ -842,13 +838,22 @@ static void pe_build_imports(struct pe_info *pe) · 1 unmodified line |
| 842 | } | 838 | } |
| 843 | if (!v) | 839 | if (!v) |
| 844 | tcc_error_noabort("can't build symbol '%s'", name); | 840 | tcc_error_noabort("can't build symbol '%s'", name); |
| 845 | } | 841 | } else |
| 846 | #endif | 842 | #endif |
| | 843 | if (ordinal) { |
| | 844 | v = ordinal | (ADDR3264)1 << (sizeof(ADDR3264)*8 - 1); |
| | 845 | } else { |
| | 846 | v = pe->thunk->data_offset + rva_base; |
| | 847 | section_ptr_add(pe->thunk, sizeof(WORD)); /* hint, not used */ |
| | 848 | put_elf_str(pe->thunk, name); |
| | 849 | } |
| | 850 | |
| 847 | } else { | 851 | } else { |
| 848 | v = 0; /* last entry is zero */ | 852 | v = 0; /* last entry is zero */ |
| 849 | } | 853 | } |
| | 854 | |
| 850 | *(ADDR3264*)(pe->thunk->data+thk_ptr) = | 855 | *(ADDR3264*)(pe->thunk->data+thk_ptr) = |
| 851 | *(ADDR3264*)(pe->thunk->data+ent_ptr) = (ordinal && pe->type != PE_RUN)?(ADDR3264)1<<(sizeof(ADDR3264)*8-1)|ordinal:v; | 856 | *(ADDR3264*)(pe->thunk->data+ent_ptr) = v; |
| 852 | thk_ptr += sizeof (ADDR3264); | 857 | thk_ptr += sizeof (ADDR3264); |
| 853 | ent_ptr += sizeof (ADDR3264); | 858 | ent_ptr += sizeof (ADDR3264); |
| 854 | } | 859 | } |
| @@ -1593,12 +1598,11 @@ static char *get_line(char *line, int size, int fd) · 738 unmodified lines |
| 1593 | /* ------------------------------------------------------------- */ | 1598 | /* ------------------------------------------------------------- */ |
| 1594 | static int pe_load_def(TCCState *s1, int fd) | 1599 | static int pe_load_def(TCCState *s1, int fd) |
| 1595 | { | 1600 | { |
| 1596 | int state = 0, ret = -1, dllindex = 0; | 1601 | int state = 0, ret = -1, dllindex = 0, ord; |
| 1597 | char line[400], dllname[80], *p; | 1602 | char line[400], dllname[80], *p, *x; |
| 1598 | | 1603 | |
| 1599 | for (;;) { | 1604 | for (;;) { |
| 1600 | int ord = 0; | 1605 | |
| 1601 | char *x, *d, idxstr[8]; | | |
| 1602 | p = get_line(line, sizeof line, fd); | 1606 | p = get_line(line, sizeof line, fd); |
| 1603 | if (NULL == p) | 1607 | if (NULL == p) |
| 1604 | break; | 1608 | break; |
| @@ -1621,24 +1625,19 @@ static int pe_load_def(TCCState *s1, int fd) · 16 unmodified lines |
| 1621 | case 2: | 1625 | case 2: |
| 1622 | dllindex = add_dllref(s1, dllname); | 1626 | dllindex = add_dllref(s1, dllname); |
| 1623 | ++state; | 1627 | ++state; |
| 1624 | | 1628 | /* fall through */ |
| 1625 | default: | 1629 | default: |
| 1626 | /* get ordianl and will store in sym->st_value */ | 1630 | /* get ordinal and will store in sym->st_value */ |
| 1627 | d = NULL; | 1631 | ord = 0; |
| 1628 | x = strchr(line, ' '); | 1632 | x = strchr(p, ' '); |
| 1629 | if (x) x = strchr(line, '@'); | 1633 | if (x) { |
| 1630 | while (x != NULL) { | 1634 | *x = 0, x = strrchr(x + 1, '@'); |
| 1631 | d =x; | 1635 | if (x) { |
| 1632 | x = strchr(x+1, '@'); | 1636 | char *d; |
| 1633 | } | 1637 | ord = (int)strtol(x + 1, &d, 10); |
| 1634 | if (d) { | 1638 | if (*d) |
| 1635 | ord = atoi(d+1); | 1639 | ord = 0; |
| 1636 | itoa(ord, idxstr, 10); | 1640 | } |
| 1637 | if (strcmp(idxstr, d+1) == 0) { | | |
| 1638 | memset(d, 0, 1); | | |
| 1639 | trimback(p, d); | | |
| 1640 | } else | | |
| 1641 | ord = 0; | | |
| 1642 | } | 1641 | } |
| 1643 | pe_putimport(s1, dllindex, p, ord); | 1642 | pe_putimport(s1, dllindex, p, ord); |
| 1644 | continue; | 1643 | continue; |