about summary refs log tree commit diff
path: root/elf/dl-audit.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-02-04 15:54:59 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-02-09 08:47:42 -0300
commit9e94f57484a2aba0fe67ea2059b5843f651887c2 (patch)
tree5a3bc4b7d6190b91fe7ad8f36ae5c61c4a6a6396 /elf/dl-audit.c
parent3d9f171bfb5325bd5f427e9fc386453358c6e840 (diff)
downloadglibc-9e94f57484a2aba0fe67ea2059b5843f651887c2.tar.gz
glibc-9e94f57484a2aba0fe67ea2059b5843f651887c2.tar.xz
glibc-9e94f57484a2aba0fe67ea2059b5843f651887c2.zip
hppa: Fix bind-now audit (BZ #28857)
On hppa, a function pointer returned by la_symbind is actually a function
descriptor has the plabel bit set (bit 30).  This must be cleared to get
the actual address of the descriptor.  If the descriptor has been bound,
the first word of the descriptor is the physical address of theA function,
otherwise, the first word of the descriptor points to a trampoline in the
PLT.

This patch also adds a workaround on tests because on hppa (and it seems
to be the only ABI I have see it), some shared library adds a dynamic PLT
relocation to am empty symbol name:

$ readelf -r elf/tst-audit25mod1.so
[...]
Relocation section '.rela.plt' at offset 0x464 contains 6 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00002008  00000081 R_PARISC_IPLT                508
[...]

It breaks some assumptions on the test, where a symbol with an empty
name ("") is passed on la_symbind.

Checked on x86_64-linux-gnu and hppa-linux-gnu.
Diffstat (limited to 'elf/dl-audit.c')
-rw-r--r--elf/dl-audit.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
index 794bfd45cd..efc0492474 100644
--- a/elf/dl-audit.c
+++ b/elf/dl-audit.c
@@ -257,7 +257,8 @@ _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
       reloc_result->flags = flags;
     }
 
-  DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value);
+  if (flags & LA_SYMB_ALTVALUE)
+    DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value);
 }
 
 void