From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8938 Path: news.gmane.org!not-for-mail From: Szabolcs Nagy Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH 2/2] add preinit_array support Date: Sun, 29 Nov 2015 17:59:25 +0100 Message-ID: <20151129165925.GQ23362@port70.net> References: <20151129153322.GO23362@port70.net> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="5p8PegU4iirBW1oA" X-Trace: ger.gmane.org 1448816380 17193 80.91.229.3 (29 Nov 2015 16:59:40 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 29 Nov 2015 16:59:40 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-8951-gllmg-musl=m.gmane.org@lists.openwall.com Sun Nov 29 17:59:37 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1a35K3-0000J4-C1 for gllmg-musl@m.gmane.org; Sun, 29 Nov 2015 17:59:35 +0100 Original-Received: (qmail 21826 invoked by uid 550); 29 Nov 2015 16:59:37 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 21808 invoked from network); 29 Nov 2015 16:59:36 -0000 Mail-Followup-To: musl@lists.openwall.com Content-Disposition: inline In-Reply-To: <20151129153322.GO23362@port70.net> User-Agent: Mutt/1.5.24 (2015-08-30) Xref: news.gmane.org gmane.linux.lib.musl.general:8938 Archived-At: --5p8PegU4iirBW1oA Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Szabolcs Nagy [2015-11-29 16:33:22 +0100]: > redefined DYN_CNT because 32 is not enough for DT_PREINIT_ARRAY. > --- > src/env/__libc_start_main.c | 5 +++++ > src/ldso/dynlink.c | 12 ++++++++++-- > 2 files changed, 15 insertions(+), 2 deletions(-) > src/internal change was missing and legacy _init vs preinit_array order was wrong. attached new version, array type is fixed too. --5p8PegU4iirBW1oA Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0002-add-preinit_array-support.patch" >From 8820faea5a365387c8fe54c8ffa1f796c2084f83 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sun, 29 Nov 2015 16:36:24 +0000 Subject: [PATCH 2/2] add preinit_array support handle DT_PREINIT_ARRAY{SZ} in case of dynamic linking and __preinit_array_{start,end} in case of static linking. redefined DYN_CNT because 32 is not enough for DT_PREINIT_ARRAY. --- src/env/__libc_start_main.c | 5 +++++ src/internal/dynlink.h | 2 +- src/ldso/dynlink.c | 12 ++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index 14a2825..7502bc3 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -12,6 +12,9 @@ static void dummy(void) {} weak_alias(dummy, _init); __attribute__((__weak__, __visibility__("hidden"))) +extern void (*const __preinit_array_start)(void), (*const __preinit_array_end)(void); + +__attribute__((__weak__, __visibility__("hidden"))) extern void (*const __init_array_start)(void), (*const __init_array_end)(void); static void dummy1(void *p) {} @@ -56,6 +59,8 @@ void __init_libc(char **envp, char *pn) static void libc_start_init(void) { void (*const *f)(void); + for (f=&__preinit_array_start; f<&__preinit_array_end; f++) + (*f)(); _init(); for (f=&__init_array_start; f<&__init_array_end; f++) (*f)(); diff --git a/src/internal/dynlink.h b/src/internal/dynlink.h index 9c494e4..fb706d3 100644 --- a/src/internal/dynlink.h +++ b/src/internal/dynlink.h @@ -84,7 +84,7 @@ struct fdpic_dummy_loadmap { #endif #define AUX_CNT 32 -#define DYN_CNT 32 +#define DYN_CNT DT_NUM typedef void (*stage2_func)(unsigned char *, size_t *); typedef _Noreturn void (*stage3_func)(size_t *); diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 93e7d67..51da820 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -135,11 +135,14 @@ static struct fdpic_dummy_loadmap app_dummy_loadmap; struct debug *_dl_debug_addr = &debug; __attribute__((__visibility__("hidden"))) -void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0; +void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0, +(*const __preinit_array_start)(void)=0; __attribute__((__visibility__("hidden"))) -extern void (*const __init_array_end)(void), (*const __fini_array_end)(void); +extern void (*const __init_array_end)(void), (*const __fini_array_end)(void), +(*const __preinit_array_end)(void); +weak_alias(__preinit_array_start, __preinit_array_end); weak_alias(__init_array_start, __init_array_end); weak_alias(__fini_array_start, __fini_array_end); @@ -1225,6 +1228,11 @@ static void do_init_fini(struct dso *p) p->fini_next = fini_head; fini_head = p; } + if (dyn[0] & (1UL<