mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
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.
This commit is contained in:
parent
40fc6a74ee
commit
6c9c230765
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user