From: Roland McGrath Date: Thu, 28 Sep 1995 17:05:33 +0000 (+0000) Subject: (rtld_command): Variable removed. (_dl_skip_args): New variable. (dl_main): Increment... X-Git-Tag: cvs/libc-951016~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=91f62ce6b5797f04006ac5aff08416ecd61bf972;p=platform%2Fupstream%2Fglibc.git (rtld_command): Variable removed. (_dl_skip_args): New variable. (dl_main): Increment _dl_skip_args instead of setting rtld_command. If the link_map for the executable itself is not first in the chain, make it so. --- diff --git a/elf/rtld.c b/elf/rtld.c index ac14c45..df91573 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -100,7 +100,7 @@ _dl_start (void *arg) void _start (void); -static int rtld_command; /* Nonzero if we were run directly. */ +unsigned int _dl_skip_args; /* Nonzero if we were run directly. */ static void dl_main (const Elf32_Phdr *phdr, @@ -147,7 +147,7 @@ file you run. This is mostly of use for maintainers to test new versions\n\ of this helper program; chances are you did not intend to run this program.\n", NULL); - rtld_command = 1; + ++_dl_skip_args; interpreter_name = _dl_argv[0]; --_dl_argc; ++_dl_argv; @@ -167,6 +167,20 @@ of this helper program; chances are you did not intend to run this program.\n", interpreter_name = 0; } + if (l != _dl_loaded) + { + /* GDB assumes that the first element on the chain is the + link_map for the executable itself, and always skips it. + Make sure the first one is indeed that one. */ + l->l_prev->l_next = l->l_next; + if (l->l_next) + l->l_next->l_prev = l->l_prev; + l->l_prev = NULL; + l->l_next = _dl_loaded; + _dl_loaded->l_prev = l; + _dl_loaded = l; + } + /* Scan the program header table for the dynamic section. */ for (ph = phdr; ph < &phdr[phent]; ++ph) switch (ph->p_type) @@ -220,7 +234,8 @@ of this helper program; chances are you did not intend to run this program.\n", } l = _dl_loaded->l_next; - assert (l->l_type == lt_interpreter); + while (l->l_type != lt_interpreter) + l = l->l_next; if (l->l_opencount == 0) { /* No DT_NEEDED entry referred to the interpreter object itself.