This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v4 3/3] elf: avoid stack allocation in dl_open_worker
- From: David Kilroy <David dot Kilroy at arm dot com>
- To: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>
- Cc: nd <nd at arm dot com>
- Date: Wed, 29 Jan 2020 11:17:33 +0000
- Subject: [PATCH v4 3/3] elf: avoid stack allocation in dl_open_worker
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
- 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-SenderADCheck; bh=YlGsu/Dm6xBDP3IL2hK8M2qGQNrBbWqRcGTmzLPHlKc=; b=afPr7vAeHwReFagnEqWxEMecKdwm3JypRGhRM5Q3MOdSLG+CcdDVmg2tOlO7OGM3wWqkyur/qAyAzfEwLvkp6vC/yow0Rvaw06MPiOetNAlWT7FAa3Dv8Psap/R3wslIqm9KHeEZgxnzW2ghbCMz9P+IogCZadTyL9wMU0wFNQpyugT/R6dLNX3VEmhUeQp+0WhX9KUAyA+ffXLh7hjqDOw1xMsDX3Hkfe/aljUvPJMyVVMG9S/WJJTC3uWTA9Oz71LzQYcPRVQkOXRUrkpf31w+shZuvTkaKTg50oseL+aFL4pxeEibVm0X06UcsrvL6xjOOiPi+g3QbAhDi96omw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PZMjGLclHxJOJEDcGDPpU4/dW8NDZost8vi7Agu6tlNjKjWllirK9xzBxijHoKDU1GJkJsDCmej6CyaOzj++sX3T/Pgj35hdfASmLEe/t2XLlmmcFCSjcUiC3bcUXAIEgiS+SIoIYkR8lRNTpEA6bMceExFYk001okHosiLAaj/TzpKVsH9dpxpOaUy5iXFs2B7y7MGWQ/umttNIJHiZ4rnQRyGxuqmcJew4k1KmV9DoN2AR0bnXIicEBHWvQ/OTuxNnX+dPxFVFSQNp9bwBmYvzfeVLiPj6fuug2cNcmnERKwd7z++L5Rks7rdB8himJkGmvzAZmkeKh3WDI/hamw==
- Original-authentication-results: spf=none (sender IP is ) smtp.mailfrom=David dot Kilroy at arm dot com;
- References: <1580296643-36839-1-git-send-email-david.kilroy@arm.com>
As the sort was removed, there's no need to keep a separate map of
links. Instead, when relocating objects iterate over l_initfini
directly.
This allows us to remove the loop copying l_initfini elements into
map. We still need a loop to identify the first and last elements that
need relocation.
Tested by running the testsuite on x86_64.
---
elf/dl-open.c | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 314adc2..7b3b177 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -621,25 +621,18 @@ dl_open_worker (void *a)
This allows IFUNC relocations to work and it also means copy
relocation of dependencies are if necessary overwritten.
__dl_map_object_deps has already sorted l_initfini for us. */
- unsigned int nmaps = 0;
+ unsigned int first = UINT_MAX;
+ unsigned int last = 0;
unsigned int j = 0;
struct link_map *l = new->l_initfini[0];
do
{
if (! l->l_real->l_relocated)
- ++nmaps;
- l = new->l_initfini[++j];
- }
- while (l != NULL);
- /* Stack allocation is limited by the number of loaded objects. */
- struct link_map *maps[nmaps];
- nmaps = 0;
- j = 0;
- l = new->l_initfini[0];
- do
- {
- if (! l->l_real->l_relocated)
- maps[nmaps++] = l;
+ {
+ if (first == UINT_MAX)
+ first = j;
+ last = j + 1;
+ }
l = new->l_initfini[++j];
}
while (l != NULL);
@@ -654,9 +647,12 @@ dl_open_worker (void *a)
them. However, such relocation dependencies in IFUNC resolvers
are undefined anyway, so this is not a problem. */
- for (unsigned int i = nmaps; i-- > 0; )
+ for (unsigned int i = last; i-- > first; )
{
- l = maps[i];
+ l = new->l_initfini[i];
+
+ if (l->l_real->l_relocated)
+ continue;
if (! relocation_in_progress)
{
--
2.7.4