diff options
author | John David Anglin <danglin@gcc.gnu.org> | 2022-02-22 18:51:35 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2022-02-22 18:51:35 +0000 |
commit | d2224ffbddc9d25ed5b0e34c212018c32d1e5a95 (patch) | |
tree | cc2618ce438634da192bfacf8afaed03764d9aad /sysdeps/hppa/dl-fptr.c | |
parent | 9e7e5fda38471e00d1190479ea91d7b08ae3e304 (diff) | |
download | glibc-d2224ffbddc9d25ed5b0e34c212018c32d1e5a95.zip glibc-d2224ffbddc9d25ed5b0e34c212018c32d1e5a95.tar.gz glibc-d2224ffbddc9d25ed5b0e34c212018c32d1e5a95.tar.bz2 |
hppa: Fix warnings from _dl_lookup_address
This change fixes two warnings from _dl_lookup_address.
The first warning comes from dropping the volatile keyword from
desc in the call to _dl_read_access_allowed. We now have a full
atomic barrier between loading desc[0] and the access check, so
desc no longer needs to be declared as volatile.
The second warning comes from the implicit declaration of
_dl_fix_reloc_arg. This is fixed by including dl-runtime.h and
declaring _dl_fix_reloc_arg in dl-runtime.h.
Diffstat (limited to 'sysdeps/hppa/dl-fptr.c')
-rw-r--r-- | sysdeps/hppa/dl-fptr.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sysdeps/hppa/dl-fptr.c b/sysdeps/hppa/dl-fptr.c index 2584557..9ed2160 100644 --- a/sysdeps/hppa/dl-fptr.c +++ b/sysdeps/hppa/dl-fptr.c @@ -26,6 +26,7 @@ #include <ldsodefs.h> #include <elf/dynamic-link.h> #include <dl-fptr.h> +#include <dl-runtime.h> #include <dl-unmap-segments.h> #include <atomic.h> #include <libc-pointer-arith.h> @@ -351,21 +352,20 @@ _dl_lookup_address (const void *address) { ElfW(Addr) addr = (ElfW(Addr)) address; ElfW(Word) reloc_arg; - volatile unsigned int *desc; - unsigned int *gptr; + unsigned int *desc, *gptr; /* Return ADDR if the least-significant two bits of ADDR are not consistent with ADDR being a linker defined function pointer. The normal value for a code address in a backtrace is 3. */ - if (((unsigned int) addr & 3) != 2) + if (((uintptr_t) addr & 3) != 2) return addr; /* Handle special case where ADDR points to page 0. */ - if ((unsigned int) addr < 4096) + if ((uintptr_t) addr < 4096) return addr; /* Clear least-significant two bits from descriptor address. */ - desc = (unsigned int *) ((unsigned int) addr & ~3); + desc = (unsigned int *) ((uintptr_t) addr & ~3); if (!_dl_read_access_allowed (desc)) return addr; @@ -376,7 +376,7 @@ _dl_lookup_address (const void *address) /* Then load first word of candidate descriptor. It should be a pointer with word alignment and point to memory that can be read. */ gptr = (unsigned int *) desc[0]; - if (((unsigned int) gptr & 3) != 0 + if (((uintptr_t) gptr & 3) != 0 || !_dl_read_access_allowed (gptr)) return addr; @@ -400,10 +400,11 @@ _dl_lookup_address (const void *address) /* If gp has been resolved, we need to hunt for relocation offset. */ if (!(reloc_arg & PA_GP_RELOC)) - reloc_arg = _dl_fix_reloc_arg (addr, l); + reloc_arg = _dl_fix_reloc_arg ((struct fdesc *) addr, l); _dl_fixup (l, reloc_arg); } return (ElfW(Addr)) desc[0]; } +rtld_hidden_def (_dl_lookup_address) |