1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- From 50b605dece16606dd9d1c737e579c13725eab11d Mon Sep 17 00:00:00 2001
- From: Mark Hatle <mark.hatle@windriver.com>
- Date: Thu, 18 Aug 2016 14:07:58 -0500
- Subject: [PATCH] elf/dl-deps.c: Make _dl_build_local_scope breadth first
- According to the ELF specification:
- When resolving symbolic references, the dynamic linker examines the symbol
- tables with a breadth-first search.
- This function was using a depth first search. By doing so the conflict
- resolution reported to the prelinker (when LD_TRACE_PRELINKING=1 is set)
- was incorrect. This caused problems when their were various circular
- dependencies between libraries. The problem usually manifested itself by
- the wrong IFUNC being executed.
- [BZ# 20488]
- Upstream-Status: Submitted [libc-alpha]
- Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
- ---
- elf/dl-deps.c | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
- diff --git a/elf/dl-deps.c b/elf/dl-deps.c
- index 087a49b212..c09f9334f2 100644
- --- a/elf/dl-deps.c
- +++ b/elf/dl-deps.c
- @@ -73,13 +73,19 @@ _dl_build_local_scope (struct link_map **list, struct link_map *map)
- {
- struct link_map **p = list;
- struct link_map **q;
- + struct link_map **r;
-
- *p++ = map;
- map->l_reserved = 1;
- - if (map->l_initfini)
- - for (q = map->l_initfini + 1; *q; ++q)
- - if (! (*q)->l_reserved)
- - p += _dl_build_local_scope (p, *q);
- +
- + for (r = list; r < p; ++r)
- + if ((*r)->l_initfini)
- + for (q = (*r)->l_initfini + 1; *q; ++q)
- + if (! (*q)->l_reserved)
- + {
- + *p++ = *q;
- + (*q)->l_reserved = 1;
- + }
- return p - list;
- }
-
|