diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | sysdeps/arm/dl-machine.h | 17 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getrlimit.c | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/setrlimit.c | 43 |
4 files changed, 49 insertions, 31 deletions
@@ -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 diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 25e2f06..2e6faf5 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -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; diff --git a/sysdeps/unix/sysv/linux/getrlimit.c b/sysdeps/unix/sysv/linux/getrlimit.c index 3eee05c..a929030 100644 --- a/sysdeps/unix/sysv/linux/getrlimit.c +++ b/sysdeps/unix/sysv/linux/getrlimit.c @@ -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 diff --git a/sysdeps/unix/sysv/linux/setrlimit.c b/sysdeps/unix/sysv/linux/setrlimit.c index 882f0c5..2123360 100644 --- a/sysdeps/unix/sysv/linux/setrlimit.c +++ b/sysdeps/unix/sysv/linux/setrlimit.c @@ -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 |