https://sourceware.org/bugzilla/show_bug.cgi?id=29216
Bug ID: 29216
Summary: [2.39 Regression] IFUNC function pointer reference
equality failure
Product: binutils
Version: 2.39 (HEAD)
Status: NEW
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: hjl.tools at gmail dot com
Target Milestone: ---
commit 68c4956b1401de70173848a6bdf620cb42fa9358 (refs/bisect/bad)
Author: H.J. Lu <[email protected]>
Date: Tue Apr 26 09:08:54 2022 -0700
x86: Properly handle function pointer reference
caused:
[hjl@gnu-tgl-3 tmp]$ cat x.c
#include <stdlib.h>
static inline void *
ifunc_one (int (*f1) (void))
{
return f1;
}
extern int foo (void);
static int
one (void)
{
return -30;
}
static void * foo_ifunc (void) __asm__ ("foo");
__asm__(".type foo, %gnu_indirect_function");
static void *
__attribute__ ((used))
foo_ifunc (void)
{
return ifunc_one (one);
}
typedef int (*foo_p) (void);
foo_p foo_ptr = foo;
foo_p
__attribute__ ((noinline))
get_foo_p (void)
{
return foo_ptr;
}
foo_p
__attribute__ ((noinline))
get_foo (void)
{
return foo;
}
int
main (void)
{
foo_p p;
p = get_foo ();
if (p != foo)
abort ();
if ((*p) () != -30)
abort ();
p = get_foo_p ();
if (p != foo)
abort ();
if ((*p) () != -30)
abort ();
if (foo_ptr != foo)
abort ();
if ((*foo_ptr) () != -30)
abort ();
if (foo () != -30)
abort ();
return 0;
}
[hjl@gnu-tgl-3 tmp]$ gcc -fPIC x.c
[hjl@gnu-tgl-3 tmp]$ ./a.out
Aborted (core dumped)
[hjl@gnu-tgl-3 tmp]$
--
You are receiving this mail because:
You are on the CC list for the bug.