From cc11750bda93c143cb460b52807a14e18539163a Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 18 May 2020 05:44:05 +0200 Subject: [PATCH] macos: Support .init_array and .fini_array called different on Mach-O, but same functionality (list of pointers to init and fini functions). --- tccmacho.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tccmacho.c b/tccmacho.c index 69af3ecc..08b0f625 100644 --- a/tccmacho.c +++ b/tccmacho.c @@ -188,6 +188,8 @@ enum skind { sk_uw_info, sk_nl_ptr, // non-lazy pointers, aka GOT sk_la_ptr, // lazy pointers + sk_init, + sk_fini, sk_rw_data, sk_bss, sk_linkedit, @@ -523,11 +525,13 @@ struct { char *name; } skinfo[sk_last] = { [sk_text] = { 1, 0x80000400, "__text" }, - [sk_ro_data] = { 1, 0, "__rodata" }, - [sk_nl_ptr] = { 2, 6, "__got" }, /* S_NON_LAZY_SYMBOL_POINTERS */ - [sk_rw_data] = { 2, 0, "__data" }, - [sk_bss] = { 2, 1, "__bss" }, - [sk_linkedit] = { 3, 0, NULL }, + [sk_ro_data] = { 1, 0x0, "__rodata" }, + [sk_nl_ptr] = { 2, 0x6, "__got" }, /* S_NON_LAZY_SYMBOL_POINTERS */ + [sk_init] = { 2, 0x9, "__mod_init_func" }, /* S_MOD_INIT_FUNC_POINTERS */ + [sk_fini] = { 2, 0xa, "__mod_term_func" }, /* S_MOD_TERM_FUNC_POINTERS */ + [sk_rw_data] = { 2, 0x0, "__data" }, + [sk_bss] = { 2, 0x1, "__bss" }, /* S_ZEROFILL */ + [sk_linkedit] = { 3, 0x0, NULL }, }; static void collect_sections(TCCState *s1, struct macho *mo) @@ -601,6 +605,8 @@ static void collect_sections(TCCState *s1, struct macho *mo) if (flags & SHF_ALLOC) { switch (type) { default: sk = sk_unknown; break; + case SHT_INIT_ARRAY: sk = sk_init; break; + case SHT_FINI_ARRAY: sk = sk_fini; break; case SHT_NOBITS: sk = sk_bss; break; case SHT_SYMTAB: sk = sk_discard; break; case SHT_STRTAB: sk = sk_discard; break; @@ -698,6 +704,8 @@ static void collect_sections(TCCState *s1, struct macho *mo) type == SHT_NOBITS ? "nobits" : type == SHT_SYMTAB ? "symtab" : type == SHT_STRTAB ? "strtab" : + type == SHT_INIT_ARRAY ? "init" : + type == SHT_FINI_ARRAY ? "fini" : type == SHT_RELX ? "rel" : "???", s->sh_addr, (unsigned)s->data_offset,