about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog33
-rw-r--r--elf/elf.h4
-rw-r--r--posix/getopt.h6
-rw-r--r--sysdeps/hppa/Versions1
-rw-r--r--sysdeps/hppa/dl-lookupcfg.h13
-rw-r--r--sysdeps/hppa/dl-machine.h4
-rw-r--r--sysdeps/hppa/dl-symaddr.c2
-rw-r--r--sysdeps/unix/sysv/linux/hppa/clone.S14
-rw-r--r--sysdeps/unix/sysv/linux/hppa/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/mmap64.c2
10 files changed, 66 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 791eebdeb5..687b4c8884 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2001-04-21  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/mmap64.c: Correct check for invalid
+	offset.
+
+2001-04-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* posix/getopt.h: Treat __cplusplus like __STDC__.
+
+2001-04-20  John S. Marvin  <jsm@fc.hp.com>
+
+	* sysdeps/unix/sysv/linux/hppa/clone.S: Fix clone system call
+	entry point stub.
+
+2001-04-20  Richard Hirst  <rhirst@linuxcare.com>
+
+	* elf/elf.h: Corrected R_PARISC_DIR14R (should be 6, not 5),
+	and added R_PARISC_DPREL21L and R_PARISC_DPREL14R for modutils.
+
+	* sysdeps/unix/sysv/linux/hppa/syscalls.list: Removed ptrace
+	entry so the ptrace.c wrapper is used.
+
+2001-04-20  Alan Modra  <amodra@one.net.au>
+
+	* sysdeps/hppa/dl-lookupcfg.h (_dl_function_address): Prototype.
+	(DL_FUNCTION_ADDRESS): Define.
+	(DL_DT_INIT_ADDRESS): Define.
+	(DL_DT_FINI_ADDRESS): Define.
+	* sysdeps/hppa/Versions: Add _dl_function_address.
+	* sysdeps/hppa/dl-machine.h (ELF_MACHINE_START_ADDRESS): Define.
+	* sysdeps/hppa/dl-symaddr.c (_dl_start_address): Rename to
+	_dl_function_address.
+
 2001-04-21  Andreas Jaeger  <aj@suse.de>
 
 	* rt/aio_misc.c (handle_fildes_io): Add noreturn attribute.
diff --git a/elf/elf.h b/elf/elf.h
index 2bed6f07be..0644fd7536 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1537,12 +1537,14 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_PARISC_DIR21L		2	/* Left 21 bits of eff. address.  */
 #define R_PARISC_DIR17R		3	/* Right 17 bits of eff. address.  */
 #define R_PARISC_DIR17F		4	/* 17 bits of eff. address.  */
-#define R_PARISC_DIR14R		5	/* Right 14 bits of eff. address.  */
+#define R_PARISC_DIR14R		6	/* Right 14 bits of eff. address.  */
 #define R_PARISC_PCREL32	9	/* 32-bit rel. address.  */
 #define R_PARISC_PCREL21L	10	/* Left 21 bits of rel. address.  */
 #define R_PARISC_PCREL17R	11	/* Right 17 bits of rel. address.  */
 #define R_PARISC_PCREL17F	12	/* 17 bits of rel. address.  */
 #define R_PARISC_PCREL14R	14	/* Right 14 bits of rel. address.  */
+#define R_PARISC_DPREL21L	18	/* Left 21 bits of rel. address.  */
+#define R_PARISC_DPREL14R	22	/* Right 14 bits of rel. address.  */
 #define R_PARISC_GPREL21L	26	/* GP-relative, left 21 bits.  */
 #define R_PARISC_GPREL14R	30	/* GP-relative, right 14 bits.  */
 #define R_PARISC_LTOFF21L	34	/* LT-relative, left 21 bits.  */
diff --git a/posix/getopt.h b/posix/getopt.h
index 12b7ad568e..c2f01804c9 100644
--- a/posix/getopt.h
+++ b/posix/getopt.h
@@ -1,5 +1,5 @@
 /* Declarations for getopt.
-   Copyright (C) 1989,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc.
+   Copyright (C) 1989-1994, 1996-1999, 2001 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
@@ -93,7 +93,7 @@ extern int optopt;
 
 struct option
 {
-# if defined __STDC__ && __STDC__
+# if (defined __STDC__ && __STDC__) || defined __cplusplus
   const char *name;
 # else
   char *name;
@@ -137,7 +137,7 @@ struct option
    arguments to the option '\0'.  This behavior is specific to the GNU
    `getopt'.  */
 
-#if defined __STDC__ && __STDC__
+#if (defined __STDC__ && __STDC__) || defined __cplusplus
 # ifdef __GNU_LIBRARY__
 /* Many other libraries have conflicting prototypes for getopt, with
    differences in the consts, in stdlib.h.  To avoid compilation
diff --git a/sysdeps/hppa/Versions b/sysdeps/hppa/Versions
index 0c447d9f28..c5f35d4971 100644
--- a/sysdeps/hppa/Versions
+++ b/sysdeps/hppa/Versions
@@ -2,5 +2,6 @@ ld {
   GLIBC_2.2 {
     # hppa specific functions in the dynamic linker, but used by libc.so.
     _dl_symbol_address; _dl_unmap; _dl_lookup_address;
+    _dl_function_address;
   }
 }
diff --git a/sysdeps/hppa/dl-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h
index 4f5f8998a7..118c4d0c58 100644
--- a/sysdeps/hppa/dl-lookupcfg.h
+++ b/sysdeps/hppa/dl-lookupcfg.h
@@ -34,3 +34,16 @@ Elf32_Addr _dl_lookup_address (const void *address);
 void _dl_unmap (struct link_map *map);
 
 #define DL_UNMAP(map) _dl_unmap (map)
+
+extern Elf32_Addr _dl_function_address (const struct link_map *map,
+					Elf32_Addr start);
+
+#define DL_FUNCTION_ADDRESS(map, addr) _dl_function_address (map, addr)
+
+/* The test for "addr & 2" below is to accomodate old binaries which
+   violated the ELF ABI by pointing DT_INIT and DT_FINI at a function
+   pointer.  */
+#define DL_DT_INIT_ADDRESS(map, addr) \
+  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_FUNCTION_ADDRESS (map, addr))
+#define DL_DT_FINI_ADDRESS(map, addr) \
+  ((Elf32_Addr)(addr) & 2 ? (addr) : DL_FUNCTION_ADDRESS (map, addr))
diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h
index f8a8e7bcee..a3437b557a 100644
--- a/sysdeps/hppa/dl-machine.h
+++ b/sysdeps/hppa/dl-machine.h
@@ -448,6 +448,10 @@ __dl_fini_plabel:
 /* We only use RELA. */
 #define ELF_MACHINE_NO_REL 1
 
+/* Return the address of the entry point. */
+#define ELF_MACHINE_START_ADDRESS(map, start) \
+  DL_FUNCTION_ADDRESS (map, start)
+
 #endif /* !dl_machine_h */
 
 /* These are only actually used where RESOLVE_MAP is defined, anyway. */
diff --git a/sysdeps/hppa/dl-symaddr.c b/sysdeps/hppa/dl-symaddr.c
index 038404a48b..49c1216664 100644
--- a/sysdeps/hppa/dl-symaddr.c
+++ b/sysdeps/hppa/dl-symaddr.c
@@ -33,7 +33,7 @@ _dl_symbol_address (const struct link_map *map, const ElfW(Sym) *ref)
 }
 
 ElfW(Addr)
-_dl_start_address (const struct link_map *map, ElfW(Addr) start)
+_dl_function_address (const struct link_map *map, ElfW(Addr) start)
 {
   return __hppa_make_fptr (map, start, &__fptr_root, NULL);
 }
diff --git a/sysdeps/unix/sysv/linux/hppa/clone.S b/sysdeps/unix/sysv/linux/hppa/clone.S
index 510e0ff799..b902ff7669 100644
--- a/sysdeps/unix/sysv/linux/hppa/clone.S
+++ b/sysdeps/unix/sysv/linux/hppa/clone.S
@@ -33,18 +33,18 @@ ENTRY(__clone)
 	/* FIXME: I have no idea how profiling works on hppa. */
 
 	/* Sanity check arguments.  */
-	comib,<> 0,%arg0,.Lerror	/* no NULL function pointers */
-	ldi	EINVAL,%ret0
-	comib,<> 0,%arg1,.Lerror	/* no NULL stack pointers */
+	comib,=  0,%arg0,.Lerror        /* no NULL function pointers */
+	ldi     -EINVAL,%ret0
+	comib,=  0,%arg1,.Lerror        /* no NULL stack pointers */
 	nop
 
 	/* Save the fn ptr and arg on the new stack.  */
-	stwm	%arg3,64(%arg1)
+	stwm    %arg0,64(%arg1)
 	stw	%arg3,-60(%arg1)
 
 	/* Do the system call */
 	copy	%arg2,%arg0
-	ble	0x100(%sr7,%r0)
+	ble     0x100(%sr2,%r0)
 	ldi	__NR_clone,%r20
 
 	ldi	-4096,%r1
@@ -60,12 +60,12 @@ ENTRY(__clone)
 	/* Something bad happened -- no child created */
 .Lerror:
 	b	__syscall_error
-	nop
+	sub     %r0,%ret0,%arg0
 
 thread_start:
 	/* Load up the arguments.  */
 	ldw	-60(%sp),%arg0
-	ldwm	-64(%sp),%r22
+	ldw     -64(%sp),%r22
 
 	/* Call the user's function */
 	bl	$$dyncall,%r31
diff --git a/sysdeps/unix/sysv/linux/hppa/syscalls.list b/sysdeps/unix/sysv/linux/hppa/syscalls.list
index f0d6431abe..6d7cd6a23f 100644
--- a/sysdeps/unix/sysv/linux/hppa/syscalls.list
+++ b/sysdeps/unix/sysv/linux/hppa/syscalls.list
@@ -32,8 +32,6 @@ shutdown	-	shutdown	i:ii	__shutdown	shutdown
 socket		-	socket		i:iii	__socket	socket
 socketpair	-	socketpair	i:iiif	__socketpair	socketpair
 
-ptrace		-	ptrace		4	__ptrace	ptrace
-
 getresuid	-	getresuid	i:ppp	getresuid
 getresgid	-	getresgid	i:ppp	getresgid
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/mmap64.c b/sysdeps/unix/sysv/linux/powerpc/mmap64.c
index 4b3e60deaf..25b11a963f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/mmap64.c
+++ b/sysdeps/unix/sysv/linux/powerpc/mmap64.c
@@ -42,7 +42,7 @@ static int have_no_mmap2;
 void *
 __mmap64 (void *addr, size_t len, int prot, int flags, int fd, off64_t offset)
 {
-  if (! (offset & ((1 << PAGE_SHIFT)-1)))
+  if (offset & ((1 << PAGE_SHIFT)-1))
     {
       __set_errno (EINVAL);
       return MAP_FAILED;