diff options
author | Ulrich Drepper <drepper@redhat.com> | 1996-08-19 01:07:44 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1996-08-19 01:07:44 +0000 |
commit | 39778c6c9e6455303979aca2dc4685bf56cdc9be (patch) | |
tree | 9dcdd44d6e7df176f7724ac8ab674a82a947947c /sysdeps | |
parent | e9d258b798f0c2e46433d2bd483e4fd47cc00915 (diff) | |
download | glibc-39778c6c9e6455303979aca2dc4685bf56cdc9be.tar.gz |
update from main archive 960818cvs/libc-960820cvs/libc-960819
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/sbrk.c | 9 | ||||
-rw-r--r-- | sysdeps/i386/dl-machine.h | 4 | ||||
-rw-r--r-- | sysdeps/m68k/dl-machine.h | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/ioperm.c | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/init-first.c | 54 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/io.h | 4 |
8 files changed, 38 insertions, 47 deletions
diff --git a/sysdeps/generic/sbrk.c b/sysdeps/generic/sbrk.c index 92ad8c4102..f63195adb3 100644 --- a/sysdeps/generic/sbrk.c +++ b/sysdeps/generic/sbrk.c @@ -22,10 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ extern void *__curbrk; extern int __brk (void *addr); -#ifdef PIC -extern int __libc_is_static; -weak_extern (__libc_is_static) -#endif +extern int __libc_multiple_libcs; /* Defined in init-first.c. */ /* Extend the process's data space by INCREMENT. If INCREMENT is negative, shrink data space by - INCREMENT. @@ -40,9 +37,7 @@ __sbrk (ptrdiff_t increment) __curbrk from the kernel's brk value. That way two separate instances of __brk and __sbrk can share the heap, returning interleaved pieces of it. */ -#ifdef PIC - if (__curbrk == NULL || &__libc_is_static == NULL) -#endif + if (__curbrk == NULL || __libc_multiple_libcs) if (__brk (0) < 0) return (void *) -1; diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index d616bf4db8..83b6f8d165 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -163,7 +163,9 @@ _dl_start_user:\n\ call *%eax\n\ # Loop to call _dl_init_next for the next initializer.\n\ jmp 0b\n\ -1: # Pass our finalizer function to the user in %edx, as per ELF ABI.\n\ +1: # Clear the startup flag.\n\ + movl $0, _dl_starting_up@GOT(%ebx)\n\ + # Pass our finalizer function to the user in %edx, as per ELF ABI.\n\ movl _dl_fini@GOT(%ebx), %edx\n\ # Jump to the user's entry point.\n\ jmp *%edi\n\ diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h index 15aa5325fc..f36b9ce2f4 100644 --- a/sysdeps/m68k/dl-machine.h +++ b/sysdeps/m68k/dl-machine.h @@ -174,7 +174,9 @@ _dl_start_user: jsr (%a0) | Loop to call _dl_init_next for the next initializer. jra 0b -1: | Pass our finalizer function to the user in %a1. +1: | Clear the startup flag. + move.l #0, _dl_starting_up@GOT(%a5) + | Pass our finalizer function to the user in %a1. move.l _dl_fini@GOT(%a5), %a1 | Initialize %fp with the stack pointer. move.l %sp, %fp diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 7d83718e5c..02b44a8fc5 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -1,3 +1,7 @@ +ifeq ($(subdir), csu) +CFLAGS-init-first.c = -fkeep-inline-functions +endif + ifeq ($(subdir), misc) sysdep_routines += sysctl clone diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile index 9d596719da..3908b5703c 100644 --- a/sysdeps/unix/sysv/linux/alpha/Makefile +++ b/sysdeps/unix/sysv/linux/alpha/Makefile @@ -2,5 +2,5 @@ ifeq ($(subdir), misc) sysdep_headers += alpha/ptrace.h alpha/regdef.h sysdep_routines += ieee_get_fp_control ieee_set_fp_control \ - sethae ioperm osf_sigprocmask fstatfs statfs + sethae ioperm osf_sigprocmask fstatfs statfs llseek endif diff --git a/sysdeps/unix/sysv/linux/alpha/ioperm.c b/sysdeps/unix/sysv/linux/alpha/ioperm.c index d24eabe473..a91608ff24 100644 --- a/sysdeps/unix/sysv/linux/alpha/ioperm.c +++ b/sysdeps/unix/sysv/linux/alpha/ioperm.c @@ -52,7 +52,7 @@ I/O address space that's 512MB large!). */ #define vuip volatile unsigned int * #define JENSEN_IO_BASE (0xfffffc0300000000UL) -#define JENSEN_MEM (0xfffffc0200000000UL) /* sparse!! */ +#define JENSEN_SPARSE_MEM (0xfffffc0200000000UL) /* * With respect to the I/O architecture, APECS and LCA are identical, @@ -94,7 +94,7 @@ static struct platform { {"EB64+", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, {"EB66", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, {"EB66P", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, - {"Jensen", IOSYS_JENSEN, JENSEN_MEM, JENSEN_MEM}, + {"Jensen", IOSYS_JENSEN, 0, JENSEN_SPARSE_MEM}, {"Mikasa", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, {"Mustang", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, {"Noname", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM}, diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c index 267c01afc8..feff028a28 100644 --- a/sysdeps/unix/sysv/linux/init-first.c +++ b/sysdeps/unix/sysv/linux/init-first.c @@ -29,10 +29,12 @@ extern void __libc_global_ctors (void); /* The function is called from assembly stubs the compiler can't see. */ static void init (void *) __attribute__ ((unused)); -extern int __libc_is_static; -#ifdef PIC -weak_extern (__libc_is_static) -#endif +extern int _dl_starting_up; +weak_extern (_dl_starting_up) + +/* Set nonzero if we have to be prepared for more then one libc being + used in the process. Safe assumption if initializer never runs. */ +int __libc_multiple_libcs = 1; static void init (void *data) @@ -43,39 +45,21 @@ init (void *data) char **argv = (char **)data + 1; char **envp = &argv[argc + 1]; - /* XXX Another gcc bug. We marked the function as `unused' but it - is still optimized away. */ - volatile void *foo __attribute__ ((unused)) = &init; -#ifdef PIC - if (&__libc_is_static != NULL) -#endif + __libc_multiple_libcs = &_dl_starting_up && ! _dl_starting_up; + + /* We must not call `personality' twice. */ + if (!__libc_multiple_libcs) { -#ifdef PIC - /* We must not call `personality' twice. */ - if (__libc_is_static == 0) -#endif - { - /* The `personality' system call takes one argument that - chooses the "personality", i.e. the set of system calls - and such. We must make this call first thing to disable - emulation of some other system that might have been - enabled by default based on the executable format. */ - __personality (PER_LINUX); - - /* Set the FPU control word to the proper default value. */ - __setfpucw (__fpu_control); - } - - /* We set LIBC_IS_STATIC to a value > 0 for the static library - and < 0 for the shared library. This information might be - useful for the running program but it is mainly necessary for - the above `if' statement. */ -#ifdef PIC - __libc_is_static = -1; -#else - __libc_is_static = 1; -#endif + /* The `personality' system call takes one argument that chooses + the "personality", i.e. the set of system calls and such. We + must make this call first thing to disable emulation of some + other system that might have been enabled by default based on + the executable format. */ + __personality (PER_LINUX); + + /* Set the FPU control word to the proper default value. */ + __setfpucw (__fpu_control); } __environ = envp; diff --git a/sysdeps/unix/sysv/linux/sys/io.h b/sysdeps/unix/sysv/linux/sys/io.h index 6f0b9aba14..6b4de65c9c 100644 --- a/sysdeps/unix/sysv/linux/sys/io.h +++ b/sysdeps/unix/sysv/linux/sys/io.h @@ -21,6 +21,8 @@ Cambridge, MA 02139, USA. */ #define _SYS_IO_H 1 #include <features.h> +__BEGIN_DECLS + /* Get constants from kernel header files. */ #include <asm/io.h> @@ -39,4 +41,6 @@ extern int ioperm __P ((unsigned long int __from, unsigned long int __num, privileges. */ extern int iopl __P ((int __level)); +__END_DECLS + #endif /* _SYS_IO_H */ |