diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2021-01-17 16:43:45 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2021-01-17 16:43:59 -0800 |
commit | 25294ff049728a081c703b68f848d2cc04eef483 (patch) | |
tree | 3f0e99fb655332407dad496b2733023d64a9ed0a | |
parent | d46153313bb24f0028d3160fd171bb46dec24ed2 (diff) | |
download | binutils-gdb-25294ff049728a081c703b68f848d2cc04eef483.tar.gz |
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.
-rw-r--r-- | gold/ChangeLog | 6 | ||||
-rw-r--r-- | gold/testsuite/ifuncmain6pie.c | 14 | ||||
-rw-r--r-- | gold/testsuite/ifuncmod6.c | 10 |
3 files changed, 14 insertions, 16 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 33d97ddde9c..a1d3d3004f0 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2021-01-17 H.J. Lu <hongjiu.lu@intel.com> + + * testsuite/ifuncmain6pie.c: Remove non-JUMP_SLOT relocations + against foo in ifuncmod6.so. + * testsuite/ifuncmod6.c: Likewise. + 2021-01-14 Nick Clifton <nickc@redhat.com> * po/fr.po: Updated French translation. diff --git a/gold/testsuite/ifuncmain6pie.c b/gold/testsuite/ifuncmain6pie.c index 8478d4c408d..5c3eb60d4e5 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 89a50f931b4..d324a82d5ea 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 (); } |