summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/sbrk.c9
-rw-r--r--sysdeps/i386/dl-machine.h4
-rw-r--r--sysdeps/m68k/dl-machine.h4
-rw-r--r--sysdeps/unix/sysv/linux/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ioperm.c4
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c54
-rw-r--r--sysdeps/unix/sysv/linux/sys/io.h4
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 */