Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 8 Dec 1999 07:38:14 +0000 (07:38 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 8 Dec 1999 07:38:14 +0000 (07:38 +0000)
1999-12-07  Scott Bambrough <scottb@netwinder.org>

* sysdeps/arm/dl-machine.h (elf_machine_rel): Fixup R_ARM_PC24
relocs if possible.

1999-12-06  Andreas Schwab  <schwab@suse.de>

* sysdeps/unix/sysv/linux/setrlimit.c: First find out wether the
ugetrlimit syscall exists.

* sysdeps/unix/sysv/linux/getrlimit.c: Only put versions on
exported symbols.
* sysdeps/unix/sysv/linux/setrlimit.c: Likewise.

ChangeLog
sysdeps/arm/dl-machine.h
sysdeps/unix/sysv/linux/getrlimit.c
sysdeps/unix/sysv/linux/setrlimit.c

index 0cb37f0..d11c0d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+1999-12-07  Scott Bambrough <scottb@netwinder.org>
+
+       * sysdeps/arm/dl-machine.h (elf_machine_rel): Fixup R_ARM_PC24
+       relocs if possible.
+
+1999-12-06  Andreas Schwab  <schwab@suse.de>
+
+       * sysdeps/unix/sysv/linux/setrlimit.c: First find out wether the
+       ugetrlimit syscall exists.
+
+       * sysdeps/unix/sysv/linux/getrlimit.c: Only put versions on
+       exported symbols.
+       * sysdeps/unix/sysv/linux/setrlimit.c: Likewise.
+
 1999-12-07  Ulrich Drepper  <drepper@cygnus.com>
 
        * iconvdata/ansi_x3.110.c (from_ansi_x3_110): Don't increment
index 25e2f06..2e6faf5 100644 (file)
@@ -443,6 +443,23 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
            *reloc_addr += value;
            break;
          }
+       case R_ARM_PC24:
+         {
+            signed int addend;
+
+            addend = *reloc_addr & 0x00ffffff;
+            if (addend & 0x00800000) addend |= 0xff000000;
+
+            value = value - (unsigned int)reloc_addr + (addend << 2);
+            if (value & 0xfc000003)
+              _dl_signal_error (0, map->l_name,
+                         "R_ARM_PC24 relocation out of range");
+              
+            value = value >> 2;
+            value = (*reloc_addr & 0xff000000) | (value & 0x00ffffff);
+            *reloc_addr = value;
+         }
+       break;
        default:
          _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
          break;
index 3eee05c..a929030 100644 (file)
@@ -77,11 +77,9 @@ __new_getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits)
 #endif
 }
 
+weak_alias (__new_getrlimit, __getrlimit);
 #if defined PIC && DO_VERSIONING
-default_symbol_version (__new_getrlimit, __getrlimit, GLIBC_2.1.3);
-strong_alias (__new_getrlimit, _new_getrlimit);
-default_symbol_version (_new_getrlimit, getrlimit, GLIBC_2.1.3);
+default_symbol_version (__new_getrlimit, getrlimit, GLIBC_2.1.3);
 #else
-weak_alias (__new_getrlimit, __getrlimit);
 weak_alias (__new_getrlimit, getrlimit);
 #endif
index 882f0c5..2123360 100644 (file)
@@ -45,30 +45,21 @@ __new_setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits)
   struct rlimit rlimits_small;
 
 # ifdef __NR_ugetrlimit
-  if (__have_no_new_getrlimit <= 0)
+  if (__have_no_new_getrlimit == 0)
     {
-      int result = INLINE_SYSCALL (setrlimit, 2, resource, rlimits);
-
-      /* Return if the values are not out of range or if we positively
-         know that the ugetrlimit system call exists.  */
-      if (result != -1 || errno != EINVAL || __have_no_new_getrlimit < 0)
-       return result;
-
-      /* Check if the new ugetrlimit syscall exists.  */
-      if (INLINE_SYSCALL (ugetrlimit, 2, resource, &rlimits_small) != -1
-         || errno != ENOSYS)
-       {
-         /* There was some other error, probably RESOURCE out of range.
-             Remember that the ugetrlimit system call really exists.  */
-         __have_no_new_getrlimit = -1;
-         /* Restore previous errno value.  */
-         __set_errno (EINVAL);
-         return result;
-       }
-
-      /* Remember that the kernel uses the old interface.  */
-      __have_no_new_getrlimit = 1;
+      /* Check if the new ugetrlimit syscall exists.  We must do this
+        first because older kernels don't reject negative rlimit
+        values in setrlimit.  */
+      result = INLINE_SYSCALL (ugetrlimit, 2, resource, &rlimits_small);
+      if (result != -1 || errno != ENOSYS)
+       /* The syscall exists.  */
+       __have_no_new_getrlimit = -1;
+      else
+       /* The syscall does not exist.  */
+       __have_no_new_getrlimit = 1;
     }
+  if (__have_no_new_getrlimit < 0)
+    return INLINE_SYSCALL (setrlimit, 2, resource, rlimits);
 # endif
 
   /* We might have to correct the limits values.  Since the old values
@@ -78,16 +69,14 @@ __new_setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits)
   rlimits_small.rlim_max = MIN ((unsigned long int) rlimits->rlim_max,
                                RLIM_INFINITY >> 1);
 
-  /* Try again with the adjusted values.  */
+  /* Use the adjusted values.  */
   return INLINE_SYSCALL (setrlimit, 2, resource, &rlimits_small);
 #endif
 }
 
+weak_alias (__new_setrlimit, __setrlimit);
 #if defined PIC && DO_VERSIONING
-default_symbol_version (__new_setrlimit, __setrlimit, GLIBC_2.1.3);
-strong_alias (__new_setrlimit, _new_setrlimit);
-default_symbol_version (_new_setrlimit, setrlimit, GLIBC_2.1.3);
+default_symbol_version (__new_setrlimit, setrlimit, GLIBC_2.1.3);
 #else
-weak_alias (__new_setrlimit, __setrlimit);
 weak_alias (__new_setrlimit, setrlimit);
 #endif