mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 03:33:33 +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>
|
2009-11-03 Andreas Schwab <schwab@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list: Add
|
* 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. */
|
/* Resolve indirect function address. */
|
||||||
if (__builtin_expect (ELFW(ST_TYPE) (ref->st_info) == STT_GNU_IFUNC, 0))
|
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
|
#ifdef SHARED
|
||||||
/* Auditing checkpoint: we have a new binding. Provide the
|
/* Auditing checkpoint: we have a new binding. Provide the
|
||||||
|
@ -46,6 +46,15 @@ main (void)
|
|||||||
return 1;
|
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");
|
f = dlsym (h, "get_foo_p");
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user