Add weak support apple
Update tccmacho.c for weak symbols. Undo tests/tcctest.c disable weak symbols test.
This commit is contained in:
parent
233d5d5f6f
commit
e99cf72784
2 changed files with 13 additions and 5 deletions
16
tccmacho.c
16
tccmacho.c
|
@ -304,7 +304,7 @@ struct macho {
|
||||||
} sk_to_sect[sk_last];
|
} sk_to_sect[sk_last];
|
||||||
int *elfsectomacho;
|
int *elfsectomacho;
|
||||||
int *e2msym;
|
int *e2msym;
|
||||||
Section *rebase, *binding, *lazy_binding, *exports;
|
Section *rebase, *binding, *weak_binding, *lazy_binding, *exports;
|
||||||
Section *symtab, *strtab, *wdata, *indirsyms;
|
Section *symtab, *strtab, *wdata, *indirsyms;
|
||||||
Section *stubs, *stub_helper, *la_symbol_ptr;
|
Section *stubs, *stub_helper, *la_symbol_ptr;
|
||||||
int nr_plt, n_got;
|
int nr_plt, n_got;
|
||||||
|
@ -887,6 +887,7 @@ static void create_symtab(TCCState *s1, struct macho *mo)
|
||||||
SHN_UNDEF, "dyld_stub_binder");
|
SHN_UNDEF, "dyld_stub_binder");
|
||||||
mo->rebase = new_section(s1, "REBASE", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
mo->rebase = new_section(s1, "REBASE", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
||||||
mo->binding = new_section(s1, "BINDING", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
mo->binding = new_section(s1, "BINDING", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
||||||
|
mo->weak_binding = new_section(s1, "WEAK_BINDING", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
||||||
mo->lazy_binding = new_section(s1, "LAZY_BINDING", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
mo->lazy_binding = new_section(s1, "LAZY_BINDING", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
||||||
mo->exports = new_section(s1, "EXPORT", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
mo->exports = new_section(s1, "EXPORT", SHT_LINKEDIT, SHF_ALLOC | SHF_WRITE);
|
||||||
|
|
||||||
|
@ -1003,11 +1004,14 @@ static void do_bind_rebase(TCCState *s1, struct macho *mo)
|
||||||
}
|
}
|
||||||
for (i = 0; i < mo->n_bind; i++) {
|
for (i = 0; i < mo->n_bind; i++) {
|
||||||
int sym_index = ELFW(R_SYM)(mo->bind[i].rel.r_info);
|
int sym_index = ELFW(R_SYM)(mo->bind[i].rel.r_info);
|
||||||
|
sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
|
||||||
Section *s = s1->sections[mo->bind[i].section];
|
Section *s = s1->sections[mo->bind[i].section];
|
||||||
|
Section *binding = ELFW(ST_BIND)(sym->st_info) == STB_WEAK
|
||||||
|
? mo->weak_binding : mo->binding;
|
||||||
|
|
||||||
sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
|
sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
|
||||||
name = (char *) symtab_section->link->data + sym->st_name;
|
name = (char *) symtab_section->link->data + sym->st_name;
|
||||||
ptr = section_ptr_add(mo->binding, 5 + strlen(name));
|
ptr = section_ptr_add(binding, 5 + strlen(name));
|
||||||
*ptr++ = BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
|
*ptr++ = BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
|
||||||
(BIND_SPECIAL_DYLIB_FLAT_LOOKUP & 0xf);
|
(BIND_SPECIAL_DYLIB_FLAT_LOOKUP & 0xf);
|
||||||
*ptr++ = BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM | 0;
|
*ptr++ = BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM | 0;
|
||||||
|
@ -1016,9 +1020,9 @@ static void do_bind_rebase(TCCState *s1, struct macho *mo)
|
||||||
*ptr++ = BIND_OPCODE_SET_TYPE_IMM | BIND_TYPE_POINTER;
|
*ptr++ = BIND_OPCODE_SET_TYPE_IMM | BIND_TYPE_POINTER;
|
||||||
set_segment_and_offset(mo, s->sh_addr, ptr,
|
set_segment_and_offset(mo, s->sh_addr, ptr,
|
||||||
BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB,
|
BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB,
|
||||||
mo->binding,
|
binding,
|
||||||
mo->bind[i].rel.r_offset + s->sh_addr);
|
mo->bind[i].rel.r_offset + s->sh_addr);
|
||||||
ptr = section_ptr_add(mo->binding, 1);
|
ptr = section_ptr_add(binding, 1);
|
||||||
*ptr++ = BIND_OPCODE_DO_BIND;
|
*ptr++ = BIND_OPCODE_DO_BIND;
|
||||||
}
|
}
|
||||||
if (mo->rebase->data_offset) {
|
if (mo->rebase->data_offset) {
|
||||||
|
@ -1270,6 +1274,10 @@ static void collect_sections(TCCState *s1, struct macho *mo)
|
||||||
mo->dyldinfo->bind_off = mo->binding->sh_offset;
|
mo->dyldinfo->bind_off = mo->binding->sh_offset;
|
||||||
mo->dyldinfo->bind_size = mo->binding->data_offset;
|
mo->dyldinfo->bind_size = mo->binding->data_offset;
|
||||||
}
|
}
|
||||||
|
if (mo->weak_binding->data_offset) {
|
||||||
|
mo->dyldinfo->weak_bind_off = mo->weak_binding->sh_offset;
|
||||||
|
mo->dyldinfo->weak_bind_size = mo->weak_binding->data_offset;
|
||||||
|
}
|
||||||
if (mo->lazy_binding->data_offset) {
|
if (mo->lazy_binding->data_offset) {
|
||||||
mo->dyldinfo->lazy_bind_off = mo->lazy_binding->sh_offset;
|
mo->dyldinfo->lazy_bind_off = mo->lazy_binding->sh_offset;
|
||||||
mo->dyldinfo->lazy_bind_size = mo->lazy_binding->data_offset;
|
mo->dyldinfo->lazy_bind_size = mo->lazy_binding->data_offset;
|
||||||
|
|
|
@ -3898,7 +3898,7 @@ void builtin_test(void)
|
||||||
//printf("bera: %p\n", __builtin_extract_return_addr((void*)43));
|
//printf("bera: %p\n", __builtin_extract_return_addr((void*)43));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined _WIN32 || defined __APPLE__
|
#if defined _WIN32
|
||||||
void weak_test(void) {}
|
void weak_test(void) {}
|
||||||
#else
|
#else
|
||||||
extern int __attribute__((weak)) weak_f1(void);
|
extern int __attribute__((weak)) weak_f1(void);
|
||||||
|
|
Loading…
Add table
Reference in a new issue