From 25294ff049728a081c703b68f848d2cc04eef483 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 17 Jan 2021 16:43:45 -0800 Subject: gold: Remove the circular IFUNC dependency in ifuncmain6pie On Fedora 33 x86-64 with glibc 2.32-3, ifuncmain6pie failed with: ./ifuncmain6pie: IFUNC symbol 'foo' referenced in './ifuncmod6.so' is defined in the executable and creates an unsatisfiable circular dependency. FAIL ifuncmain6pie (exit status: 127) Remove non-JUMP_SLOT relocations against foo in ifuncmod6.so, which trigger the circular IFUNC dependency. * testsuite/ifuncmain6pie.c: Remove non-JUMP_SLOT relocations against foo in ifuncmod6.so. * testsuite/ifuncmod6.c: Likewise. --- gold/ChangeLog | 6 ++++++ gold/testsuite/ifuncmain6pie.c | 14 +++----------- gold/testsuite/ifuncmod6.c | 10 +++++----- 3 files changed, 14 insertions(+), 16 deletions(-) (limited to 'gold') diff --git a/gold/ChangeLog b/gold/ChangeLog index 33d97dd..a1d3d30 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2021-01-17 H.J. Lu + + * testsuite/ifuncmain6pie.c: Remove non-JUMP_SLOT relocations + against foo in ifuncmod6.so. + * testsuite/ifuncmod6.c: Likewise. + 2021-01-14 Nick Clifton * po/fr.po: Updated French translation. diff --git a/gold/testsuite/ifuncmain6pie.c b/gold/testsuite/ifuncmain6pie.c index 8478d4c..5c3eb60 100644 --- a/gold/testsuite/ifuncmain6pie.c +++ b/gold/testsuite/ifuncmain6pie.c @@ -9,7 +9,6 @@ #include "ifunc-sel.h" typedef int (*foo_p) (void); -extern foo_p foo_ptr; static int one (void) @@ -27,20 +26,17 @@ foo_ifunc (void) } extern int foo (void); -extern foo_p get_foo (void); +extern int call_foo (void); extern foo_p get_foo_p (void); -foo_p my_foo_ptr = foo; +foo_p foo_ptr = foo; int main (void) { foo_p p; - p = get_foo (); - if (p != foo) - abort (); - if ((*p) () != -30) + if (call_foo () != -30) abort (); p = get_foo_p (); @@ -51,12 +47,8 @@ main (void) if (foo_ptr != foo) abort (); - if (my_foo_ptr != foo) - abort (); if ((*foo_ptr) () != -30) abort (); - if ((*my_foo_ptr) () != -30) - abort (); if (foo () != -30) abort (); diff --git a/gold/testsuite/ifuncmod6.c b/gold/testsuite/ifuncmod6.c index 89a50f9..d324a82 100644 --- a/gold/testsuite/ifuncmod6.c +++ b/gold/testsuite/ifuncmod6.c @@ -5,9 +5,9 @@ extern int foo (void); typedef int (*foo_p) (void); extern foo_p get_foo_p (void); -extern foo_p get_foo (void); +extern int call_foo (void); -foo_p foo_ptr = foo; +extern foo_p foo_ptr; foo_p get_foo_p (void) @@ -15,8 +15,8 @@ get_foo_p (void) return foo_ptr; } -foo_p -get_foo (void) +int +call_foo (void) { - return foo; + return foo (); } -- cgit v1.1