mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Properly handle STT_GNU_IFUNC symbols in do_sym.
do_sym should use DL_FIXUP_VALUE_XXX macros to call IFUNC function. Otherwise, it won't compile on ia64. This patch fixes it and adds a test.
This commit is contained in:
parent
5b55d23611
commit
8608ae1f7b
@ -1,3 +1,8 @@
|
||||
2009-11-01 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf/dl-sym.c (do_sym): Properly handle STT_GNU_IFUNC symbols.
|
||||
* elf/ifuncmain3.c (main): Test dlopen STT_GNU_IFUNC symbol.
|
||||
|
||||
2009-11-03 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list: Add
|
||||
|
@ -193,8 +193,13 @@ RTLD_NEXT used in code not dynamically loaded"));
|
||||
|
||||
/* Resolve indirect function address. */
|
||||
if (__builtin_expect (ELFW(ST_TYPE) (ref->st_info) == STT_GNU_IFUNC, 0))
|
||||
value
|
||||
= ((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (value)) ();
|
||||
{
|
||||
DL_FIXUP_VALUE_TYPE fixup
|
||||
= DL_FIXUP_MAKE_VALUE (result, (ElfW(Addr)) value);
|
||||
fixup =
|
||||
((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (fixup)) ();
|
||||
value = (void *) DL_FIXUP_VALUE_CODE_ADDR (fixup);
|
||||
}
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have a new binding. Provide the
|
||||
|
@ -46,6 +46,15 @@ main (void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
p = dlsym (h, "foo");
|
||||
if (p == NULL)
|
||||
{
|
||||
printf ("symbol not found: %s\n", dlerror ());
|
||||
return 1;
|
||||
}
|
||||
if ((*p) () != -1)
|
||||
abort ();
|
||||
|
||||
f = dlsym (h, "get_foo_p");
|
||||
if (f == NULL)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user