From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2084.outbound.protection.outlook.com [40.107.21.84]) by sourceware.org (Postfix) with ESMTPS id 3E98C385840F for ; Mon, 14 Feb 2022 08:28:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3E98C385840F Received: from DU2PR04CA0065.eurprd04.prod.outlook.com (2603:10a6:10:232::10) by AM8PR08MB5601.eurprd08.prod.outlook.com (2603:10a6:20b:1dd::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.11; Mon, 14 Feb 2022 08:28:14 +0000 Received: from DB5EUR03FT029.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:232:cafe::6f) by DU2PR04CA0065.outlook.office365.com (2603:10a6:10:232::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.18 via Frontend Transport; Mon, 14 Feb 2022 08:28:14 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT029.mail.protection.outlook.com (10.152.20.131) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.11 via Frontend Transport; Mon, 14 Feb 2022 08:28:14 +0000 Received: ("Tessian outbound 18e50a6f0513:v113"); Mon, 14 Feb 2022 08:28:14 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 711bff55681b2398 X-CR-MTA-TID: 64aa7808 Received: from d54d92c00392.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id E794D611-917B-47A8-B87F-2AF026878A32.1; Mon, 14 Feb 2022 08:28:07 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id d54d92c00392.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 14 Feb 2022 08:28:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=auTlW9buIWTqiwR0rvTtwEJXz/WVWKH/GtqtHVkDrZf/M3n/AX8dfqu6bKmUQ6/PiWCNSGBbKF3gwOPWdS5RzNhMgeIBK+McoyiBrS4+0rJRyPLkUOFnj6VB9rUd9v6YIi1AdvTOd0MBl7H7/Auc2xUJ7aQqlGQlI5tBH9PH4hASNUVZFSTOOaQG/kyUTcw15itbLgfCrGQrOluohxYeRLYmh7yZPTLtXUV76xbtszIrAxWzIKEszPIUb/DEFu+57aPPmw8fw+xXlkVDDGMjjSNmeg1w/X1i6Q5YD85nwDrqwPGOlILFaKhMcyh7t6iJPiCVgIprE2zTY3AoyxYrbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yXts6TvblHVchzUjhtIys6Axn9VYnb4xsJ1736SM48U=; b=N1edOQot+pnDP4td4pl159EPDkKc5HScK5N6lxYdxphTKQZu/n0C1beFHRNcL9LYRBHaFWO7U5lMdL8+Ldt0/ryI7bGV/4fQjopymi/ZDRFRm9RALlRByJflCrVfknb1JucFZENs8eKx0qlFdNkn7OWpjBxMZMOg08WsCs2KzkPA9X2m+/pndjCGeKgzWPXkisQfATusd/KexX9FSpUU2j5KozuKM/z5diUHFAYQq3kYTO4xt0IwQP44p+eisEjlk1+P3kL9HmoiVHi/saq9Qj+KJRk/yCW9kcA5cAU7ZIARDkfBcWRAR9UUDHflOBfBkxgkOear04jEEBWVpZ0Rmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB7179.eurprd08.prod.outlook.com (2603:10a6:10:2cc::19) by VE1PR08MB4704.eurprd08.prod.outlook.com (2603:10a6:802:b0::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.14; Mon, 14 Feb 2022 08:27:58 +0000 Received: from DB9PR08MB7179.eurprd08.prod.outlook.com ([fe80::dca:9146:2814:3f63]) by DB9PR08MB7179.eurprd08.prod.outlook.com ([fe80::dca:9146:2814:3f63%7]) with mapi id 15.20.4975.019; Mon, 14 Feb 2022 08:27:58 +0000 Date: Mon, 14 Feb 2022 08:27:51 +0000 From: Szabolcs Nagy To: Florian Weimer Cc: libc-alpha@sourceware.org Subject: Re: [PATCH] Linux: Consolidate auxiliary vector parsing (redo) Message-ID: <20220214082751.GF2692478@arm.com> References: <87y22hqh2w.fsf@oldenburg.str.redhat.com> Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <87y22hqh2w.fsf@oldenburg.str.redhat.com> X-ClientProxiedBy: SA0PR11CA0074.namprd11.prod.outlook.com (2603:10b6:806:d2::19) To DB9PR08MB7179.eurprd08.prod.outlook.com (2603:10a6:10:2cc::19) MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 5c9accfc-90f6-4fed-16b4-08d9ef93f195 X-MS-TrafficTypeDiagnostic: VE1PR08MB4704:EE_|DB5EUR03FT029:EE_|AM8PR08MB5601:EE_ X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:2733;OLM:2733; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: PkrHxja95304xneAIdfg6sF88OWN9LMixcYxwGXCBhJC6i5i/GiSNeuOxM0Ut3CvYR3dGZ3C7Z+gr/ssDKYD/sH5lXIeVYU6BpZJjTR4UV+Bn8Fx83Ua8+AQ+m1EPLxM8EaiCjpVIQhR8lZ9PB3rgvEXx8+2UVkjyqZ+trnYqB58p/DFoC5501U4roYxO0aBDhF46CtIxrENRCCQZP7x0tTQKQ8cIV5Nai7WL2iZAgec4BGLKfa3WspNrYVn9pQ5lXdibmCaSuFZQWuDgK+QijHYm8bLcCa6uGSQVhHlobbTmuUFjs2porQqlB/iZSa3P+tRcx0iOoSMV4l6ulwAK7/+65LaTdd+KwDgVh++RvO6OG3b1l41fMMq/HUQFJNXbPlBzLixT8IqXDP2ww01QIJGU4DISh8S7qYmF0BCIrA2qd2lc+Rmg+gCF0qYPsAUGYONyRlGQDxojIV8kNi0nWHdcKQTH0TmlGvVAPeDGGoaHJR144T23xYdGFcWssGOSfPIdEZ45dz3FC8jIU1UPmJrfex/sePhmziXHwrJpEiqu2240FcU3fLE2q7j0s2asRG7zPcA44xco7fjerH+9P2pMD/j1s5LVOMD5kuKXCKn1BzBVPmoF2dR4DfPUIVf91m8PyG0Cz0oNO2dMDexU9sFOu2AgFA6d6zWqJmgqvnnvxdWE5etE7l92gAwaEM6jgXnBgP3SerD4Dgwplq4EGj4plUCToio6mzttx52CKoxAoN94Q8j4CRjyNtZcePZmlxfHGZD68V2fTvnGUKAjH1N0C7EcCFN7tpA/O1JchRnTsv4AX1uOFml1+2azBQf X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB9PR08MB7179.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(44832011)(6666004)(30864003)(2906002)(66946007)(36756003)(5660300002)(66556008)(66476007)(8936002)(8676002)(83380400001)(4326008)(86362001)(6486002)(1076003)(6916009)(26005)(38100700002)(6512007)(6506007)(186003)(2616005)(33656002)(38350700002)(52116002)(508600001)(316002)(2004002); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR08MB4704 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT029.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 8b008c8a-e012-43d0-42c6-08d9ef93e81b X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Vwa5RiLb7YS2dzghGuwdSiQyOkBSqmqw0bvXXhInjqoygpMbDhfCNgSmr+ZKZngp3fsPRz5Mz1WkXN35q8PCjKCsBiaH8M3OA8pnSbXjCeqGrPgNkpTiMeJkUGJPrdvlsGDXldvrHrU8d0Q48TYoqRECLJt9fRonEmGJbG0eDAwuEYlhWBlBo/BmKjj3fTlxS+v752rBTXfoeqF+/Gvnbx9emCqutqhFwGITK1fLsT2NPdHHsaFtkz5Qn9bt+zeIZEsYie2xFeWkbEBuwdB6yQvQyX1sMRsMA8qLiE7Nme3jsQT3+j5ffS7ayEF3eREeLTpVtjvpVfn46H0mkjd6p+DQ/2+AtKzxfR/5skBNRQswYN44PMSqqtYbAksmgZtebZ2hfEj3bq/Cw26+djuR/FinIoCAx9JYBBl/eQG/sA0gr1iL7s47bImGFPPYVt9xsTp6m9J25pD7rhUPniLQ5haDCRZ9gewXdnoy9+TjG1HEFRpAVo4Qk0npti3FI0rUQvn4AnOoct2wqzljJ3SwPpjKXUmZb/UOKaEopj6oV2IPfTIUJM5Z4Hz6Do1eCjzlliur7THiaM9hYGJGQJLGMdZW/B/5/Njbrxmo1lpj4d9nJyqYCIZm3P6qShIsKopgUWNgdzSA9qNWVTjVtffVr6E98XAHdjMdO2zzj8DfL/chvDkEFR6fiksaSJrvFBwSugW3rAgln0Llga94Zs3Hm6T+8nOcf2JfYGIV8SZmR0QjkV0pyZJX6nADdXpWtb8d7wTk827cd0bCu5Tm0FFaQQ== X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(13230001)(4636009)(46966006)(36840700001)(40470700004)(26005)(5660300002)(186003)(1076003)(83380400001)(4326008)(336012)(70586007)(86362001)(316002)(6486002)(70206006)(6862004)(8676002)(82310400004)(8936002)(2906002)(36860700001)(36756003)(356005)(6512007)(81166007)(508600001)(47076005)(30864003)(6666004)(2616005)(44832011)(33656002)(6506007)(40460700003)(2004002); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2022 08:28:14.1946 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5c9accfc-90f6-4fed-16b4-08d9ef93f195 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DB5EUR03FT029.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB5601 X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Feb 2022 08:28:21 -0000 The 02/11/2022 21:33, Florian Weimer via Libc-alpha wrote: > And optimize it slightly. > > This is commit 8c8510ab2790039e58995ef3a22309582413d3ff revised. > > In _dl_aux_init in elf/dl-support.c, use an explicit loop > and -fno-tree-loop-distribute-patterns to avoid memset. > > Tested on aarch64-linux-gnu, i686-linux-gnu, x86_64-linux-gnu. > Built with build-many-glibcs.py. thanks, this looks good. Reviewed-by: Szabolcs Nagy > > --- > elf/Makefile | 5 ++ > elf/dl-support.c | 85 +++----------------- > sysdeps/unix/sysv/linux/alpha/dl-auxv.h | 18 ++--- > sysdeps/unix/sysv/linux/dl-parse_auxv.h | 61 +++++++++++++++ > sysdeps/unix/sysv/linux/dl-sysdep.c | 112 ++++++++------------------- > sysdeps/unix/sysv/linux/powerpc/dl-auxv.h | 14 +--- > sysdeps/unix/sysv/linux/powerpc/dl-support.c | 4 + > 7 files changed, 117 insertions(+), 182 deletions(-) > > diff --git a/elf/Makefile b/elf/Makefile > index bff94954c9..65ba06d8b8 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -160,6 +160,11 @@ ifeq (yes,$(have-loop-to-function)) > CFLAGS-rtld.c += -fno-tree-loop-distribute-patterns > endif > > +ifeq (yes,$(have-loop-to-function)) > +# Likewise, during static library startup, memset is not yet available. > +CFLAGS-dl-support.c = -fno-tree-loop-distribute-patterns > +endif > + > # Compile rtld itself without stack protection. > # Also compile all routines in the static library that are elided from > # the shared libc because they are in libc.a in the same way. > diff --git a/elf/dl-support.c b/elf/dl-support.c > index 6d2c4baf81..153dd57ad2 100644 > --- a/elf/dl-support.c > +++ b/elf/dl-support.c > @@ -44,6 +44,7 @@ > #include > #include > #include > +#include > > extern char *__progname; > char **_dl_argv = &__progname; /* This is checked for some error messages. */ > @@ -240,93 +241,25 @@ __rtld_lock_define_initialized_recursive (, _dl_load_tls_lock) > > > #ifdef HAVE_AUX_VECTOR > +#include > + > int _dl_clktck; > > void > _dl_aux_init (ElfW(auxv_t) *av) > { > - int seen = 0; > - uid_t uid = 0; > - gid_t gid = 0; > - > #ifdef NEED_DL_SYSINFO > /* NB: Avoid RELATIVE relocation in static PIE. */ > GL(dl_sysinfo) = DL_SYSINFO_DEFAULT; > #endif > > _dl_auxv = av; > - for (; av->a_type != AT_NULL; ++av) > - switch (av->a_type) > - { > - case AT_PAGESZ: > - if (av->a_un.a_val != 0) > - GLRO(dl_pagesize) = av->a_un.a_val; > - break; > - case AT_CLKTCK: > - GLRO(dl_clktck) = av->a_un.a_val; > - break; > - case AT_PHDR: > - GL(dl_phdr) = (const void *) av->a_un.a_val; > - break; > - case AT_PHNUM: > - GL(dl_phnum) = av->a_un.a_val; > - break; > - case AT_PLATFORM: > - GLRO(dl_platform) = (void *) av->a_un.a_val; > - break; > - case AT_HWCAP: > - GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val; > - break; > - case AT_HWCAP2: > - GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val; > - break; > - case AT_FPUCW: > - GLRO(dl_fpu_control) = av->a_un.a_val; > - break; > -#ifdef NEED_DL_SYSINFO > - case AT_SYSINFO: > - GL(dl_sysinfo) = av->a_un.a_val; > - break; > -#endif > -#ifdef NEED_DL_SYSINFO_DSO > - case AT_SYSINFO_EHDR: > - GL(dl_sysinfo_dso) = (void *) av->a_un.a_val; > - break; > -#endif > - case AT_UID: > - uid ^= av->a_un.a_val; > - seen |= 1; > - break; > - case AT_EUID: > - uid ^= av->a_un.a_val; > - seen |= 2; > - break; > - case AT_GID: > - gid ^= av->a_un.a_val; > - seen |= 4; > - break; > - case AT_EGID: > - gid ^= av->a_un.a_val; > - seen |= 8; > - break; > - case AT_SECURE: > - seen = -1; > - __libc_enable_secure = av->a_un.a_val; > - __libc_enable_secure_decided = 1; > - break; > - case AT_RANDOM: > - _dl_random = (void *) av->a_un.a_val; > - break; > - case AT_MINSIGSTKSZ: > - _dl_minsigstacksize = av->a_un.a_val; > - break; > - DL_PLATFORM_AUXV > - } > - if (seen == 0xf) > - { > - __libc_enable_secure = uid != 0 || gid != 0; > - __libc_enable_secure_decided = 1; > - } > + dl_parse_auxv_t auxv_values; > + /* Use an explicit initialization loop here because memset may not > + be available yet. */ > + for (int i = 0; i < array_length (auxv_values); ++i) > + auxv_values[i] = 0; > + _dl_parse_auxv (av, auxv_values); > } > #endif > > diff --git a/sysdeps/unix/sysv/linux/alpha/dl-auxv.h b/sysdeps/unix/sysv/linux/alpha/dl-auxv.h > index 81d90da095..fcec743239 100644 > --- a/sysdeps/unix/sysv/linux/alpha/dl-auxv.h > +++ b/sysdeps/unix/sysv/linux/alpha/dl-auxv.h > @@ -20,16 +20,8 @@ > > extern long __libc_alpha_cache_shape[4]; > > -#define DL_PLATFORM_AUXV \ > - case AT_L1I_CACHESHAPE: \ > - __libc_alpha_cache_shape[0] = av->a_un.a_val; \ > - break; \ > - case AT_L1D_CACHESHAPE: \ > - __libc_alpha_cache_shape[1] = av->a_un.a_val; \ > - break; \ > - case AT_L2_CACHESHAPE: \ > - __libc_alpha_cache_shape[2] = av->a_un.a_val; \ > - break; \ > - case AT_L3_CACHESHAPE: \ > - __libc_alpha_cache_shape[3] = av->a_un.a_val; \ > - break; > +#define DL_PLATFORM_AUXV \ > + __libc_alpha_cache_shape[0] = auxv_values[AT_L1I_CACHESHAPE]; \ > + __libc_alpha_cache_shape[1] = auxv_values[AT_L1D_CACHESHAPE]; \ > + __libc_alpha_cache_shape[2] = auxv_values[AT_L2_CACHESHAPE]; \ > + __libc_alpha_cache_shape[3] = auxv_values[AT_L3_CACHESHAPE]; > diff --git a/sysdeps/unix/sysv/linux/dl-parse_auxv.h b/sysdeps/unix/sysv/linux/dl-parse_auxv.h > new file mode 100644 > index 0000000000..b3d82f6994 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/dl-parse_auxv.h > @@ -0,0 +1,61 @@ > +/* Parse the Linux auxiliary vector. > + Copyright (C) 1995-2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > +#include > +#include > + > +typedef ElfW(Addr) dl_parse_auxv_t[AT_MINSIGSTKSZ + 1]; > + > +/* Copy the auxiliary vector into AUX_VALUES and set up GLRO > + variables. */ > +static inline > +void _dl_parse_auxv (ElfW(auxv_t) *av, dl_parse_auxv_t auxv_values) > +{ > + auxv_values[AT_ENTRY] = (ElfW(Addr)) ENTRY_POINT; > + auxv_values[AT_PAGESZ] = EXEC_PAGESIZE; > + auxv_values[AT_FPUCW] = _FPU_DEFAULT; > + > + /* NB: Default to a constant CONSTANT_MINSIGSTKSZ. */ > + _Static_assert (__builtin_constant_p (CONSTANT_MINSIGSTKSZ), > + "CONSTANT_MINSIGSTKSZ is constant"); > + auxv_values[AT_MINSIGSTKSZ] = CONSTANT_MINSIGSTKSZ; > + > + for (; av->a_type != AT_NULL; av++) > + if (av->a_type <= AT_MINSIGSTKSZ) > + auxv_values[av->a_type] = av->a_un.a_val; > + > + GLRO(dl_pagesize) = auxv_values[AT_PAGESZ]; > + __libc_enable_secure = auxv_values[AT_SECURE]; > + GLRO(dl_platform) = (void *) auxv_values[AT_PLATFORM]; > + GLRO(dl_hwcap) = auxv_values[AT_HWCAP]; > + GLRO(dl_hwcap2) = auxv_values[AT_HWCAP2]; > + GLRO(dl_clktck) = auxv_values[AT_CLKTCK]; > + GLRO(dl_fpu_control) = auxv_values[AT_FPUCW]; > + _dl_random = (void *) auxv_values[AT_RANDOM]; > + GLRO(dl_minsigstacksize) = auxv_values[AT_MINSIGSTKSZ]; > + GLRO(dl_sysinfo_dso) = (void *) auxv_values[AT_SYSINFO_EHDR]; > +#ifdef NEED_DL_SYSINFO > + if (GLRO(dl_sysinfo_dso) != NULL) > + GLRO(dl_sysinfo) = auxv_values[AT_SYSINFO]; > +#endif > + > + DL_PLATFORM_AUXV > +} > diff --git a/sysdeps/unix/sysv/linux/dl-sysdep.c b/sysdeps/unix/sysv/linux/dl-sysdep.c > index 8ad72c4b7b..71cf1968b5 100644 > --- a/sysdeps/unix/sysv/linux/dl-sysdep.c > +++ b/sysdeps/unix/sysv/linux/dl-sysdep.c > @@ -18,15 +18,15 @@ > > #include <_itoa.h> > #include > +#include > #include > #include > +#include > #include > #include > #include > -#include > #include > #include > -#include > #include > #include > #include > @@ -45,8 +45,6 @@ > #include > > #ifdef SHARED > -# include > - > extern char **_environ attribute_hidden; > extern char _end[] attribute_hidden; > > @@ -64,20 +62,20 @@ void *_dl_random attribute_relro = NULL; > # define DL_STACK_END(cookie) ((void *) (cookie)) > #endif > > -ElfW(Addr) > -_dl_sysdep_start (void **start_argptr, > - void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum, > - ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv)) > +/* Arguments passed to dl_main. */ > +struct dl_main_arguments > { > - const ElfW(Phdr) *phdr = NULL; > - ElfW(Word) phnum = 0; > + const ElfW(Phdr) *phdr; > + ElfW(Word) phnum; > ElfW(Addr) user_entry; > - ElfW(auxv_t) *av; > -#ifdef NEED_DL_SYSINFO > - uintptr_t new_sysinfo = 0; > -#endif > +}; > > - __libc_stack_end = DL_STACK_END (start_argptr); > +/* Separate function, so that dl_main can be called without the large > + array on the stack. */ > +static void > +_dl_sysdep_parse_arguments (void **start_argptr, > + struct dl_main_arguments *args) > +{ > _dl_argc = (intptr_t) *start_argptr; > _dl_argv = (char **) (start_argptr + 1); /* Necessary aliasing violation. */ > _environ = _dl_argv + _dl_argc + 1; > @@ -89,75 +87,26 @@ _dl_sysdep_start (void **start_argptr, > break; > } > > - user_entry = (ElfW(Addr)) ENTRY_POINT; > - GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */ > + dl_parse_auxv_t auxv_values = { 0, }; > + _dl_parse_auxv (GLRO(dl_auxv), auxv_values); > > - /* NB: Default to a constant CONSTANT_MINSIGSTKSZ. */ > - _Static_assert (__builtin_constant_p (CONSTANT_MINSIGSTKSZ), > - "CONSTANT_MINSIGSTKSZ is constant"); > - GLRO(dl_minsigstacksize) = CONSTANT_MINSIGSTKSZ; > + args->phdr = (const ElfW(Phdr) *) auxv_values[AT_PHDR]; > + args->phnum = auxv_values[AT_PHNUM]; > + args->user_entry = auxv_values[AT_ENTRY]; > +} > > - for (av = GLRO(dl_auxv); av->a_type != AT_NULL; av++) > - switch (av->a_type) > - { > - case AT_PHDR: > - phdr = (void *) av->a_un.a_val; > - break; > - case AT_PHNUM: > - phnum = av->a_un.a_val; > - break; > - case AT_PAGESZ: > - GLRO(dl_pagesize) = av->a_un.a_val; > - break; > - case AT_ENTRY: > - user_entry = av->a_un.a_val; > - break; > - case AT_SECURE: > - __libc_enable_secure = av->a_un.a_val; > - break; > - case AT_PLATFORM: > - GLRO(dl_platform) = (void *) av->a_un.a_val; > - break; > - case AT_HWCAP: > - GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val; > - break; > - case AT_HWCAP2: > - GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val; > - break; > - case AT_CLKTCK: > - GLRO(dl_clktck) = av->a_un.a_val; > - break; > - case AT_FPUCW: > - GLRO(dl_fpu_control) = av->a_un.a_val; > - break; > -#ifdef NEED_DL_SYSINFO > - case AT_SYSINFO: > - new_sysinfo = av->a_un.a_val; > - break; > -#endif > - case AT_SYSINFO_EHDR: > - GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; > - break; > - case AT_RANDOM: > - _dl_random = (void *) av->a_un.a_val; > - break; > - case AT_MINSIGSTKSZ: > - GLRO(dl_minsigstacksize) = av->a_un.a_val; > - break; > - DL_PLATFORM_AUXV > - } > +ElfW(Addr) > +_dl_sysdep_start (void **start_argptr, > + void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum, > + ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv)) > +{ > + __libc_stack_end = DL_STACK_END (start_argptr); > + > + struct dl_main_arguments dl_main_args; > + _dl_sysdep_parse_arguments (start_argptr, &dl_main_args); > > dl_hwcap_check (); > > -#ifdef NEED_DL_SYSINFO > - if (new_sysinfo != 0) > - { > - /* Only set the sysinfo value if we also have the vsyscall DSO. */ > - if (GLRO(dl_sysinfo_dso) != 0) > - GLRO(dl_sysinfo) = new_sysinfo; > - } > -#endif > - > __tunables_init (_environ); > > /* Initialize DSO sorting algorithm after tunables. */ > @@ -188,8 +137,9 @@ _dl_sysdep_start (void **start_argptr, > if (__builtin_expect (__libc_enable_secure, 0)) > __libc_check_standard_fds (); > > - (*dl_main) (phdr, phnum, &user_entry, GLRO(dl_auxv)); > - return user_entry; > + (*dl_main) (dl_main_args.phdr, dl_main_args.phnum, > + &dl_main_args.user_entry, GLRO(dl_auxv)); > + return dl_main_args.user_entry; > } > > void > diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h b/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h > index 594371940a..ce2281cf11 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h > +++ b/sysdeps/unix/sysv/linux/powerpc/dl-auxv.h > @@ -16,15 +16,5 @@ > License along with the GNU C Library; if not, see > . */ > > -#include > - > -#if IS_IN (libc) && !defined SHARED > -int GLRO(dl_cache_line_size); > -#endif > - > -/* Scan the Aux Vector for the "Data Cache Block Size" entry and assign it > - to dl_cache_line_size. */ > -#define DL_PLATFORM_AUXV \ > - case AT_DCACHEBSIZE: \ > - GLRO(dl_cache_line_size) = av->a_un.a_val; \ > - break; > +#define DL_PLATFORM_AUXV \ > + GLRO(dl_cache_line_size) = auxv_values[AT_DCACHEBSIZE]; > diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-support.c b/sysdeps/unix/sysv/linux/powerpc/dl-support.c > new file mode 100644 > index 0000000000..abe68a7049 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/powerpc/dl-support.c > @@ -0,0 +1,4 @@ > +#include > + > +/* Populated from the auxiliary vector. */ > +int _dl_cache_line_size; >