This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 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: Thu, 17 Oct 2019 10:33:19 +0000
- Subject: [PATCH 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=03g3Eo+7UTtbwzPTbP1GJ1Kqvt6lXYmJurQApX5TCmc=; b=b3TkBym3UBjyOUwsel/+1kbZcHlfu1gM0MNXYcJcOqTk5RjdvaCpwcTMYsS4M2OWn5F48iZqxr15PGE60V07bbgbwEC4IkMedQlyj2Qp0J2OI+5YbwAQP+mcWe8BeIYLTJkrWJ4yPsXYKIef6cTadIrII/r/t15bsiY9xSFSiTzKpBzlt17biSM7R3MLzr1SHqS5XNNCakTij+enO+6CvnXkesfDld3Rf3E76rTEM5MRv2f2fOja/1AchKKvGqW6KxHeA4KgJ9JjHbHGxGjzDP7NN7bHmI9xSx1GH4Lek2J0GbUEBedgY/qcad5WZqQa/70hOnzLzgd3Hr7X4G9vfQ==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JdPyHhOk5bHnRxGCniArTKbgFlbZD6Rkn83NV7uZEbq6XC4Ujy3YpeiUPM5NVGctIvUGg1tems355qeUpBc3VuG59+Tq6MbtgcwIpkBj4qZ0iQ6MPnovEroR/RzKhPYcmzVjRybutz8EOX/di9EQRCkDLWUWG4jsVb4PwlWcD2D1nUYzv6sORNvvfM8xyaCc3j3SCj1qC/W3JbmBpj5vdSOyzaIl57g/w/Iuroswo4Z2cgETITxPGXyUyU0xUAi4HZbHsxQU2MnmajVfPWVWfm7yMEOvi8avfbWjCwpdhbeskBrwega7L2ubxhe4XEe1m1hQ/FnrL92EHXDCn6accA==
- Original-authentication-results: spf=none (sender IP is ) smtp.mailfrom=David dot Kilroy at arm dot com;
- References: <cover.1571301957.git.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 25e8fb0..d96921a 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -304,34 +304,30 @@ dl_open_worker (void *a)
/* Sort the objects by dependency for the relocation process. This
allows IFUNC relocations to work and it also means copy
relocation of dependencies are if necessary overwritten. */
- 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);
int relocation_in_progress = 0;
- 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