diff options
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | elf/Versions | 2 | ||||
-rw-r--r-- | elf/dl-open.c | 9 | ||||
-rw-r--r-- | elf/rtld.c | 8 | ||||
-rw-r--r-- | libio/iogetline.c | 4 | ||||
-rw-r--r-- | sysdeps/generic/dl-cache.c | 22 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/bits/fcntl.h | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/fcntl.h | 7 |
8 files changed, 69 insertions, 8 deletions
@@ -1,3 +1,22 @@ +1998-08-25 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/generic/dl-cache.c: Move static variable cache and cachesize + to toplevel. + (_dl_unload_cache): New function. + * elf/Versions [libc GLIBC_2.1]: Add _dl_unload_cache. + * elf/dl-open.c (_dl_open): Unload map file before freeing the lock. + * elf/rtld (dl_main): Unload map file before jumping to user code. + + * sysdeps/unix/sysv/linux/alpha/bits/fcntl.h: Define O_DIRECT. + Correct comment for O_LARGEFILE. + * sysdeps/unix/sysv/linux/bits/fcntl.h: Define O_DIRECT. + Change O_LARGEFILE to correct value. + +1998-08-25 14:34 Ulrich Drepper <drepper@cygnus.com> + + * libio/iogetline.c (_IO_getline_info): Don't read anything for + N == 0. Patch by HJ Lu. + 1998-08-25 11:43 Ulrich Drepper <drepper@cygnus.com> * elf/elf.h: Add syminfo stuff and other DT_* from Solaris' ELF. diff --git a/elf/Versions b/elf/Versions index 1b02cd328c..ed5ba6f830 100644 --- a/elf/Versions +++ b/elf/Versions @@ -21,7 +21,7 @@ libc { _dl_profile; _dl_profile_map; _dl_profile_output; _dl_start_profile; # functions used in other libraries - _dl_mcount; _dl_mcount_wrapper; _dl_mcount_wrapper_check; + _dl_mcount; _dl_mcount_wrapper; _dl_mcount_wrapper_check; _dl_unload_cache; } } diff --git a/elf/dl-open.c b/elf/dl-open.c index b595f2df73..3670657379 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -21,6 +21,7 @@ #include <errno.h> #include <stdlib.h> #include <string.h> +#include <sys/mman.h> /* Check whether MAP_COPY is defined. */ #include <bits/libc-lock.h> #include <elf/ldsodefs.h> @@ -31,6 +32,9 @@ extern ElfW(Addr) _dl_sysdep_start (void **start_argptr, ElfW(Addr) *user_entry)); weak_extern (_dl_sysdep_start) +/* This function is used to unload the cache file if necessary. */ +extern void _dl_unload_cache (void); + extern int __libc_multiple_libcs; /* Defined in init-first.c. */ extern int __libc_argc; @@ -224,6 +228,11 @@ _dl_open (const char *file, int mode) args.map = NULL; errcode = _dl_catch_error (&errstring, dl_open_worker, &args); +#ifndef MAP_COPY + /* We must munmap() the cache file. */ + _dl_unload_cache (); +#endif + /* Release the lock. */ __libc_lock_unlock (_dl_load_lock); diff --git a/elf/rtld.c b/elf/rtld.c index 3fd13179ba..13c4f2698e 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -40,6 +40,9 @@ extern ElfW(Addr) _dl_sysdep_start (void **start_argptr, ElfW(Addr) *user_entry)); extern void _dl_sysdep_start_cleanup (void); +/* This function is used to unload the cache file if necessary. */ +extern void _dl_unload_cache (void); + /* System-dependent function to read a file's whole contents in the most convenient manner available. */ extern void *_dl_sysdep_read_whole_file (const char *filename, @@ -918,6 +921,11 @@ of this helper program; chances are you did not intend to run this program.\n\ _dl_debug_state (); } +#ifndef MAP_COPY + /* We must munmap() the cache file. */ + _dl_unload_cache (); +#endif + /* Now enable profiling if needed. */ if (_dl_profile_map != NULL) /* We must prepare the profiling. */ diff --git a/libio/iogetline.c b/libio/iogetline.c index 328e20e6ea..9b49039f58 100644 --- a/libio/iogetline.c +++ b/libio/iogetline.c @@ -59,7 +59,7 @@ _IO_getline_info (fp, buf, n, delim, extract_delim, eof) char *ptr = buf; if (eof != NULL) *eof = 0; - do + while (n != 0); { _IO_ssize_t len = fp->_IO_read_end - fp->_IO_read_ptr; if (len <= 0) @@ -108,7 +108,7 @@ _IO_getline_info (fp, buf, n, delim, extract_delim, eof) ptr += len; n -= len; } - } while (n != 0); + } return ptr - buf; } diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c index da7d2e49dd..f14cf96da1 100644 --- a/sysdeps/generic/dl-cache.c +++ b/sysdeps/generic/dl-cache.c @@ -44,6 +44,10 @@ struct cache_file } libs[0]; }; +/* This is the starting address and the size of the mmap()ed file. */ +static struct cache_file *cache; +static size_t cachesize; + /* This is the cache ID we expect. Normally it is 3 for glibc linked binaries. */ int _dl_correct_cache_id = 3; @@ -54,8 +58,6 @@ int _dl_correct_cache_id = 3; const char * _dl_load_cache_lookup (const char *name) { - static struct cache_file *cache; - static size_t cachesize; unsigned int i; const char *best; @@ -114,3 +116,19 @@ _dl_load_cache_lookup (const char *name) return best; } + +#ifndef MAP_COPY +/* If the system does not support MAP_COPY we cannot leave the file open + all the time since this would create problems when the file is replaced. + Therefore we provide this function to close the file and open it again + once needed. */ +void +_dl_unload_cache (void) +{ + if (cache != NULL && cache != (struct cache_file *) -1) + { + __munmap (cache, cachesize); + cache = NULL; + } +} +#endif diff --git a/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h b/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h index 0dc0c47b1a..7cd32a34a3 100644 --- a/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h @@ -43,7 +43,11 @@ #define O_FSYNC O_SYNC #define O_ASYNC 020000 /* fcntl, for BSD compatibility */ -/* XXX missing */ +#ifdef __USE_GNU +# define O_DIRECT 040000 /* Direct disk access. */ +#endif + +/* Not necessary, files are always with 64bit off_t. */ #define O_LARGEFILE 0 /* Values for the second argument to `fcntl'. */ diff --git a/sysdeps/unix/sysv/linux/bits/fcntl.h b/sysdeps/unix/sysv/linux/bits/fcntl.h index 223cb99e75..c2a8ee91ac 100644 --- a/sysdeps/unix/sysv/linux/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/bits/fcntl.h @@ -41,6 +41,10 @@ #define O_FSYNC O_SYNC #define O_ASYNC 020000 +#ifdef __USE_GNU +# define O_DIRECT 040000 /* Direct disk access. */ +#endif + /* For now Linux has synchronisity options for data and read operations. We define the symbols here but let them do the same as O_SYNC since this is a superset. */ @@ -49,9 +53,8 @@ # define O_RSYNC O_SYNC /* Synchronize read operations. */ #endif -/* XXX missing */ #ifdef __USE_LARGEFILE64 -# define O_LARGEFILE 0 +# define O_LARGEFILE 0100000 #endif /* Values for the second argument to `fcntl'. */ |