diff options
48 files changed, 5262 insertions, 763 deletions
@@ -1,3 +1,102 @@ +1997-03-29 17:39 Ulrich Drepper <drepper@cygnus.com> + + * math/Makefile (routines): Add carg, s_ccosh and s_csinh. + + * math/complex.h: Add C++ protection. + + * math/libm-test.c (cexp_test): Correct a few bugs. + (csinh_test): New function. + (ccosh_test): New function. + (cacos_test): New function. + (cacosh_test): New function. + (casinh_test): New function. + (catanh_test): New function. + (main): Add calls to csinh_test and ccosh_test. + + * misc/Makefile (tests): Add tst-tsearch. + Add rule to link tst-tsearch against libm. + * misc/tsearch.c: Rewritten to use Red-Black-Tree algorithm by + Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>. + * misc/tst-tsearch.c: New file. + + * stdio-common/bug5.c: Clear LD_LIBRARY_PATH environment variable + before using system. + * stdio-common/test-popen.c: Clear LD_LIBRARY_PATH environment variable + before using popen. + + * sysdeps/libm-ieee754/s_cexp.c: Correct handling of special cases. + * sysdeps/libm-ieee754/s_cexpf.c: Likewise. + * sysdeps/libm-ieee754/s_cexpl.c: Likewise. + + * sysdeps/libm-i387/s_cexp.S: New file. ix87 specific implementation + of complex exponential function. + * sysdeps/libm-i387/s_cexpf.S: New file. + * sysdeps/libm-i387/s_cexpl.S: New file. + + * sysdeps/libm-ieee754/s_ccosh.c: New file. Implementation of + complex cosh function. + * sysdeps/libm-ieee754/s_ccoshf.c: New file. + * sysdeps/libm-ieee754/s_ccoshl.c: New file. + * sysdeps/libm-ieee754/s_csinh.c: New file. Implementation of + complex sinh function. + * sysdeps/libm-ieee754/s_csinhf.c: New file. + * sysdeps/libm-ieee754/s_csinhl.c: New file. + + * math/carg.c: New file. Generic implementatio of carg function. + * math/cargf.c: New file. + * math/cargl.c: New file. + +1997-03-29 16:07 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/posix/system.c: Update copyright. + +1997-03-29 04:18 Ulrich Drepper <drepper@cygnus.com> + + * elf/dl-error.c (_dl_catch_error): Add another argument which is + passed to OPERATE. + (_dl_receive_error): Likewise. + * elf/link.h: Change prototypes for _dl_catch_error and + _dl_receive_error to reflect above change. + * elf/dl-deps.c: Don't use nested function. Call _dl_catch_error + with additional argument with pointer to data. + * elf/dlclose.c: Likewise. + * elf/dlerror.c: Likewise. + * elf/dlopen.c: Likewise. + * elf/dlsym.c: Likewise. + * elf/dlvsym.c: Likewise. + * elf/rtld.c: Likewise. + * nss/nsswitch.c: Likewise. + Patch by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>. + +1997-03-28 21:14 Miguel de Icaza <miguel@nuclecu.unam.mx> + + * elf/dl-error.c: Manually set up the values of "c", this avoids a + call to memcpy and a zero 152 bytes structure. + + * sysdeps/sparc/dl-machine.h (elf_machine_rela): Test + RTLD_BOOTSTRAP to avoid performing relative relocs on a second + pass. + + * sysdeps/sparc/udiv_qrnnd.S: Make the code PIC aware. + + * sysdeps/unix/sysv/linux/sparc/Dist: Add kernel_stat.h and + kernel_sigaction.h + + Add Linux/SPARC specific definitions. + * sysdeps/unix/sysv/linux/sparc/fcntlbits.h: New file. + * sysdeps/unix/sysv/linux/sparc/ioctls.h: New file. + * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h: New file. + * sysdeps/unix/sysv/linux/sparc/kernel_stat.h: New file. + * sysdeps/unix/sysv/linux/sparc/sigaction.h: New file. + * sysdeps/unix/sysv/linux/sparc/signum.h: New file. + * sysdeps/unix/sysv/linux/sparc/termbits.h: New file. + +1997-03-28 13:06 Philip Blundell <pjb27@cam.ac.uk> + + * sysdeps/posix/getaddrinfo.c (gaih_inet_serv): Use + __getservbyname_r() not getservbyname(). + (BROKEN_LIKE_POSIX): Define to 1 so we get strict POSIX behaviour. + 1997-03-27 02:28 Ulrich Drepper <drepper@cygnus.com> * gmon/gmon.c (monstartup): Mark all messages. @@ -110,32 +110,26 @@ contact <bug-glibc@prep.ai.mit.edu> **** Almost done! -[10] Write AVL-tree based tsearch() et.al. functions. Currently only - a very simple algorithm is used. - There is a public domain version but using this would cause problems - with the assignment. - - -[11] Extend regex and/or rx to work with wide characters and complete +[10] Extend regex and/or rx to work with wide characters and complete implementation of character class and collation class handling. It is planed to do a complete rewrite. -[12] Write access function for netmasks, bootparams, and automount +[11] Write access function for netmasks, bootparams, and automount databases for nss_files and nss_db module. The functions should be embedded in the nss scheme. This is not hard and not all services must be supported at once. -[13] Rewrite utmp/wtmp functions to use database functions. This is much +[12] Rewrite utmp/wtmp functions to use database functions. This is much better than the normal flat file format. **** There are plans for a new approach to this problem. Please contact bug-glibc@prep.ai.mit.edu before starting to work.) -[14] Several more or less small functions have to be written: +[13] Several more or less small functions have to be written: + tcgetid() and waitid() from XPG4.2 + grantpt(), ptsname(), unlockpt() from XPG4.2 @@ -145,7 +139,7 @@ contact <bug-glibc@prep.ai.mit.edu> More information are available on request. -[15] We need to write a library for on-the-fly transformation of streams +[14] We need to write a library for on-the-fly transformation of streams of text. In fact, this would be a recode-library (you know, GNU recode). This is needed in several places in the GNU libc and I already have rather concrete plans but so far no possibility to start this. diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 7a6772979b..e2fd340822 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -22,6 +22,29 @@ #include <dlfcn.h> #include <stdlib.h> +struct openaux_args +{ + /* The arguments to openaux. */ + struct link_map *map; + int trace_mode; + const char *strtab; + ElfW(Dyn) *d; + + /* The return value of openaux. */ + struct link_map *aux; +}; + +static void +openaux (void *a) +{ + struct openaux_args *args = (struct openaux_args *) a; + + args->aux = _dl_map_object (args->map, args->strtab + args->d->d_un.d_val, + (args->map->l_type == lt_executable + ? lt_library : args->map->l_type), + args->trace_mode); +} + void _dl_map_object_deps (struct link_map *map, struct link_map **preloads, unsigned int npreloads, @@ -75,27 +98,21 @@ _dl_map_object_deps (struct link_map *map, /* There is at least one auxiliary library specified. We try to load it, and if we can, use its symbols in preference to our own. But if we can't load it, we just silently ignore it. */ - const char *strtab + struct openaux_args args; + args.strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr); - ElfW(Dyn) *d; + args.map = map; + args.trace_mode = trace_mode; - for (d = map->l_ld; d->d_tag != DT_NULL; ++d) - if (d->d_tag == DT_AUXILIARY) + for (args.d = map->l_ld; args.d->d_tag != DT_NULL; ++args.d) + if (args.d->d_tag == DT_AUXILIARY) { - struct link_map *aux; - void openaux (void) - { - aux = _dl_map_object (map, strtab + d->d_un.d_val, - (map->l_type == lt_executable - ? lt_library : map->l_type), - trace_mode); - } char *errstring; const char *objname; - if (! _dl_catch_error (&errstring, &objname, openaux)) + if (! _dl_catch_error (&errstring, &objname, openaux, &args)) /* The auxiliary object is actually there. Use it as the first search element, even before MAP itself. */ - preload (aux); + preload (args.aux); } } diff --git a/elf/dl-error.c b/elf/dl-error.c index 263bd65eb0..e2565bb348 100644 --- a/elf/dl-error.c +++ b/elf/dl-error.c @@ -85,19 +85,25 @@ _dl_signal_error (int errcode, int _dl_catch_error (char **errstring, const char **objname, - void (*operate) (void)) + void (*operate) (void *), + void *args) { int errcode; - struct catch *old, c = { errstring: NULL, objname: NULL }; - /* We need not handle `receiver' since setting a `catch' is handle + struct catch *old, c; + /* We need not handle `receiver' since setting a `catch' is handled before it. */ + /* Some systems (.e.g, SPARC) handle constructors to local variables + inefficient. So we initialize `c' by hand. */ + c.errstring = NULL; + c.objname = NULL; + old = catch; errcode = setjmp (c.env); if (errcode == 0) { catch = &c; - (*operate) (); + (*operate) (args); catch = old; *errstring = NULL; *objname = NULL; @@ -112,7 +118,7 @@ _dl_catch_error (char **errstring, } void -_dl_receive_error (receiver_fct fct, void (*operate) (void)) +_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args) { struct catch *old_catch; receiver_fct old_receiver; @@ -124,7 +130,7 @@ _dl_receive_error (receiver_fct fct, void (*operate) (void)) catch = NULL; receiver = fct; - (*operate) (); + (*operate) (args); catch = old_catch; receiver = old_receiver; diff --git a/elf/dlclose.c b/elf/dlclose.c index 6a142119f7..d96ffc9cc1 100644 --- a/elf/dlclose.c +++ b/elf/dlclose.c @@ -20,13 +20,14 @@ #include <link.h> #include <dlfcn.h> +static void +dlclose_doit (void *handle) +{ + _dl_close (handle); +} + int dlclose (void *handle) { - void doit (void) - { - _dl_close (handle); - } - - return _dlerror_run (doit) ? -1 : 0; + return _dlerror_run (dlclose_doit, handle) ? -1 : 0; } diff --git a/elf/dlerror.c b/elf/dlerror.c index 9e55bc7c76..e2b1ac94a9 100644 --- a/elf/dlerror.c +++ b/elf/dlerror.c @@ -64,7 +64,7 @@ dlerror (void) } int -_dlerror_run (void (*operate) (void)) +_dlerror_run (void (*operate) (void *), void *args) { if (last_errstring != NULL) /* Free the error string from the last failed command. This can @@ -72,6 +72,6 @@ _dlerror_run (void (*operate) (void)) free (last_errstring); last_errcode = _dl_catch_error (&last_errstring, &last_object_name, - operate); + operate, args); return last_errstring != NULL; } diff --git a/elf/dlopen.c b/elf/dlopen.c index c2cf8cd58d..4963e9962e 100644 --- a/elf/dlopen.c +++ b/elf/dlopen.c @@ -21,15 +21,31 @@ #include <link.h> #include <dlfcn.h> -void * -dlopen (const char *file, int mode) +struct dlopen_args { + /* The arguments for dlopen_doit. */ + const char *file; + int mode; + /* The return value of dlopen_doit. */ struct link_map *new; +}; + - void doit (void) - { - new = _dl_open (file ?: "", mode); - } +static void +dlopen_doit (void *a) +{ + struct dlopen_args *args = (struct dlopen_args *) a; + + args->new = _dl_open (args->file ?: "", args->mode); +} + + +void * +dlopen (const char *file, int mode) +{ + struct dlopen_args args; + args.file = file; + args.mode = mode; - return _dlerror_run (doit) ? NULL : new; + return _dlerror_run (dlopen_doit, &args) ? NULL : args.new; } diff --git a/elf/dlsym.c b/elf/dlsym.c index d05619bfb4..1072f16ce1 100644 --- a/elf/dlsym.c +++ b/elf/dlsym.c @@ -22,47 +22,71 @@ #include <dlfcn.h> #include <setjmp.h> - -void * -dlsym (void *handle, const char *name) +struct dlsym_args { - ElfW(Addr) caller = (ElfW(Addr)) __builtin_return_address (0); + /* The arguments to dlsym_doit. */ + void *handle; + const char *name; + struct r_found_version version; + ElfW(Addr) caller; + /* The return values of dlsym_doit. */ ElfW(Addr) loadbase; - const ElfW(Sym) *ref = NULL; - void doit (void) + const ElfW(Sym) *ref; +}; + + +static void +dlsym_doit (void *a) |
