* elf/dl-close.c: Handle failed loads which would have gone in the
	global scope correctly.

	* elf/testobj1.c: Include stdlib.h to get NULL defined.
	* elf/testobj2.c: Likewise.
	* elf/testobj3.c: Likewise.
	* elf/testobj4.c: Likewise.
	* elf/testobj5.c: Likewise.

	* iconvdata/sami-ws2.c: New file.
This commit is contained in:
Ulrich Drepper 1999-01-20 18:32:29 +00:00
parent 0f6052a803
commit d3556ac929
7 changed files with 56 additions and 20 deletions

View File

@ -1,9 +1,18 @@
1999-01-20 Ulrich Drepper <drepper@cygnus.com>
* elf/dl-close.c: Handle failed loads which would have gone in the
global scope correctly.
* elf/testobj1.c: Include stdlib.h to get NULL defined.
* elf/testobj2.c: Likewise.
* elf/testobj3.c: Likewise.
* elf/testobj4.c: Likewise.
* elf/testobj5.c: Likewise.
* iconvdata/Makefile (modules): Add SAMI-WS2 and ISO-IR-197.
* iconvdata/gconv-modules: Add entries for above charsets.
* iconvdata/iso-ir-197.c: New file.
* iconvdata/same-ws2.c: New file.
* iconvdata/sami-ws2.c: New file.
* sysdeps/unix/sysv/linux/vfork.c: Once again use generic version.

View File

@ -106,29 +106,35 @@ _dl_close (struct link_map *map)
unsigned int cnt = _dl_main_searchlist->r_nlist;
do
--cnt;
if (--cnt < 0)
break;
while (_dl_main_searchlist->r_list[cnt] != imap);
while (++cnt < _dl_main_searchlist->r_nlist)
_dl_main_searchlist->r_list[cnt - 1]
= _dl_main_searchlist->r_list[cnt];
--_dl_main_searchlist->r_nlist;
if (_dl_main_searchlist->r_nlist
== _dl_initial_searchlist.r_nlist)
if (cnt >= 0)
{
/* All object dynamically loaded by the program are
unloaded. Free the memory allocated for the global
scope variable. */
struct link_map **old = _dl_main_searchlist->r_list;
/* The object was already correctly registered. */
while (++cnt < _dl_main_searchlist->r_nlist)
_dl_main_searchlist->r_list[cnt - 1]
= _dl_main_searchlist->r_list[cnt];
/* Put the old map in. */
_dl_main_searchlist->r_list = _dl_initial_searchlist.r_list;
/* Signal that the old map is used. */
_dl_global_scope_alloc = 0;
/* Now free the old map. */
free (old);
--_dl_main_searchlist->r_nlist;
}
else
{
/* This can happen if loading was interrupted by something
like a missing symbol in the newly loaded objects. In
this case the object is already marked as global but
`r_nlist' does not count it in. The pointer is in the
`r_list' array so we keep searching in the other
direction. */
cnt = _dl_main_searchlist->r_nlist;
while (_dl_main_searchlist->r_list[cnt] != imap)
{
++cnt;
/* Note that if _dl_global_scope_alloc is zero we
should never come here in the first place. */
assert (cnt < _dl_global_scope_alloc);
}
}
}
@ -186,6 +192,22 @@ _dl_close (struct link_map *map)
free (list);
if (_dl_global_scope_alloc != 0
&& _dl_main_searchlist->r_nlist == _dl_initial_searchlist.r_nlist)
{
/* All object dynamically loaded by the program are unloaded. Free
the memory allocated for the global scope variable. */
struct link_map **old = _dl_main_searchlist->r_list;
/* Put the old map in. */
_dl_main_searchlist->r_list = _dl_initial_searchlist.r_list;
/* Signal that the original map is used. */
_dl_global_scope_alloc = 0;
/* Now free the old map. */
free (old);
}
/* Notify the debugger those objects are finalized and gone. */
_r_debug.r_state = RT_CONSISTENT;
_dl_debug_state ();

View File

@ -1,4 +1,5 @@
#include <dlfcn.h>
#include <stdlib.h>
int
obj1func1 (int a __attribute__ ((unused)))

View File

@ -1,4 +1,5 @@
#include <dlfcn.h>
#include <stdlib.h>
int
obj2func1 (int a __attribute__ ((unused)))

View File

@ -1,4 +1,5 @@
#include <dlfcn.h>
#include <stdlib.h>
int
obj3func1 (int a __attribute__ ((unused)))

View File

@ -1,4 +1,5 @@
#include <dlfcn.h>
#include <stdlib.h>
int
obj4func1 (int a __attribute__ ((unused)))

View File

@ -1,4 +1,5 @@
#include <dlfcn.h>
#include <stdlib.h>
int
obj5func1 (int a __attribute__ ((unused)))