From patchwork Tue Oct 24 14:26:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szabolcs Nagy X-Patchwork-Id: 23780 Received: (qmail 122801 invoked by alias); 24 Oct 2017 14:26:27 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 122784 invoked by uid 89); 24 Oct 2017 14:26:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=uncommon X-HELO: EUR01-HE1-obe.outbound.protection.outlook.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Szabolcs.Nagy@arm.com; Message-ID: <59EF4D89.2030509@arm.com> Date: Tue, 24 Oct 2017 15:26:17 +0100 From: Szabolcs Nagy User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: GNU C Library CC: nd@arm.com Subject: [PATCH 2/7] aarch64: Disable lazy symbol binding of TLSDESC References: <59EF4CEC.8020301@arm.com> In-Reply-To: <59EF4CEC.8020301@arm.com> X-ClientProxiedBy: AM5PR0202CA0016.eurprd02.prod.outlook.com (2603:10a6:203:69::26) To DB6PR0802MB2486.eurprd08.prod.outlook.com (2603:10a6:4:a0::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d09af0cb-9b8f-4812-e03c-08d51aeb3252 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603199)(49563074); SRVR:DB6PR0802MB2486; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2486; 3:DVSFFHNFiT5QbCHerQKvQEjT90SKRh//zkSJp2INghuTQHHcT87YYZqxIIt/5CL6OkQBnFrooh6OTDfLj9dX/5BWEHKh2M3MwDRVdYGgKs/XLh6sZjSWI6D8Ecc72KrBlnLvUvVtovCw2dSgWH08e+zAZiOuy0h3y8UF83Iy2CC2JNMVM+5JJfSSpOqlsgyMxo7DoagMeCefoJ0iPxqgrwpw5XoJ8U0o8rnVm5F3u52w4NrxNHXMOzrFafgvxlDc; 25:P/Y0opb42lm/NXfb9+kkNnrPHkTIbomDY6b3gh5Rme8ZIL+08JpRzg/e7+HZ/CKqMekGbkNuqa9ld6XHYOTXre+6tOuErPzNwKXtLrJjvYR4we5ZZFWkXhHckmu1lPFeEtyORPEFOjEBLOO77ZFUQjZohuKdr2Xs0kdftn/W8fqjeQSSiPLb/E7YGgmijuZbShTBrsoNcIacW000kFVbWLLv0qNRFlY3BQtJRxxFhV8=; 31:PbboGYT/EJXIPtycczRTemreCGDlvzOO6/Qia9HEZTULMsYe6JpttRntNiMAao85WYTfk1lBpwBRoIsGPcEDNWtKuVLJfFWGfKo2ehY8Xt2VRtDOhWikeszMMWxCKkns; 20:hDShcmi1YEvC2FTnIairw1WYlgSuJwrXaXns5vgxmuHvrxqzZJiRq3mrnyQbCzaZvJsEYnglqUCcb1ONUkDUb97dAJaJeuH93s+IR1anXLG+pyC8e105GM/14W5hZVU3G0IXC/VA3pZizExnZM0RY/tUMrU8nQYgsS4K9fj0/xY= X-MS-TrafficTypeDiagnostic: DB6PR0802MB2486: NoDisclaimer: True X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(102415395)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3231020)(3002001)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123564025)(20161123562025)(20161123555025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DB6PR0802MB2486; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DB6PR0802MB2486; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2486; 4:9ToDH4RqjL3vyy7pGBDNBRHhN150uQECYlufOGPxLLjwZ0fX+WXZo7dn6LkAX0VPhM02Uor8sfAb5FUGbeqbZZ+Espk8x492Zz0aHymB5PtWusueWF4QcxfvdT+rSzrWpNDqoL2lawTBMV1dNEKNAA== X-Forefront-PRVS: 047001DADA X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(6049001)(346002)(39860400002)(376002)(189002)(199003)(16586007)(6116002)(65956001)(6486002)(478600001)(270700001)(72206003)(64126003)(77096006)(66066001)(5890100001)(6666003)(84326002)(68736007)(562524006)(65806001)(6916009)(2950100002)(573454002)(2476003)(97736004)(568964002)(36756003)(3846002)(2906002)(59896002)(101416001)(105586002)(7736002)(33656002)(564344004)(106356001)(16526018)(8676002)(4610100001)(81156014)(83506002)(8936002)(305945005)(5000100001)(50986999)(4326008)(25786009)(80316001)(53936002)(86362001)(58126008)(81166006)(16576012)(87266999)(65816999)(76176999)(54356999)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0802MB2486; H:[10.2.206.69]; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB6PR0802MB2486; 23:AruDXrHn8RWxxtzB46csqdmAEuqqW/5gNcA9utK?= =?us-ascii?Q?tXIHOetWFry7FbxJtjz7evYD8mTGqPL7aJrGztqjHu69CXUfTMhCTy1X82UK?= =?us-ascii?Q?LiOM81yQYk16QVJcRJN2syKy0ieXwaoagPVtkX8eMbkY//4XRqfXSbW7H3to?= =?us-ascii?Q?XwMx4XK+Hvi99alyfoOXfNey2SaatsS3bMj5qPeHVsaqzx6IYPBZmAoXqf8B?= =?us-ascii?Q?DkO7Low0Gmf+HKFLQoUTbeCk50by3avlGHY26oeb2bYbEqkgNN3LIoJA6NFA?= =?us-ascii?Q?0aOpVrhC3Mg5zSkE9kE1BgnZ257HHk4BWvWSaEg2cD3vwI99P1oxCZBUSsJI?= =?us-ascii?Q?M4SR6jB4E8gKi3HMkpwZNGy15KVMH0PISM64iZkJR1TAsVuO6oRm2XSRYMZ0?= =?us-ascii?Q?NxY2NJ05wfnt8VfKWYk66j8smuZ6s8o51eGCiB7pzpTGenBiNwRSenKs2rqv?= =?us-ascii?Q?gOP6JQHHgW2M1hBdAZYSB+VOUSt96ZKU38OyK8rZZ9lKGClaLwqwIg0OMaqg?= =?us-ascii?Q?RcGuOovwT9akoPKgAaf4FDjhJIzN/QaNQhmgNIfgbEGdrlzZcgt8mPqlfuTu?= =?us-ascii?Q?yOdmYZOGO3qmIOP5GwDdTWjRFj+DqNI+yZAoY+UUZJYNe0ULY0fJ8XrR/aEE?= =?us-ascii?Q?/8eqih//sylDC6Y6oTR6otKGUXVEwApkLmcBriotas5iU6Iw0AJOE0/SEiH5?= =?us-ascii?Q?bP1IbbcihshpULLouDfsN6gU7xc6mrGxW+aP6dv794bNCoVUv4ChWiaRB9OB?= =?us-ascii?Q?mnxgifWgUA2mlgE6NI4jTryRwjkoiZ/n5N+rt4eNsYlXIWG4e8uz8FlHrHBl?= =?us-ascii?Q?6UGgJNWzNr+OdVJljkefOKsenlf/pV1MXM5DByRV8Z8I7BqIGfj3NDIVhDV8?= =?us-ascii?Q?hUboTGbXPiI2Ez1UMDJ7tKfTyG61pJ+saj7foFgo178nIX5Mj8pUM2+r6gjw?= =?us-ascii?Q?LFfH0hLv0zNXN+mohBGZgqg0fDG9YlPbMFG5yhbgCln0AZ0A7p9bjsCpty8x?= =?us-ascii?Q?Ls8iQCMeygsBKmAcneq2/+2o+UC8uQCcGGgML2uGMYsHNvpFuw7zlbKX8XI/?= =?us-ascii?Q?XRWB1RwZW7uvMdd03ctYUH9qJZkdAJ2OO0O51Bu59mpqQgVRv7MXZmohPhJZ?= =?us-ascii?Q?S3RQcvYFBS1tiZH129AWCDgVXY7GOYF7bCntiVF8P+LFwWLeaBzasZM+LRlZ?= =?us-ascii?Q?lQLDyl02Vy06ph3TDEdM+RZAppynjMf2e8JOdg58zTSE0/CidD9ZTAMzDC/D?= =?us-ascii?Q?lgkMvjV2xsowziY76pXggkfS4H7oIkLq7ysaDVzf4nlJzlAmB6jeyfS9XuVK?= =?us-ascii?Q?x1LFgc5apguVjELVzsWY97pvnZY74X2h87tSz9bmJE42E2ka9ge1ubiSu/Pn?= =?us-ascii?Q?K+S+EqmYFABjhvw9sp/CtrgLOjlUzAmfIJPuib+K26AwTvlwKsOodpknX8xg?= =?us-ascii?Q?wve4KgkwrIQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2486; 6:DJFPL1r06SxfofupDwY8TLWPLA5P0Y75U92We5y0xfGepaZQT70ib1yKJzhTjYB7Q9huUz9j6NmJV5Mk0LpeinKlZ3z9GBHzjIVgg4NaVO4Q+b3D3N9CdAqhnp4DhFXo3qYNMK270nB4HVR8OPcQxHbnppTrg9TENlgX5vbkyfdXCPMexa4t97DeT920k7G7tf4y9TiRVYbeFksvO+M3VeBOkQD5BfTz1+ykEYEW0wM=; 5:8iI3MRRVwm4WHiN88lPftMiiQdwJq6BuC/yXFbeTOIoe3Kkqz1hn7f0s/wQRze0ZR5KA0TEPjavV8p8jN/mor0AscetTv1ndXrvCAYr+65Ii38A1hp/8j01urrKlqbJGX8NtwpT9nEykKX5CT/C3Xg==; 24:CiST9Nr2MH6lh4jqm8CrU1CviGptGXe3gb+P9o5s/7osLZBt/BZd9fcpRUjLgv99QNGh9L2eZp+ekLohhhPsGt+oy5y/VnLoK5YC/WroSPI=; 7:wiwFiuCdW0Wby0l0iITaVdR7foHoIx0GZTUM180qCbzLhQv8dmzA+d3EoiF2BnkbEIfjdp7OEGwjg/r76cX2E1kYEy3AKSogOyb8FkbUhhZPZJ5GTetlawOcOpgKJTZFra+7uof3dWIyrnKxfapmV1YtsYEjf7p1zR2nZ85wRlB5hL65wyoWpizUQyjgg2WA4/wORCcTHieC4bdaC837rZhqu6ya5iTzKlPu2QOHikM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Oct 2017 14:26:20.1722 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d09af0cb-9b8f-4812-e03c-08d51aeb3252 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0802MB2486 From dde90201e8c20fb612d931dca9fb4308cdb73716 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Wed, 27 Sep 2017 16:55:14 +0100 Subject: [PATCH 2/7] aarch64: Disable lazy symbol binding of TLSDESC Always do TLS descriptor initialization at load time during relocation processing to avoid barriers at every TLS access. In non-dlopened shared libraries the overhead of tls access vs static global access is > 3x bigger when lazy initialization is used (_dl_tlsdesc_return_lazy) compared to bind-now (_dl_tlsdesc_return) so the barriers dominate tls access performance. TLSDESC relocs are in DT_JMPREL which are processed at load time using elf_machine_lazy_rel which is only supposed to do lightweight initialization using the DT_TLSDESC_PLT trampoline (the trampoline code jumps to the entry point in DT_TLSDESC_GOT which does the lazy tlsdesc initialization at runtime). This patch changes elf_machine_lazy_rel in aarch64 to do the symbol binding and initialization as if DF_BIND_NOW was set, so the non-lazy code path of elf/do-rel.h was replicated. The static linker could be changed to emit TLSDESC relocs in DT_REL*, which are processed non-lazily, but the goal of this patch is to always guarantee bind-now semantics, even if the binary was produced with an old linker, so the barriers can be dropped in tls descriptor functions. After this change the synchronizing ldar instructions can be dropped as well as the lazy initialization machinery including the DT_TLSDESC_GOT setup. I believe this should be done on all targets, including ones where no barrier is needed for lazy initialization. There is very little gain in optimizing for large number of symbolic tlsdesc relocations which is an extremely uncommon case. And currently the tlsdesc entries are only readonly protected with -z now and some hardennings against writable JUMPSLOT relocs don't work for TLSDESC so they are a security hazard. (But to fix that the static linker has to be changed.) 2017-09-29 Szabolcs Nagy * sysdeps/aarch64/dl-machine.h (elf_machine_lazy_rel): Do symbol binding and initialization non-lazily for R_AARCH64_TLSDESC. --- sysdeps/aarch64/dl-machine.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h index e7656129f5..837e28134b 100644 --- a/sysdeps/aarch64/dl-machine.h +++ b/sysdeps/aarch64/dl-machine.h @@ -399,12 +399,21 @@ elf_machine_lazy_rel (struct link_map *map, } else if (__builtin_expect (r_type == AARCH64_R(TLSDESC), 1)) { - struct tlsdesc volatile *td = - (struct tlsdesc volatile *)reloc_addr; + const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info); + const ElfW (Sym) *symtab = (const void *)D_PTR (map, l_info[DT_SYMTAB]); + const ElfW (Sym) *sym = &symtab[symndx]; + const struct r_found_version *version = NULL; - td->arg = (void*)reloc; - td->entry = (void*)(D_PTR (map, l_info[ADDRIDX (DT_TLSDESC_PLT)]) - + map->l_addr); + if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) + { + const ElfW (Half) *vernum = + (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); + version = &map->l_versions[vernum[symndx] & 0x7fff]; + } + + /* Always initialize TLS descriptors completely, because lazy + initialization requires synchronization at every TLS access. */ + elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc); } else if (__glibc_unlikely (r_type == AARCH64_R(IRELATIVE))) { -- 2.11.0