Export now all global symbols in export trie instead of only text symbols. I wrote too much data into dylib file because I did not check for sk_unknown/sk_discard/sk_uw_info. Simplified code in tccrun.c
Unified · Split
| @@ -1529,7 +1529,7 @@ static void export_trie(TCCState *s1, struct macho *mo) · 1528 unmodified lines | ||
| 1529 | 1529 | ElfW(Sym) *sym = (ElfW(Sym) *)symtab_section->data + sym_index; |
| 1530 | 1530 | const char *name = (char*)symtab_section->link->data + sym->st_name; |
| 1531 | 1531 | |
| 1532 | − if (sym->st_shndx == text_section->sh_num && | |
| 1532 | + if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE && | |
| 1533 | 1533 | (ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL || |
| 1534 | 1534 | ELFW(ST_BIND)(sym->st_info) == STB_WEAK)) { |
| 1535 | 1535 | int flag = EXPORT_SYMBOL_FLAGS_KIND_REGULAR; |
| @@ -1538,7 +1538,7 @@ static void export_trie(TCCState *s1, struct macho *mo) · 2 unmodified lines | ||
| 1538 | 1538 | |
| 1539 | 1539 | if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK) |
| 1540 | 1540 | flag |= EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION; |
| 1541 | − dprintf ("%s %d %llx\n", name, flag, addr + vm_addr); | |
| 1541 | + dprintf ("%s %d %llx\n", name, flag, (long long)addr + vm_addr); | |
| 1542 | 1542 | trie = tcc_realloc(trie, (n_trie + 1) * sizeof(struct trie_info)); |
| 1543 | 1543 | trie[n_trie].name = name; |
| 1544 | 1544 | trie[n_trie].flag = flag; |
| @@ -1769,7 +1769,7 @@ static void collect_sections(TCCState *s1, struct macho *mo, const char *filenam · 224 unmodified lines | ||
| 1769 | 1769 | seg = NULL; |
| 1770 | 1770 | numsec = 0; |
| 1771 | 1771 | mo->elfsectomacho = tcc_mallocz(sizeof(*mo->elfsectomacho) * s1->nb_sections); |
| 1772 | − for (sk = sk_text; sk < sk_last; sk++) { | |
| 1772 | + for (sk = sk_unknown; sk < sk_last; sk++) { | |
| 1773 | 1773 | struct section_64 *sec = NULL; |
| 1774 | 1774 | if (seg) { |
| 1775 | 1775 | seg->vmsize = curaddr - seg->vmaddr; |
| @@ -1786,7 +1786,8 @@ static void collect_sections(TCCState *s1, struct macho *mo, const char *filenam · 10 unmodified lines | ||
| 1786 | 1786 | export_trie(s1, mo); |
| 1787 | 1787 | } |
| 1788 | 1788 | #endif |
| 1789 | − if ((s1->output_type != TCC_OUTPUT_EXE || mo->segment[sk]) && | |
| 1789 | + if (skinfo[sk].seg_initial && | |
| 1790 | + (s1->output_type != TCC_OUTPUT_EXE || mo->segment[sk]) && | |
| 1790 | 1791 | mo->sk_to_sect[sk].s) { |
| 1791 | 1792 | uint64_t al = 0; |
| 1792 | 1793 | int si; |
| @@ -1838,14 +1839,14 @@ static void collect_sections(TCCState *s1, struct macho *mo, const char *filenam · 45 unmodified lines | ||
| 1838 | 1839 | for (s = mo->sk_to_sect[sk].s; s; s = s->prev) { |
| 1839 | 1840 | al = s->sh_addralign; |
| 1840 | 1841 | curaddr = (curaddr + al - 1) & -al; |
| 1841 | − dprintf("curaddr now 0x%lx\n", (long)curaddr); | |
| 1842 | + dprintf("%s: curaddr now 0x%lx\n", s->name, (long)curaddr); | |
| 1842 | 1843 | s->sh_addr = curaddr; |
| 1843 | 1844 | curaddr += s->sh_size; |
| 1844 | 1845 | if (s->sh_type != SHT_NOBITS) { |
| 1845 | 1846 | fileofs = (fileofs + al - 1) & -al; |
| 1846 | 1847 | s->sh_offset = fileofs; |
| 1847 | 1848 | fileofs += s->sh_size; |
| 1848 | − dprintf("fileofs now %ld\n", (long)fileofs); | |
| 1849 | + dprintf("%s: fileofs now %ld\n", s->name, (long)fileofs); | |
| 1849 | 1850 | } |
| 1850 | 1851 | if (sec) |
| 1851 | 1852 | mo->elfsectomacho[s->sh_num] = numsec; |
| @@ -1964,7 +1965,8 @@ static void macho_write(TCCState *s1, struct macho *mo, FILE *fp) · 112 unmodified lines | ||
| 1964 | 1965 | |
| 1965 | 1966 | for (sk = sk_unknown; sk < sk_last; sk++) { |
| 1966 | 1967 | //struct segment_command_64 *seg; |
| 1967 | − if ((s1->output_type == TCC_OUTPUT_EXE && !mo->segment[sk]) || | |
| 1968 | + if (skinfo[sk].seg_initial == 0 || | |
| 1969 | + (s1->output_type == TCC_OUTPUT_EXE && !mo->segment[sk]) || | |
| 1968 | 1970 | !mo->sk_to_sect[sk].s) |
| 1969 | 1971 | continue; |
| 1970 | 1972 | /*seg =*/ get_segment(mo, mo->segment[sk]); |
| @@ -2058,7 +2060,7 @@ ST_FUNC void bind_rebase_import(TCCState *s1, struct macho *mo) · 87 unmodified lines | ||
| 2058 | 2060 | for (j = 0; j < page_count; j++) { |
| 2059 | 2061 | addr_t start = seg->vmaddr + j * SEG_PAGE_SIZE; |
| 2060 | 2062 | addr_t end = start + SEG_PAGE_SIZE; |
| 2061 | − void *last; | |
| 2063 | + void *last = NULL; | |
| 2062 | 2064 | addr_t last_o = 0; |
| 2063 | 2065 | addr_t cur_o, cur; |
| 2064 | 2066 | struct dyld_chained_ptr_64_rebase *rebase; |
| @@ -771,9 +771,6 @@ static addr_t rt_printline_dwarf (rt_context *rc, addr_t wanted_pc, · 770 unmodified lines | ||
| 771 | 771 | } filename_table[FILE_TABLE_SIZE]; |
| 772 | 772 | addr_t last_pc; |
| 773 | 773 | addr_t pc; |
| 774 | −#if defined TCC_TARGET_MACHO | |
| 775 | − addr_t first_pc; | |
| 776 | −#endif | |
| 777 | 774 | addr_t func_addr; |
| 778 | 775 | int line; |
| 779 | 776 | char *filename; |
| @@ -782,9 +779,6 @@ static addr_t rt_printline_dwarf (rt_context *rc, addr_t wanted_pc, · 2 unmodified lines | ||
| 782 | 779 | next: |
| 783 | 780 | ln = rc->dwarf_line; |
| 784 | 781 | while (ln < rc->dwarf_line_end) { |
| 785 | −#if defined TCC_TARGET_MACHO | |
| 786 | − first_pc = 0; | |
| 787 | −#endif | |
| 788 | 782 | dir_size = 0; |
| 789 | 783 | filename_size = 0; |
| 790 | 784 | last_pc = 0; |
| @@ -937,9 +931,8 @@ check_pc: · 146 unmodified lines | ||
| 937 | 931 | pc = dwarf_read_8(cp, end); |
| 938 | 932 | #endif |
| 939 | 933 | #if defined TCC_TARGET_MACHO |
| 940 | − if (first_pc == 0 && rc->prog_base != (addr_t) -1) | |
| 941 | − first_pc += rc->prog_base; | |
| 942 | − pc += first_pc; | |
| 934 | + if (rc->prog_base != (addr_t) -1) | |
| 935 | + pc += rc->prog_base; | |
| 943 | 936 | #endif |
| 944 | 937 | opindex = 0; |
| 945 | 938 | break; |