You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.4 KiB
122 lines
4.4 KiB
commit 6c9c2307657529e52c5fa7037618835f2a50b916 |
|
Author: John David Anglin <danglin@gcc.gnu.org> |
|
Date: Sun Mar 6 16:04:32 2022 +0000 |
|
|
|
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. |
|
|
|
diff --git a/sysdeps/hppa/dl-fptr.c b/sysdeps/hppa/dl-fptr.c |
|
index 62ef68b62bd601f4..cd4f77c0ecfd376f 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) |
|
diff --git a/sysdeps/hppa/dl-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h |
|
index a9a927f26c6fec09..2f6991aa16e87a00 100644 |
|
--- a/sysdeps/hppa/dl-lookupcfg.h |
|
+++ b/sysdeps/hppa/dl-lookupcfg.h |
|
@@ -30,6 +30,7 @@ rtld_hidden_proto (_dl_symbol_address) |
|
#define DL_SYMBOL_ADDRESS(map, ref) _dl_symbol_address(map, ref) |
|
|
|
Elf32_Addr _dl_lookup_address (const void *address); |
|
+rtld_hidden_proto (_dl_lookup_address) |
|
|
|
#define DL_LOOKUP_ADDRESS(addr) _dl_lookup_address ((const void *) addr) |
|
|
|
diff --git a/sysdeps/hppa/dl-runtime.c b/sysdeps/hppa/dl-runtime.c |
|
index e7fbb7417d866bb0..a71b5b2013abf723 100644 |
|
--- a/sysdeps/hppa/dl-runtime.c |
|
+++ b/sysdeps/hppa/dl-runtime.c |
|
@@ -25,8 +25,7 @@ |
|
return that to the caller. The caller will continue on to call |
|
_dl_fixup with the relocation offset. */ |
|
|
|
-ElfW(Word) |
|
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE |
|
+ElfW(Word) __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE |
|
_dl_fix_reloc_arg (struct fdesc *fptr, struct link_map *l) |
|
{ |
|
Elf32_Addr l_addr, iplt, jmprel, end_jmprel, r_type; |
|
@@ -52,3 +51,4 @@ _dl_fix_reloc_arg (struct fdesc *fptr, struct link_map *l) |
|
ABORT_INSTRUCTION; |
|
return 0; |
|
} |
|
+rtld_hidden_def (_dl_fix_reloc_arg) |
|
diff --git a/sysdeps/hppa/dl-runtime.h b/sysdeps/hppa/dl-runtime.h |
|
index 5d6ee53b076d5e0e..9913539b5f0e7435 100644 |
|
--- a/sysdeps/hppa/dl-runtime.h |
|
+++ b/sysdeps/hppa/dl-runtime.h |
|
@@ -17,6 +17,9 @@ |
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
|
02111-1307 USA. */ |
|
|
|
+ElfW(Word) _dl_fix_reloc_arg (struct fdesc *, struct link_map *); |
|
+rtld_hidden_proto (_dl_fix_reloc_arg) |
|
+ |
|
/* Clear PA_GP_RELOC bit in relocation offset. */ |
|
static inline uintptr_t |
|
reloc_offset (uintptr_t plt0, uintptr_t pltn)
|
|
|