History

Fix dll support for macho

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

herman ten brugge committed 3 years ago

Commit f6f3d641 parent 04810db2 files · +12 −17Browse files

Unified · Split

2 files
  1. tccmacho.c +10 −8
  2. tccrun.c +2 −9
tccmacho.c+10−8
@@ -1529,7 +1529,7 @@ static void export_trie(TCCState *s1, struct macho *mo) · 1528 unmodified lines
1529 ElfW(Sym) *sym = (ElfW(Sym) *)symtab_section->data + sym_index;1529 ElfW(Sym) *sym = (ElfW(Sym) *)symtab_section->data + sym_index;
1530 const char *name = (char*)symtab_section->link->data + sym->st_name;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 (ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL ||1533 (ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL ||
1534 ELFW(ST_BIND)(sym->st_info) == STB_WEAK)) {1534 ELFW(ST_BIND)(sym->st_info) == STB_WEAK)) {
1535 int flag = EXPORT_SYMBOL_FLAGS_KIND_REGULAR;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 if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK)1539 if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK)
1540 flag |= EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION;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 trie = tcc_realloc(trie, (n_trie + 1) * sizeof(struct trie_info));1542 trie = tcc_realloc(trie, (n_trie + 1) * sizeof(struct trie_info));
1543 trie[n_trie].name = name;1543 trie[n_trie].name = name;
1544 trie[n_trie].flag = flag;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 seg = NULL;1769 seg = NULL;
1770 numsec = 0;1770 numsec = 0;
1771 mo->elfsectomacho = tcc_mallocz(sizeof(*mo->elfsectomacho) * s1->nb_sections);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 struct section_64 *sec = NULL;1773 struct section_64 *sec = NULL;
1774 if (seg) {1774 if (seg) {
1775 seg->vmsize = curaddr - seg->vmaddr;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 export_trie(s1, mo);1786 export_trie(s1, mo);
1787 }1787 }
1788#endif1788#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 mo->sk_to_sect[sk].s) {1791 mo->sk_to_sect[sk].s) {
1791 uint64_t al = 0;1792 uint64_t al = 0;
1792 int si;1793 int si;
@@ -1838,14 +1839,14 @@ static void collect_sections(TCCState *s1, struct macho *mo, const char *filenam · 45 unmodified lines
1838 for (s = mo->sk_to_sect[sk].s; s; s = s->prev) {1839 for (s = mo->sk_to_sect[sk].s; s; s = s->prev) {
1839 al = s->sh_addralign;1840 al = s->sh_addralign;
1840 curaddr = (curaddr + al - 1) & -al;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 s->sh_addr = curaddr;1843 s->sh_addr = curaddr;
1843 curaddr += s->sh_size;1844 curaddr += s->sh_size;
1844 if (s->sh_type != SHT_NOBITS) {1845 if (s->sh_type != SHT_NOBITS) {
1845 fileofs = (fileofs + al - 1) & -al;1846 fileofs = (fileofs + al - 1) & -al;
1846 s->sh_offset = fileofs;1847 s->sh_offset = fileofs;
1847 fileofs += s->sh_size;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 if (sec)1851 if (sec)
1851 mo->elfsectomacho[s->sh_num] = numsec;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 for (sk = sk_unknown; sk < sk_last; sk++) {1966 for (sk = sk_unknown; sk < sk_last; sk++) {
1966 //struct segment_command_64 *seg;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 !mo->sk_to_sect[sk].s)1970 !mo->sk_to_sect[sk].s)
1969 continue;1971 continue;
1970 /*seg =*/ get_segment(mo, mo->segment[sk]);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 for (j = 0; j < page_count; j++) {2060 for (j = 0; j < page_count; j++) {
2059 addr_t start = seg->vmaddr + j * SEG_PAGE_SIZE;2061 addr_t start = seg->vmaddr + j * SEG_PAGE_SIZE;
2060 addr_t end = start + SEG_PAGE_SIZE;2062 addr_t end = start + SEG_PAGE_SIZE;
2061 void *last;2063 void *last = NULL;
2062 addr_t last_o = 0;2064 addr_t last_o = 0;
2063 addr_t cur_o, cur;2065 addr_t cur_o, cur;
2064 struct dyld_chained_ptr_64_rebase *rebase;2066 struct dyld_chained_ptr_64_rebase *rebase;
tccrun.c+2−9
@@ -771,9 +771,6 @@ static addr_t rt_printline_dwarf (rt_context *rc, addr_t wanted_pc, · 770 unmodified lines
771 } filename_table[FILE_TABLE_SIZE];771 } filename_table[FILE_TABLE_SIZE];
772 addr_t last_pc;772 addr_t last_pc;
773 addr_t pc;773 addr_t pc;
774#if defined TCC_TARGET_MACHO
775 addr_t first_pc;
776#endif
777 addr_t func_addr;774 addr_t func_addr;
778 int line;775 int line;
779 char *filename;776 char *filename;
@@ -782,9 +779,6 @@ static addr_t rt_printline_dwarf (rt_context *rc, addr_t wanted_pc, · 2 unmodified lines
782next:779next:
783 ln = rc->dwarf_line;780 ln = rc->dwarf_line;
784 while (ln < rc->dwarf_line_end) {781 while (ln < rc->dwarf_line_end) {
785#if defined TCC_TARGET_MACHO
786 first_pc = 0;
787#endif
788 dir_size = 0;782 dir_size = 0;
789 filename_size = 0;783 filename_size = 0;
790 last_pc = 0;784 last_pc = 0;
@@ -937,9 +931,8 @@ check_pc: · 146 unmodified lines
937 pc = dwarf_read_8(cp, end);931 pc = dwarf_read_8(cp, end);
938#endif932#endif
939#if defined TCC_TARGET_MACHO933#if defined TCC_TARGET_MACHO
940 if (first_pc == 0 && rc->prog_base != (addr_t) -1)934 if (rc->prog_base != (addr_t) -1)
941 first_pc += rc->prog_base;935 pc += rc->prog_base;
942 pc += first_pc;
943#endif936#endif
944 opindex = 0;937 opindex = 0;
945 break;938 break;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t