1999-06-06  Ulrich Drepper  <drepper@cygnus.com>

	* malloc/malloc.c: Introduce local variable __libc_getpagesize to
	avoid multiple calls to getpagesize() which might be a syscall.

1999-06-06  Philip Blundell  <philb@gnu.org>

	* stdio-common/tstscanf.c (main): Test the half-word format "%hd".

1999-06-06  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/install.texi (Running make install): Correct typo in
	dynamic linker invocation.

1999-06-05  Philip Blundell  <philb@gnu.org>

	* sysdeps/arm/dl-machine.h (elf_machine_load_address): Fix
	problems with GOT addressing.

1999-06-05  Wolfram Gloger  <wmglo@dent.med.uni-muenchen.de>

	* malloc/malloc.c (check_action): Change into bitmap so that both
	diagnostic and abort can be requested by setting it to 3.
	(mALLOC_SET_STATe): Disable malloc checking if necessary.
This commit is contained in:
Ulrich Drepper 1999-06-06 09:23:32 +00:00
parent 908c3d5b5a
commit b3864d70e7
6 changed files with 72 additions and 30 deletions

View File

@ -1,3 +1,28 @@
1999-06-06 Ulrich Drepper <drepper@cygnus.com>
* malloc/malloc.c: Introduce local variable __libc_getpagesize to
avoid multiple calls to getpagesize() which might be a syscall.
1999-06-06 Philip Blundell <philb@gnu.org>
* stdio-common/tstscanf.c (main): Test the half-word format "%hd".
1999-06-06 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* manual/install.texi (Running make install): Correct typo in
dynamic linker invocation.
1999-06-05 Philip Blundell <philb@gnu.org>
* sysdeps/arm/dl-machine.h (elf_machine_load_address): Fix
problems with GOT addressing.
1999-06-05 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
* malloc/malloc.c (check_action): Change into bitmap so that both
diagnostic and abort can be requested by setting it to 3.
(mALLOC_SET_STATe): Disable malloc checking if necessary.
1999-06-03 Ulrich Drepper <drepper@cygnus.com> 1999-06-03 Ulrich Drepper <drepper@cygnus.com>
* configure.in: Few changes for HPUX. * configure.in: Few changes for HPUX.

2
FAQ.in
View File

@ -454,7 +454,7 @@ US.
the libc.so which comes with glibc all I get is a core dump. the libc.so which comes with glibc all I get is a core dump.
{UD} On Linux, gcc sets the dynamic linker to /lib/ld-linux.so.1 unless the {UD} On Linux, gcc sets the dynamic linker to /lib/ld-linux.so.1 unless the
user specifies a -dynamic-linker argument. This is the name of the libc5 user specifies a --dynamic-linker argument. This is the name of the libc5
dynamic linker, which does not work with glibc. dynamic linker, which does not work with glibc.
For casual use of GNU libc you can just specify to the linker For casual use of GNU libc you can just specify to the linker

View File

@ -852,6 +852,8 @@ Void_t *(*__morecore)() = __default_morecore;
#endif #endif
static size_t __libc_pagesize;
#define MORECORE (*__morecore) #define MORECORE (*__morecore)
#define MORECORE_FAILURE 0 #define MORECORE_FAILURE 0
#define MORECORE_CLEARS 1 #define MORECORE_CLEARS 1
@ -860,7 +862,7 @@ Void_t *(*__morecore)() = __default_morecore;
#define mremap __mremap #define mremap __mremap
#define mprotect __mprotect #define mprotect __mprotect
#undef malloc_getpagesize #undef malloc_getpagesize
#define malloc_getpagesize __getpagesize() #define malloc_getpagesize __libc_pagesize
#else /* _LIBC */ #else /* _LIBC */
@ -1654,6 +1656,7 @@ ptmalloc_init __MALLOC_P((void))
/* Initialize the pthreads interface. */ /* Initialize the pthreads interface. */
if (__pthread_initialize != NULL) if (__pthread_initialize != NULL)
__pthread_initialize(); __pthread_initialize();
__libc_getpagesize = __getpagesize();
#endif #endif
mutex_init(&main_arena.mutex); mutex_init(&main_arena.mutex);
mutex_init(&list_lock); mutex_init(&list_lock);
@ -1780,7 +1783,7 @@ __malloc_check_init()
__free_hook = free_check; __free_hook = free_check;
__realloc_hook = realloc_check; __realloc_hook = realloc_check;
__memalign_hook = memalign_check; __memalign_hook = memalign_check;
if(check_action == 1) if(check_action & 1)
fprintf(stderr, "malloc: using debugging hooks\n"); fprintf(stderr, "malloc: using debugging hooks\n");
} }
@ -4068,7 +4071,11 @@ int mALLOPt(param_number, value) int param_number; int value;
the heap contents are saved/restored via some other method. The the heap contents are saved/restored via some other method. The
primary example for this is GNU Emacs with its `dumping' procedure. primary example for this is GNU Emacs with its `dumping' procedure.
`Hook' function pointers are never saved or restored by these `Hook' function pointers are never saved or restored by these
functions. */ functions, with two exceptions: If malloc checking was in use when
malloc_get_state() was called, then malloc_set_state() calls
__malloc_check_init() if possible; if malloc checking was not in
use in the recorded state but the user requested malloc checking,
then the hooks are reset to 0. */
#define MALLOC_STATE_MAGIC 0x444c4541l #define MALLOC_STATE_MAGIC 0x444c4541l
#define MALLOC_STATE_VERSION (0*0x100l + 1l) /* major*0x100 + minor */ #define MALLOC_STATE_VERSION (0*0x100l + 1l) /* major*0x100 + minor */
@ -4196,10 +4203,18 @@ mALLOC_SET_STATe(msptr) Void_t* msptr;
/* add version-dependent code here */ /* add version-dependent code here */
if (ms->version >= 1) { if (ms->version >= 1) {
#if defined _LIBC || defined MALLOC_HOOKS #if defined _LIBC || defined MALLOC_HOOKS
/* Check whether it is safe to enable malloc checking. */ /* Check whether it is safe to enable malloc checking, or whether
it is necessary to disable it. */
if (ms->using_malloc_checking && !using_malloc_checking && if (ms->using_malloc_checking && !using_malloc_checking &&
!disallow_malloc_check) !disallow_malloc_check)
__malloc_check_init (); __malloc_check_init ();
else if (!ms->using_malloc_checking && using_malloc_checking) {
__malloc_hook = 0;
__free_hook = 0;
__realloc_hook = 0;
__memalign_hook = 0;
using_malloc_checking = 0;
}
#endif #endif
} }
@ -4319,13 +4334,11 @@ top_check()
if((char*)t + chunksize(t) == sbrk_base + sbrked_mem || if((char*)t + chunksize(t) == sbrk_base + sbrked_mem ||
t == initial_top(&main_arena)) return 0; t == initial_top(&main_arena)) return 0;
switch(check_action) { if(check_action & 1)
case 1:
fprintf(stderr, "malloc: top chunk is corrupt\n"); fprintf(stderr, "malloc: top chunk is corrupt\n");
break; if(check_action & 2)
case 2:
abort(); abort();
}
/* Try to set up a new top chunk. */ /* Try to set up a new top chunk. */
brk = MORECORE(0); brk = MORECORE(0);
front_misalign = (unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK; front_misalign = (unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK;
@ -4374,13 +4387,10 @@ free_check(mem, caller) Void_t* mem; const Void_t *caller;
p = mem2chunk_check(mem); p = mem2chunk_check(mem);
if(!p) { if(!p) {
(void)mutex_unlock(&main_arena.mutex); (void)mutex_unlock(&main_arena.mutex);
switch(check_action) { if(check_action & 1)
case 1:
fprintf(stderr, "free(): invalid pointer %p!\n", mem); fprintf(stderr, "free(): invalid pointer %p!\n", mem);
break; if(check_action & 2)
case 2:
abort(); abort();
}
return; return;
} }
#if HAVE_MMAP #if HAVE_MMAP

View File

@ -236,7 +236,7 @@ install}, or you will end up with a mixture of header files from both
libraries, and you won't be able to compile anything. You may also need libraries, and you won't be able to compile anything. You may also need
to reconfigure GCC to work with the new library. The easiest way to do to reconfigure GCC to work with the new library. The easiest way to do
that is to figure out the compiler switches to make it work again that is to figure out the compiler switches to make it work again
(@samp{-Wl,-dynamic-linker=/lib/ld-linux.so.2} should work on Linux (@samp{-Wl,--dynamic-linker=/lib/ld-linux.so.2} should work on Linux
systems) and use them to recompile gcc. You can also edit the specs systems) and use them to recompile gcc. You can also edit the specs
file (@file{/usr/lib/gcc-lib/@var{TARGET}/@var{VERSION}/specs}), but file (@file{/usr/lib/gcc-lib/@var{TARGET}/@var{VERSION}/specs}), but
that is a bit of a black art. that is a bit of a black art.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1996, 1997, 1998 Free Software Foundation, Inc. /* Copyright (C) 1991, 92, 96, 97, 98, 99 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -235,5 +235,20 @@ main (int argc, char **argv)
} }
} }
fputs ("Test 7:\n", stdout);
{
short a[2] = { -1, -1 };
int res;
res = sscanf ("32767 1234", "%hd %hd", &a[0], &a[1]);
printf ("res = %d, a[0] = %d, a[1] = %d\n", res, a[0], a[1]);
if (res != 2 || a[0] != 32767 || a[1] != 1234)
{
fputs ("test failed!\n", stdout);
result = 1;
}
}
exit (result); exit (result);
} }

View File

@ -52,22 +52,14 @@ elf_machine_dynamic (void)
/* Return the run-time load address of the shared object. */ /* Return the run-time load address of the shared object. */
// patb
static inline Elf32_Addr __attribute__ ((unused)) static inline Elf32_Addr __attribute__ ((unused))
elf_machine_load_address (void) elf_machine_load_address (void)
{ {
Elf32_Addr addr; extern void __dl_start asm ("_dl_start");
asm (" ldr ip,.L1 Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
ldr r3,.L3 Elf32_Addr pcrel_addr;
add r3, r3, sl asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
ldr ip,[sl, ip] return pcrel_addr - got_addr;
sub ip, r3, ip
b .L2
.L1: .word _dl_start(GOT)
.L3: .word _dl_start(GOTOFF)
.L2: mov %0, ip"
: "=r" (addr) : : "ip", "r3");
return addr;
} }