Message ID | CAMe9rOryuOAHN=7yk8Ym=qEqseznYwN+ZSOnMep5eS8299TpYA@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | ifuncmain6pie: Remove the circular IFUNC dependency [BZ #20019] | expand |
On 04/01/2021 19:38, H.J. Lu via Libc-alpha wrote: > On Mon, Jan 4, 2021 at 1:20 PM Carlos O'Donell <carlos@redhat.com> wrote: >> > ... >>> >>> [hjl@gnu-cfl-2 build-x86_64-linux]$ ./elf/ifuncmain6pie --direct >>> ./elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in >>> '/export/build/gnu/tools-build/glibc/build-x86_64-linux/elf/ifuncmod6.so' >>> is defined in the executable and creates an unsatisfiable circular >>> dependency. >>> [hjl@gnu-cfl-2 build-x86_64-linux]$ >>> >>> The message is correct. Should we update the testcase to avoid it? >> >> Yes, but it is still possible to support this with lazy binding? >> >> Should ifuncmain6pie be explicitly compiled with -Wl,-z,lazy to >> bypass selection from the toolchain? > > The problem is non-JUMP_SLOT relocations. Here is a patch to > remove them. OK for master? > > Thanks. > I am getting a failure for elf/ifuncmain6pie for a couple of days: $ ./testrun.sh elf/ifuncmain6pie elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in '/home/azanella/Projects/glibc/build/x86_64-linux-gnu/elf/ifuncmod6.so' is defined in the executable and creates an unsatisfiable circular dependency. The patch looks ok for 2.33. However, I think it should be been added along with 6ea5b57afa5 fix in first place. Why hasn't it shown in your make check? Does the failure depend on a binutils version? > diff --git a/elf/Makefile b/elf/Makefile > index 543800f4be..c41d11693b 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -1403,6 +1403,8 @@ CFLAGS-ifuncmain7pie.c += $(pie-ccflag) > CFLAGS-ifuncmain9pie.c += $(pie-ccflag) > CFLAGS-tst-ifunc-textrel.c += $(pic-ccflag) > > +LDFLAGS-ifuncmain6pie = -Wl,-z,lazy > + > $(objpfx)ifuncmain1pie: $(objpfx)ifuncmod1.so > $(objpfx)ifuncmain1staticpie: $(objpfx)ifuncdep1pic.o > $(objpfx)ifuncmain1vispie: $(objpfx)ifuncmod1.so > diff --git a/elf/ifuncmain6pie.c b/elf/ifuncmain6pie.c > index 04faeb86ef..4a01906836 100644 > --- a/elf/ifuncmain6pie.c > +++ b/elf/ifuncmain6pie.c > @@ -9,7 +9,6 @@ > #include "ifunc-sel.h" > > typedef int (*foo_p) (void); > -extern foo_p foo_ptr; > > static int > one (void) > @@ -28,20 +27,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 (); > @@ -52,12 +48,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/elf/ifuncmod6.c b/elf/ifuncmod6.c > index 2e16c1d06d..2f6d0715e6 100644 > --- a/elf/ifuncmod6.c > +++ b/elf/ifuncmod6.c > @@ -4,7 +4,7 @@ extern int foo (void); > > typedef int (*foo_p) (void); > > -foo_p foo_ptr = foo; > +extern foo_p foo_ptr; > > foo_p > get_foo_p (void) > @@ -12,8 +12,8 @@ get_foo_p (void) > return foo_ptr; > } > > -foo_p > -get_foo (void) > +int > +call_foo (void) > { > - return foo; > + return foo (); > } > -- > 2.29.2
On Wed, Jan 13, 2021 at 11:43 AM Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > > > On 04/01/2021 19:38, H.J. Lu via Libc-alpha wrote: > > On Mon, Jan 4, 2021 at 1:20 PM Carlos O'Donell <carlos@redhat.com> wrote: > >> > > ... > >>> > >>> [hjl@gnu-cfl-2 build-x86_64-linux]$ ./elf/ifuncmain6pie --direct > >>> ./elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in > >>> '/export/build/gnu/tools-build/glibc/build-x86_64-linux/elf/ifuncmod6.so' > >>> is defined in the executable and creates an unsatisfiable circular > >>> dependency. > >>> [hjl@gnu-cfl-2 build-x86_64-linux]$ > >>> > >>> The message is correct. Should we update the testcase to avoid it? > >> > >> Yes, but it is still possible to support this with lazy binding? > >> > >> Should ifuncmain6pie be explicitly compiled with -Wl,-z,lazy to > >> bypass selection from the toolchain? > > > > The problem is non-JUMP_SLOT relocations. Here is a patch to > > remove them. OK for master? > > > > Thanks. > > > > I am getting a failure for elf/ifuncmain6pie for a couple of days: > > $ ./testrun.sh elf/ifuncmain6pie > elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in '/home/azanella/Projects/glibc/build/x86_64-linux-gnu/elf/ifuncmod6.so' is defined in the executable and creates an unsatisfiable circular dependency. > > The patch looks ok for 2.33. I am checking it in. Thanks. > However, I think it should be been added along with 6ea5b57afa5 I don't want the testcase issue to block the code fix. > fix in first place. Why hasn't it shown in your make check? Does the > failure depend on a binutils version? No.
On 13/01/2021 16:48, H.J. Lu wrote: > On Wed, Jan 13, 2021 at 11:43 AM Adhemerval Zanella > <adhemerval.zanella@linaro.org> wrote: >> >> >> >> On 04/01/2021 19:38, H.J. Lu via Libc-alpha wrote: > >> However, I think it should be been added along with 6ea5b57afa5 > > I don't want the testcase issue to block the code fix. > >> fix in first place. Why hasn't it shown in your make check? Does the >> failure depend on a binutils version? > > No. > In this case I think the tests should have been disabled until we add a proper fix. I saw that regression for a couple of days before I had time to investigate and see you already posted a fix.
From fe3bd3b8d7e6401dc96e2aa59f341d41d1cb4723 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Mon, 4 Jan 2021 14:25:39 -0800 Subject: [PATCH] ifuncmain6pie: Remove the circular IFUNC dependency [BZ #20019] On x86, ifuncmain6pie failed with: [hjl@gnu-cfl-2 build-i686-linux]$ ./elf/ifuncmain6pie --direct ./elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in '/export/build/gnu/tools-build/glibc-32bit/build-i686-linux/elf/ifuncmod6.so' is defined in the executable and creates an unsatisfiable circular dependency. [hjl@gnu-cfl-2 build-i686-linux]$ readelf -rW elf/ifuncmod6.so | grep foo 00003ff4 00000706 R_386_GLOB_DAT 0000400c foo_ptr 00003ff8 00000406 R_386_GLOB_DAT 00000000 foo 0000400c 00000401 R_386_32 00000000 foo [hjl@gnu-cfl-2 build-i686-linux]$ Remove non-JUMP_SLOT relocations against foo in ifuncmod6.so, which trigger the circular IFUNC dependency, and build ifuncmain6pie with -Wl,-z,lazy. --- elf/Makefile | 2 ++ elf/ifuncmain6pie.c | 14 +++----------- elf/ifuncmod6.c | 8 ++++---- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 543800f4be..c41d11693b 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1403,6 +1403,8 @@ CFLAGS-ifuncmain7pie.c += $(pie-ccflag) CFLAGS-ifuncmain9pie.c += $(pie-ccflag) CFLAGS-tst-ifunc-textrel.c += $(pic-ccflag) +LDFLAGS-ifuncmain6pie = -Wl,-z,lazy + $(objpfx)ifuncmain1pie: $(objpfx)ifuncmod1.so $(objpfx)ifuncmain1staticpie: $(objpfx)ifuncdep1pic.o $(objpfx)ifuncmain1vispie: $(objpfx)ifuncmod1.so diff --git a/elf/ifuncmain6pie.c b/elf/ifuncmain6pie.c index 04faeb86ef..4a01906836 100644 --- a/elf/ifuncmain6pie.c +++ b/elf/ifuncmain6pie.c @@ -9,7 +9,6 @@ #include "ifunc-sel.h" typedef int (*foo_p) (void); -extern foo_p foo_ptr; static int one (void) @@ -28,20 +27,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 (); @@ -52,12 +48,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/elf/ifuncmod6.c b/elf/ifuncmod6.c index 2e16c1d06d..2f6d0715e6 100644 --- a/elf/ifuncmod6.c +++ b/elf/ifuncmod6.c @@ -4,7 +4,7 @@ extern int foo (void); typedef int (*foo_p) (void); -foo_p foo_ptr = foo; +extern foo_p foo_ptr; foo_p get_foo_p (void) @@ -12,8 +12,8 @@ get_foo_p (void) return foo_ptr; } -foo_p -get_foo (void) +int +call_foo (void) { - return foo; + return foo (); } -- 2.29.2