public inbox for glibc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "adhemerval.zanella at linaro dot org" <sourceware-bugzilla@sourceware.org>
To: glibc-bugs@sourceware.org
Subject: [Bug libc/28857] FAIL: elf/tst-audit24a
Date: Fri, 04 Feb 2022 18:53:55 +0000	[thread overview]
Message-ID: <bug-28857-131-gaxvWzvDow@http.sourceware.org/bugzilla/> (raw)
In-Reply-To: <bug-28857-131@http.sourceware.org/bugzilla/>

https://sourceware.org/bugzilla/show_bug.cgi?id=28857

--- Comment #3 from Adhemerval Zanella <adhemerval.zanella at linaro dot org> ---
(In reply to dave.anglin from comment #2)
> Is it DL_FIXUP_ADDR_VALUE that's problematic?  Maybe it should be defined to
> _dl_lookup_address()?

I think you mean DL_FIXUP_BINDNOW_ADDR_VALUE, but I don't this is the issue
since it is just used for pointer equality to see the symbind does change the
binding.

> 
> On 32-bit hppa, a pointer to a function descriptor has the plabel bit set
> (bit 30).  This must be cleared to
> get the actual address of the descriptor ((unsigned int)addr & ~2).  If the
> descriptor has been bound,
> the first word of the descriptor is the physical address of the function. 
> If it hasn't been bound, the first
> word of the descriptor points to a trampoline in the PLT.  It will fixup the
> descriptor on the first call to
> the function.
> 
> _dl_lookup_address() in dl-fptr.c resolves the descriptor and returns the
> actual function address.
> 
> If that's not required, maybe DL_FIXUP_ADDR_VALUE(addr) should be:
> #define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) ((unsigned int)addr &
> ~2))
> DL_FIXUP_BINDNOW_RELOC looks questionable as well.

The _dl_lookup_address seems to be indeed required and I also think we should
only updated the binding if la_symbind actually acts uppon it.  The following
patch fixes the tests on hppa:

diff --git a/elf/Makefile b/elf/Makefile
index 5bdf0a383d..7372cb191c 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -2210,7 +2210,7 @@ $(objpfx)tst-audit24c.out: $(objpfx)tst-auditmod24c.so
 $(objpfx)tst-audit24c: $(objpfx)tst-audit24amod1.so \
                       $(objpfx)tst-audit24amod2.so
 tst-audit24c-ENV = LD_BIND_NOW=1 LD_AUDIT=$(objpfx)tst-auditmod24c.so
-LDFLAGS-tst-audit24b = -Wl,-z,lazy
+LDFLAGS-tst-audit24c = -Wl,-z,lazy

 $(objpfx)tst-audit24d.out: $(objpfx)tst-auditmod24d.so
 $(objpfx)tst-audit24d: $(objpfx)tst-audit24dmod1.so \
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
diff --git a/elf/tst-auditmod24a.c b/elf/tst-auditmod24a.c
index d8e88f3984..3075dfae2f 100644
--- a/elf/tst-auditmod24a.c
+++ b/elf/tst-auditmod24a.c
@@ -110,5 +110,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
       return sym->st_value;
     }

-  abort ();
+  if (symname[0] != '\0')
+    abort ();
+  return sym->st_value;
 }
diff --git a/elf/tst-auditmod24d.c b/elf/tst-auditmod24d.c
index 8c803ecc0a..badc6be451 100644
--- a/elf/tst-auditmod24d.c
+++ b/elf/tst-auditmod24d.c
@@ -116,5 +116,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
        }
     }

-  abort ();
+  if (symname[0] != '\0')
+    abort ();
+  return sym->st_value;
 }
diff --git a/elf/tst-auditmod25.c b/elf/tst-auditmod25.c
index 526f5c54bc..20640a8daf 100644
--- a/elf/tst-auditmod25.c
+++ b/elf/tst-auditmod25.c
@@ -72,7 +72,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
              unsigned int *flags, const char *symname)
 #endif
 {
-  if (*refcook != -1 && *defcook != -1)
+  if (*refcook != -1 && *defcook != -1 && symname[0] != '\0')
     fprintf (stderr, "la_symbind: %s %u\n", symname,
             *flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) ? 1 : 0);
   return sym->st_value;
diff --git a/sysdeps/hppa/dl-fptr.c b/sysdeps/hppa/dl-fptr.c
index 2584557c4f..4cc2cb21b1 100644
--- a/sysdeps/hppa/dl-fptr.c
+++ b/sysdeps/hppa/dl-fptr.c
@@ -407,3 +407,4 @@ _dl_lookup_address (const void *address)

   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 8da2412fea..3929fc84ae 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)

@@ -81,5 +82,8 @@ void attribute_hidden _dl_unmap (struct link_map *map);
 #define DL_FIXUP_VALUE_ADDR(value) ((uintptr_t) &(value))
 #define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) (addr))
 #define DL_FIXUP_BINDNOW_ADDR_VALUE(addr) (addr)
-#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value) \
-  (*value) = *(struct fdesc *) (st_value)
+#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value)     \
+  ({                                                           \
+     value->ip = _dl_lookup_address ((void *) new_value);      \
+     value->gp = ((struct fdesc *) (new_value))->gp;           \
+  })

I had to add 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 that I am
not sure why it is required:

$ 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.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

  parent reply	other threads:[~2022-02-04 18:53 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-03 14:25 [Bug libc/28857] New: " danglin at gcc dot gnu.org
2022-02-03 20:17 ` [Bug libc/28857] " adhemerval.zanella at linaro dot org
2022-02-03 20:49 ` dave.anglin at bell dot net
2022-02-04 18:53 ` adhemerval.zanella at linaro dot org [this message]
2022-02-05  0:33 ` dave.anglin at bell dot net
2022-02-05 23:29 ` dave.anglin at bell dot net
2022-02-07 12:11 ` adhemerval.zanella at linaro dot org
2022-02-07 12:50 ` adhemerval.zanella at linaro dot org
2022-02-07 15:16 ` dave.anglin at bell dot net
2022-02-09 12:13 ` adhemerval.zanella at linaro dot org
2023-01-17 18:57 ` sam at gentoo dot org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-28857-131-gaxvWzvDow@http.sourceware.org/bugzilla/ \
    --to=sourceware-bugzilla@sourceware.org \
    --cc=glibc-bugs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).