1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00
* 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> 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/Makefile (modules): Add SAMI-WS2 and ISO-IR-197.
* iconvdata/gconv-modules: Add entries for above charsets. * iconvdata/gconv-modules: Add entries for above charsets.
* iconvdata/iso-ir-197.c: New file. * 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. * 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; unsigned int cnt = _dl_main_searchlist->r_nlist;
do do
--cnt; if (--cnt < 0)
break;
while (_dl_main_searchlist->r_list[cnt] != imap); while (_dl_main_searchlist->r_list[cnt] != imap);
while (++cnt < _dl_main_searchlist->r_nlist) if (cnt >= 0)
_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)
{ {
/* All object dynamically loaded by the program are /* The object was already correctly registered. */
unloaded. Free the memory allocated for the global while (++cnt < _dl_main_searchlist->r_nlist)
scope variable. */ _dl_main_searchlist->r_list[cnt - 1]
struct link_map **old = _dl_main_searchlist->r_list; = _dl_main_searchlist->r_list[cnt];
/* Put the old map in. */ --_dl_main_searchlist->r_nlist;
_dl_main_searchlist->r_list = _dl_initial_searchlist.r_list; }
/* Signal that the old map is used. */ else
_dl_global_scope_alloc = 0; {
/* This can happen if loading was interrupted by something
/* Now free the old map. */ like a missing symbol in the newly loaded objects. In
free (old); 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); 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. */ /* Notify the debugger those objects are finalized and gone. */
_r_debug.r_state = RT_CONSISTENT; _r_debug.r_state = RT_CONSISTENT;
_dl_debug_state (); _dl_debug_state ();

View File

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

View File

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

View File

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

View File

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

View File

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