mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-10 05:03:06 +03:00
Update.
1998-09-01 15:36 Ulrich Drepper <drepper@cygnus.com> * malloc/Makefile: Include Makeconfig before testing config-sysdirs. * malloc/mtrace.c: Add bug report address. Update email address. Add more @XXX@ to print correct address size. * elf/dl-addr.c (_dl_addr): Make sure that map to be examined is really initialized. * elf/dl-close.c (_dl_close): Use l_map_start and l_map_end info for munmap call instead of examining phdr again. Free all malloc()ed strings and arrays.
This commit is contained in:
14
ChangeLog
14
ChangeLog
@@ -1,3 +1,17 @@
|
|||||||
|
1998-09-01 15:36 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* malloc/Makefile: Include Makeconfig before testing config-sysdirs.
|
||||||
|
|
||||||
|
* malloc/mtrace.c: Add bug report address. Update email address.
|
||||||
|
Add more @XXX@ to print correct address size.
|
||||||
|
|
||||||
|
* elf/dl-addr.c (_dl_addr): Make sure that map to be examined is
|
||||||
|
really initialized.
|
||||||
|
|
||||||
|
* elf/dl-close.c (_dl_close): Use l_map_start and l_map_end info
|
||||||
|
for munmap call instead of examining phdr again.
|
||||||
|
Free all malloc()ed strings and arrays.
|
||||||
|
|
||||||
1998-08-09 Geoff Keating <geoffk@ozemail.com.au>
|
1998-08-09 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
* sysdeps/powerpc/Makefile [subdir=elf]: Add new files split out of
|
* sysdeps/powerpc/Makefile [subdir=elf]: Add new files split out of
|
||||||
|
@@ -34,7 +34,9 @@ _dl_addr (const void *address, Dl_info *info)
|
|||||||
/* Find the highest-addressed object that ADDRESS is not below. */
|
/* Find the highest-addressed object that ADDRESS is not below. */
|
||||||
match = NULL;
|
match = NULL;
|
||||||
for (l = _dl_loaded; l; l = l->l_next)
|
for (l = _dl_loaded; l; l = l->l_next)
|
||||||
if (addr >= l->l_addr && (!match || match->l_addr < l->l_addr))
|
if (l->l_addr != 0 /* Make sure we do not currently set this map up
|
||||||
|
in this moment. */
|
||||||
|
&& addr >= l->l_addr && (!match || match->l_addr < l->l_addr))
|
||||||
match = l;
|
match = l;
|
||||||
|
|
||||||
if (match)
|
if (match)
|
||||||
|
@@ -89,11 +89,6 @@ _dl_close (struct link_map *map)
|
|||||||
for (i = 0; i < nsearchlist; ++i)
|
for (i = 0; i < nsearchlist; ++i)
|
||||||
--list[i]->l_opencount;
|
--list[i]->l_opencount;
|
||||||
|
|
||||||
if (map->l_origin != NULL)
|
|
||||||
free ((char *) map->l_origin);
|
|
||||||
/* The name always is allocated. */
|
|
||||||
free (map->l_name);
|
|
||||||
|
|
||||||
/* Check each element of the search list to see if all references to
|
/* Check each element of the search list to see if all references to
|
||||||
it are gone. */
|
it are gone. */
|
||||||
for (i = 0; i < nsearchlist; ++i)
|
for (i = 0; i < nsearchlist; ++i)
|
||||||
@@ -101,12 +96,10 @@ _dl_close (struct link_map *map)
|
|||||||
struct link_map *imap = list[i];
|
struct link_map *imap = list[i];
|
||||||
if (imap->l_opencount == 0 && imap->l_type == lt_loaded)
|
if (imap->l_opencount == 0 && imap->l_type == lt_loaded)
|
||||||
{
|
{
|
||||||
|
struct libname_list *lnp;
|
||||||
|
|
||||||
/* That was the last reference, and this was a dlopen-loaded
|
/* That was the last reference, and this was a dlopen-loaded
|
||||||
object. We can unmap it. */
|
object. We can unmap it. */
|
||||||
const ElfW(Phdr) *ph;
|
|
||||||
const ElfW(Phdr) *first, *last;
|
|
||||||
ElfW(Addr) mapstart, mapend;
|
|
||||||
|
|
||||||
if (imap->l_global)
|
if (imap->l_global)
|
||||||
{
|
{
|
||||||
/* This object is in the global scope list. Remove it. */
|
/* This object is in the global scope list. Remove it. */
|
||||||
@@ -122,22 +115,11 @@ _dl_close (struct link_map *map)
|
|||||||
--_dl_global_scope_end;
|
--_dl_global_scope_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can unmap all the maps at once. We just have to determine
|
/* We can unmap all the maps at once. We determined the
|
||||||
the length and the `munmap' call does the rest. */
|
length when we loaded the object and `munmap' call does
|
||||||
first = last = NULL;
|
the rest. */
|
||||||
for (ph = imap->l_phdr; ph < imap->l_phdr + imap->l_phnum; ++ph)
|
__munmap ((void *) imap->l_map_start,
|
||||||
if (ph->p_type == PT_LOAD)
|
imap->l_map_end - imap->l_map_start);
|
||||||
{
|
|
||||||
if (first == NULL)
|
|
||||||
first = ph;
|
|
||||||
last = ph;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now we have all the information we need for the unmapping.
|
|
||||||
See the method used in `_dl_map_object_from_fd'. */
|
|
||||||
mapstart = first->p_vaddr & ~(first->p_align - 1);
|
|
||||||
mapend = last->p_vaddr + last->p_memsz;
|
|
||||||
__munmap ((caddr_t) (imap->l_addr + mapstart), mapend - mapstart);
|
|
||||||
|
|
||||||
/* Finally, unlink the data structure and free it. */
|
/* Finally, unlink the data structure and free it. */
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
@@ -155,6 +137,23 @@ _dl_close (struct link_map *map)
|
|||||||
imap->l_next->l_prev = imap->l_prev;
|
imap->l_next->l_prev = imap->l_prev;
|
||||||
if (imap->l_searchlist && imap->l_searchlist != list)
|
if (imap->l_searchlist && imap->l_searchlist != list)
|
||||||
free (imap->l_searchlist);
|
free (imap->l_searchlist);
|
||||||
|
|
||||||
|
if (imap->l_versions != NULL)
|
||||||
|
free (imap->l_versions);
|
||||||
|
if (imap->l_origin != NULL)
|
||||||
|
free ((char *) imap->l_origin);
|
||||||
|
|
||||||
|
/* These names always is allocated. */
|
||||||
|
free (imap->l_name);
|
||||||
|
lnp = imap->l_libname;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
free (lnp->name);
|
||||||
|
lnp = lnp->next;
|
||||||
|
}
|
||||||
|
while (lnp != NULL);
|
||||||
|
free (imap->l_libname);
|
||||||
|
|
||||||
free (imap);
|
free (imap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -44,6 +44,8 @@ extra-objs = mcheck-init.o libmcheck.a
|
|||||||
# Include the cleanup handler.
|
# Include the cleanup handler.
|
||||||
aux := set-freeres
|
aux := set-freeres
|
||||||
|
|
||||||
|
include ../Makeconfig
|
||||||
|
|
||||||
# The AWK script to analyze the output of the mtrace functions.
|
# The AWK script to analyze the output of the mtrace functions.
|
||||||
ifneq ($(PERL),no)
|
ifneq ($(PERL),no)
|
||||||
install-bin = mtrace
|
install-bin = mtrace
|
||||||
|
@@ -29,6 +29,8 @@ sub usage {
|
|||||||
print "Usage: mtrace [OPTION]... [Binary] MtraceData\n";
|
print "Usage: mtrace [OPTION]... [Binary] MtraceData\n";
|
||||||
print " --help print this help, then exit\n";
|
print " --help print this help, then exit\n";
|
||||||
print " --version print version number, then exit\n";
|
print " --version print version number, then exit\n";
|
||||||
|
print "\n";
|
||||||
|
print "Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n";
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,10 +44,10 @@ arglist: while (@ARGV) {
|
|||||||
$ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" ||
|
$ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" ||
|
||||||
$ARGV[0] eq "--versio" || $ARGV[0] eq "--version") {
|
$ARGV[0] eq "--versio" || $ARGV[0] eq "--version") {
|
||||||
print "mtrace (GNU $PACKAGE) $VERSION\n";
|
print "mtrace (GNU $PACKAGE) $VERSION\n";
|
||||||
print "Copyright (C) 1997 Free Software Foundation, Inc.\n";
|
print "Copyright (C) 1997, 1998 Free Software Foundation, Inc.\n";
|
||||||
print "This is free software; see the source for copying conditions. There is NO\n";
|
print "This is free software; see the source for copying conditions. There is NO\n";
|
||||||
print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
|
print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
|
||||||
print "Written by Ulrich Drepper <drepper\@gnu.ai.mit.edu>\n";
|
print "Written by Ulrich Drepper <drepper\@gnu.org>\n";
|
||||||
|
|
||||||
exit 0;
|
exit 0;
|
||||||
} elsif ($ARGV[0] eq "--h" || $ARGV[0] eq "--he" || $ARGV[0] eq "--hel" ||
|
} elsif ($ARGV[0] eq "--h" || $ARGV[0] eq "--he" || $ARGV[0] eq "--hel" ||
|
||||||
@@ -125,7 +127,7 @@ while (<DATA>) {
|
|||||||
SWITCH: {
|
SWITCH: {
|
||||||
if ($cols[$n] eq "+") {
|
if ($cols[$n] eq "+") {
|
||||||
if (defined $allocated{$allocaddr}) {
|
if (defined $allocated{$allocaddr}) {
|
||||||
printf ("+ %#010x Alloc %d duplicate: %s %s\n",
|
printf ("+ %#0@XXX@x Alloc %d duplicate: %s %s\n",
|
||||||
hex($allocaddr), $nr, $wherewas{$allocaddr}, $where);
|
hex($allocaddr), $nr, $wherewas{$allocaddr}, $where);
|
||||||
} else {
|
} else {
|
||||||
$allocated{$allocaddr}=$howmuch;
|
$allocated{$allocaddr}=$howmuch;
|
||||||
@@ -138,7 +140,7 @@ while (<DATA>) {
|
|||||||
undef $allocated{$allocaddr};
|
undef $allocated{$allocaddr};
|
||||||
undef $wherewas{$allocaddr};
|
undef $wherewas{$allocaddr};
|
||||||
} else {
|
} else {
|
||||||
printf ("- %#010x Free %d was never alloc'd %s\n",
|
printf ("- %#0@XXX@x Free %d was never alloc'd %s\n",
|
||||||
hex($allocaddr), $nr, &location($where));
|
hex($allocaddr), $nr, &location($where));
|
||||||
}
|
}
|
||||||
last SWITCH;
|
last SWITCH;
|
||||||
@@ -148,14 +150,14 @@ while (<DATA>) {
|
|||||||
undef $allocated{$allocaddr};
|
undef $allocated{$allocaddr};
|
||||||
undef $wherewas{$allocaddr};
|
undef $wherewas{$allocaddr};
|
||||||
} else {
|
} else {
|
||||||
printf ("- %#010x Realloc %d was never alloc'd %s\n",
|
printf ("- %#0@XXX@x Realloc %d was never alloc'd %s\n",
|
||||||
hex($allocaddr), $nr, &location($where));
|
hex($allocaddr), $nr, &location($where));
|
||||||
}
|
}
|
||||||
last SWITCH;
|
last SWITCH;
|
||||||
}
|
}
|
||||||
if ($cols[$n] eq ">") {
|
if ($cols[$n] eq ">") {
|
||||||
if (defined $allocated{$allocaddr}) {
|
if (defined $allocated{$allocaddr}) {
|
||||||
printf ("+ %#010x Realloc %d duplicate: %#010x %s %s\n",
|
printf ("+ %#0@XXX@x Realloc %d duplicate: %#010x %s %s\n",
|
||||||
hex($allocaddr), $nr, $allocated{$allocaddr},
|
hex($allocaddr), $nr, $allocated{$allocaddr},
|
||||||
$wherewas{$allocaddr}, &location($where));
|
$wherewas{$allocaddr}, &location($where));
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user