1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Tue Jun 4 18:57:57 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>

* elf/dladdr.c: Remove #include <setjmp.h>, we don't use it.

	* shlib-versions: Set libdl=2.

	* elf/dl-deps.c (_dl_map_object_deps): Use a linked list of alloca'd
 	elements and then scan it to fill the single malloc'd array, instead
 	of using realloc to grow the array in the first pass.  _dl_map_object
	may do some mallocs that break our stream of reallocs, and the minimal
	realloc can't handle that.

	* elf/dl-init.c (_dl_init_next): Take argument, link_map whose
 	searchlist describes the piece of the DT_NEEDED graph to be
 	initialized.
	* elf/link.h: Update prototype.
	* sysdeps/i386/dl-machine.h (RTLD_START): Pass _dl_loaded as argument
	to _dl_init_next.
	* sysdeps/m68k/dl-machine.h: Likewise.
	* elf/dl-deps.c (_dl_open): Pass new object as arg to _dl_init_next.

	* elf/link.h (struct link_map): Add `l_reserved' member, soaking up
	extra bits in last byte.
	* elf/dl-deps.c (_dl_map_object_deps): Use that for mark bit to avoid
	putting dup elts in search list.

	* elf/dlclose.c: Use MAP->l_searchlist to find deps to close.

	* elf/dlsym.c: Don't tweak linked list.  Scope array given to
	_dl_lookup_symbol does the right thing.
Tue Jun  4 02:25:44 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
This commit is contained in:
Roland McGrath
1996-06-04 23:06:02 +00:00
parent 14d898aef6
commit f68b86cc7b
10 changed files with 175 additions and 125 deletions

View File

@ -1,5 +1,5 @@
/* Return the next shared object initializer function not yet run.
Copyright (C) 1995 Free Software Foundation, Inc.
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -21,45 +21,35 @@ Cambridge, MA 02139, USA. */
#include <link.h>
Elf32_Addr
_dl_init_next (void)
{
struct link_map *l;
Elf32_Addr init;
/* Run initializers for MAP and its dependencies, in inverse dependency
order (that is, leaf nodes first). */
Elf32_Addr next_init (struct link_map *l)
Elf32_Addr
_dl_init_next (struct link_map *map)
{
unsigned int i;
/* The search list for symbol lookup is a flat list in top-down
dependency order, so processing that list from back to front gets us
breadth-first leaf-to-root order. */
i = map->l_nsearchlist;
while (i-- > 0)
{
struct link_map *l = map->l_searchlist[i];
if (l->l_init_called)
/* This object is all done. */
return 0;
continue;
if (l->l_init_running)
{
/* This object's initializer was just running.
Now mark it as having run, so this object
will be skipped in the future. */
l->l_init_called = 1;
l->l_init_running = 0;
return 0;
}
if (l->l_info[DT_NEEDED])
{
/* Find each dependency in order, and see if it
needs to run an initializer. */
const char *strtab
= ((void *) l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr);
const Elf32_Dyn *d;
for (d = l->l_ld; d->d_tag != DT_NULL; ++d)
if (d->d_tag == DT_NEEDED)
{
struct link_map *needed
= _dl_map_object (l, strtab + d->d_un.d_val);
Elf32_Addr init;
--needed->l_opencount;
init = next_init (needed); /* Recurse on this dependency. */
if (init != 0)
return init;
}
l->l_init_called = 1;
continue;
}
if (l->l_info[DT_INIT] &&
@ -73,17 +63,7 @@ _dl_init_next (void)
/* No initializer for this object.
Mark it so we will skip it in the future. */
l->l_init_called = 1;
return 0;
}
/* Look for the first initializer not yet called. */
l = _dl_loaded;
do
{
init = next_init (l);
l = l->l_next;
}
while (init == 0 && l);
return init;
return 0;
}