summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extra/config/confdata.c3
-rw-r--r--ldso/libdl/Makefile8
-rw-r--r--ldso/libdl/libdl.c34
-rw-r--r--libc/sysdeps/linux/common/__syscall_fcntl.c4
-rw-r--r--libc/sysdeps/linux/mips/bits/kernel_sigaction.h40
-rw-r--r--libc/sysdeps/linux/mips/bits/sigaction.h11
-rw-r--r--libc/sysdeps/linux/mips/bits/stat.h8
-rw-r--r--libc/sysdeps/linux/mips/clone.S2
-rw-r--r--libc/sysdeps/linux/mips/pread_write.c4
9 files changed, 76 insertions, 38 deletions
diff --git a/extra/config/confdata.c b/extra/config/confdata.c
index 9ecf11032..a3f19091e 100644
--- a/extra/config/confdata.c
+++ b/extra/config/confdata.c
@@ -306,8 +306,7 @@ int conf_write(const char *name)
" */\n"
"#if !defined __FEATURES_H && !defined __need_uClibc_config_h\n"
"#error Never include <bits/uClibc_config.h> directly; use <features.h> instead\n"
- "#endif\n"
- "#define AUTOCONF_INCLUDED\n\n"
+ "#endif\n\n"
"/*\n"
" * Version Number\n"
" */\n"
diff --git a/ldso/libdl/Makefile b/ldso/libdl/Makefile
index 918e73b29..d4d54f911 100644
--- a/ldso/libdl/Makefile
+++ b/ldso/libdl/Makefile
@@ -27,15 +27,9 @@ XXFLAGS+=-O0 -g3
else
XXFLAGS+=$(OPTIMIZATION)
endif
-ifeq ($(PTHREADS_NATIVE),y)
-XXFLAGS+= $(XARCH_CFLAGS) $(CPU_CFLAGS) \
- -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \
- -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso/include -I$(TOPDIR)ldso/ldso -I. -I$(TOPDIR)include $(PTINC)
-else
XXFLAGS+= $(XARCH_CFLAGS) $(CPU_CFLAGS) \
-DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \
-fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso/include -I$(TOPDIR)ldso/ldso -I. -I$(TOPDIR)include
-endif
XXFLAGS+=-isystem $(shell $(CC) -print-file-name=include)
XXFLAGS_NOPIC:=$(XXFLAGS)
@@ -80,7 +74,7 @@ shared: $(LIBDL_PIC)
$(LD) $(LDFLAGS) -soname=$(LIBDL_SHARED).$(MAJOR_VERSION) \
-o $(LIBDL_SHARED_FULLNAME) -fini dl_cleanup --whole-archive $(LIBDL_PIC) \
--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
- -L$(TOPDIR)/lib -lc $(LDADD_LIBFLOAT) $(LIBGCC);
+ -L$(TOPDIR)/lib -lc $(LDADD_LIBFLOAT) $(TOPDIR)lib/ld-uClibc.so.0 $(LIBGCC);
$(INSTALL) -d $(TOPDIR)lib
$(RM) $(TOPDIR)lib/$(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBDL_SHARED).$(MAJOR_VERSION)
$(INSTALL) -m 644 $(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index 76c8296e1..add476b81 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -40,31 +40,27 @@
/* When libdl is loaded as a shared library, we need to load in
* and use a pile of symbols from ldso... */
-extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, int)
- __attribute__ ((__weak__));
+extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, int);
extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **,
- struct elf_resolve *, char *, int) __attribute__ ((__weak__));
-extern int _dl_fixup(struct dyn_elf *rpnt, int lazy)
- __attribute__ ((__weak__));
-extern void _dl_protect_relro(struct elf_resolve * tpnt)
- __attribute__ ((__weak__));
-extern int _dl_errno __attribute__ ((__weak__));
-extern struct dyn_elf *_dl_symbol_tables __attribute__ ((__weak__));
-extern struct dyn_elf *_dl_handles __attribute__ ((__weak__));
-extern struct elf_resolve *_dl_loaded_modules __attribute__ ((__weak__));
-extern struct r_debug *_dl_debug_addr __attribute__ ((__weak__));
-extern unsigned long _dl_error_number __attribute__ ((__weak__));
-extern void *(*_dl_malloc_function)(size_t) __attribute__ ((__weak__));
+ struct elf_resolve *, char *, int);
+extern int _dl_fixup(struct dyn_elf *rpnt, int lazy);
+extern void _dl_protect_relro(struct elf_resolve * tpnt);
+extern int _dl_errno;
+extern struct dyn_elf *_dl_symbol_tables;
+extern struct dyn_elf *_dl_handles;
+extern struct elf_resolve *_dl_loaded_modules;
+extern struct r_debug *_dl_debug_addr;
+extern unsigned long _dl_error_number;
+extern void *(*_dl_malloc_function)(size_t);
#ifdef __LDSO_CACHE_SUPPORT__
-int _dl_map_cache(void) __attribute__ ((__weak__));
-int _dl_unmap_cache(void) __attribute__ ((__weak__));
+int _dl_map_cache(void);
+int _dl_unmap_cache(void);
#endif
#ifdef __mips__
-extern void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy)
- __attribute__ ((__weak__));
+extern void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy);
#endif
#ifdef __SUPPORT_LD_DEBUG__
-extern char *_dl_debug __attribute__ ((__weak__));
+extern char *_dl_debug;
#endif
diff --git a/libc/sysdeps/linux/common/__syscall_fcntl.c b/libc/sysdeps/linux/common/__syscall_fcntl.c
index 0a5812976..e4257b0c8 100644
--- a/libc/sysdeps/linux/common/__syscall_fcntl.c
+++ b/libc/sysdeps/linux/common/__syscall_fcntl.c
@@ -11,7 +11,7 @@
#include <stdarg.h>
#include <fcntl.h>
-#ifdef __UCLIBC_HAS_LFS__
+#if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64
extern int __libc_fcntl64(int fd, int cmd, long arg);
#endif
@@ -29,7 +29,7 @@ int __libc_fcntl(int fd, int cmd, ...)
va_end(list);
if (cmd == F_GETLK64 || cmd == F_SETLK64 || cmd == F_SETLKW64) {
-#ifdef __UCLIBC_HAS_LFS__
+#if defined __UCLIBC_HAS_LFS__ && defined __NR_fcntl64
return __libc_fcntl64(fd, cmd, arg);
#else
__set_errno(ENOSYS);
diff --git a/libc/sysdeps/linux/mips/bits/kernel_sigaction.h b/libc/sysdeps/linux/mips/bits/kernel_sigaction.h
new file mode 100644
index 000000000..b6f52cc9c
--- /dev/null
+++ b/libc/sysdeps/linux/mips/bits/kernel_sigaction.h
@@ -0,0 +1,40 @@
+/* This is the sigaction structure from the Linux 2.1.24 kernel. */
+
+#include <sgidefs.h>
+
+#define HAVE_SA_RESTORER
+
+struct old_kernel_sigaction {
+ unsigned int sa_flags;
+ __sighandler_t k_sa_handler;
+ unsigned long sa_mask;
+ unsigned int __pad0[3]; /* reserved, keep size constant */
+
+ /* Abi says here follows reserved int[2] */
+ void (*sa_restorer)(void);
+#if (_MIPS_SZPTR < 64)
+ /*
+ * For 32 bit code we have to pad struct sigaction to get
+ * constant size for the ABI
+ */
+ int pad1[1]; /* reserved */
+#endif
+};
+
+
+#define _KERNEL_NSIG 128
+#define _KERNEL_NSIG_BPW _MIPS_SZLONG
+#define _KERNEL_NSIG_WORDS (_KERNEL_NSIG / _KERNEL_NSIG_BPW)
+
+typedef struct {
+ unsigned long sig[_KERNEL_NSIG_WORDS];
+} kernel_sigset_t;
+
+/* This is the sigaction structure from the Linux 2.1.68 kernel. */
+struct kernel_sigaction {
+ unsigned int sa_flags;
+ __sighandler_t k_sa_handler;
+ kernel_sigset_t sa_mask;
+ void (*sa_restorer)(void);
+ int s_resv[1]; /* reserved */
+};
diff --git a/libc/sysdeps/linux/mips/bits/sigaction.h b/libc/sysdeps/linux/mips/bits/sigaction.h
index 6bf77a11c..d04e25f76 100644
--- a/libc/sysdeps/linux/mips/bits/sigaction.h
+++ b/libc/sysdeps/linux/mips/bits/sigaction.h
@@ -1,5 +1,6 @@
/* The proper definitions for Linux/MIPS's sigaction.
- Copyright (C) 1993,94,95,97,98,99,2000 Free Software Foundation, Inc.
+ Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2003
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,6 +45,14 @@ struct sigaction
#endif
/* Additional set of signals to be blocked. */
__sigset_t sa_mask;
+
+ /* The ABI says here are two unused ints following. */
+ /* Restore handler. */
+ void (*sa_restorer) (void);
+
+#if _MIPS_SZPTR < 64
+ int sa_resv[1];
+#endif
};
/* Bits in `sa_flags'. */
diff --git a/libc/sysdeps/linux/mips/bits/stat.h b/libc/sysdeps/linux/mips/bits/stat.h
index c0e6984d1..cc077b8fc 100644
--- a/libc/sysdeps/linux/mips/bits/stat.h
+++ b/libc/sysdeps/linux/mips/bits/stat.h
@@ -36,7 +36,7 @@
/* Structure describing file characteristics. */
struct stat
{
- unsigned long int st_dev;
+ __dev_t st_dev;
long int st_pad1[3];
#ifndef __USE_FILE_OFFSET64
__ino_t st_ino; /* File serial number. */
@@ -47,7 +47,7 @@ struct stat
__nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/
- unsigned long int st_rdev; /* Device number, if device. */
+ __dev_t st_rdev; /* Device number, if device. */
#ifndef __USE_FILE_OFFSET64
long int st_pad2[2];
__off_t st_size; /* Size of file, in bytes. */
@@ -80,14 +80,14 @@ struct stat
#ifdef __USE_LARGEFILE64
struct stat64
{
- unsigned long int st_dev;
+ __dev_t st_dev;
long int st_pad1[3];
__ino64_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/
- unsigned long int st_rdev; /* Device number, if device. */
+ __dev_t st_rdev; /* Device number, if device. */
long int st_pad2[3];
__off64_t st_size; /* Size of file, in bytes. */
/*
diff --git a/libc/sysdeps/linux/mips/clone.S b/libc/sysdeps/linux/mips/clone.S
index 079d2bef2..21cb8ec61 100644
--- a/libc/sysdeps/linux/mips/clone.S
+++ b/libc/sysdeps/linux/mips/clone.S
@@ -102,7 +102,7 @@ __thread_start:
lw a0,4(sp) /* Argument pointer. */
/* Call the user's function. */
- jalr t9
+ jal t9
/* Call _exit rather than doing it inline for breakpoint purposes. */
move a0,v0
diff --git a/libc/sysdeps/linux/mips/pread_write.c b/libc/sysdeps/linux/mips/pread_write.c
index ab7eeebc8..5baba30d2 100644
--- a/libc/sysdeps/linux/mips/pread_write.c
+++ b/libc/sysdeps/linux/mips/pread_write.c
@@ -58,7 +58,7 @@ static inline _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
{
- return(__syscall_pread(fd,buf,count,0,__LONG_LONG_PAIR((off_t)0,offset)));
+ return(__syscall_pread(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
}
weak_alias (__libc_pread, pread)
@@ -95,7 +95,7 @@ static inline _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
{
- return(__syscall_pwrite(fd,buf,count,0,__LONG_LONG_PAIR((off_t)0,offset)));
+ return(__syscall_pwrite(fd,buf,count,0,__LONG_LONG_PAIR(offset>>31,offset)));
}
weak_alias (__libc_pwrite, pwrite)