Message ID | 20240521023139.1670459-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | Make clone3 shared-only [BZ #31770] | expand |
On 20/05/24 23:31, H.J. Lu wrote: > clone3 isn't exported from libc.so. Fix BZ #31770 by making clone3 > shared-only. > > Signed-off-by: H.J. Lu <hjl.tools@gmail.com> > --- > sysdeps/unix/sysv/linux/Makefile | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index 415aa1f14d..233db08be7 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -112,6 +112,7 @@ sysdep_routines += \ > xstat \ > xstat64 \ > # sysdep_routines > +shared-only-routines += clone3 > > CFLAGS-gethostid.c = -fexceptions > CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables We need __clone3 for posix_spawn and pthread_create, so making it shared-only is not correct. Wit this patch applied: $ make test t=posix/tst-spawn-static run-built-tests=no x86_64-glibc-linux-gnu-gcc -o /home/azanella/Projects/glibc/build/x86_64-linux-gnu/posix/tst-spawn-static -nostdlib -nostartfiles -static -static-pie [...] /home/azanella/toolchain/install/compilers/14/x86_64-linux-gnu/bin/../lib/gcc/x86_64-glibc-linux-gnu/14.1.1/../../../../x86_64-glibc-linux-gnu/bin/ld: /home/azanella/Projects/glibc/build/x86_64-linux-gnu/libc.a(spawni.o): in function `__spawnix': /home/azanella/Projects/glibc/glibc-git/posix/../sysdeps/unix/sysv/linux/spawni.c:417:(.text+0x231): undefined reference to `__clone3' /home/azanella/toolchain/install/compilers/14/x86_64-linux-gnu/bin/../lib/gcc/x86_64-glibc-linux-gnu/14.1.1/../../../../x86_64-glibc-linux-gnu/bin/ld: /home/azanella/Projects/glibc/build/x86_64-linux-gnu/libc.a(clone-internal.o): in function `__clone3_internal': [...] The correct approach is to remove the __clone3 to clone3 alias in *all* clone3.S implementations: diff --git a/sysdeps/unix/sysv/linux/x86_64/clone3.S b/sysdeps/unix/sysv/linux/x86_64/clone3.S index 5a2d42234e..4cc19e066c 100644 --- a/sysdeps/unix/sysv/linux/x86_64/clone3.S +++ b/sysdeps/unix/sysv/linux/x86_64/clone3.S @@ -86,4 +86,3 @@ L(thread_start): PSEUDO_END (__clone3) libc_hidden_def (__clone3) -weak_alias (__clone3, clone3) Which results in: x86_64-linux-gnu$ readelf -sW libc.a | grep clone3 19: 0000000000000000 0 NOTYPE GLOBAL HIDDEN UND __clone3 4: 0000000000000000 4 OBJECT LOCAL DEFAULT 3 clone3_supported.0 15: 0000000000000060 137 FUNC GLOBAL HIDDEN 1 __clone3_internal 16: 0000000000000000 0 NOTYPE GLOBAL HIDDEN UND __clone3 File: libc.a(clone3.o) 7: 0000000000000000 71 FUNC GLOBAL DEFAULT 1 __clone3
On Tue, May 21, 2024 at 5:50 AM Adhemerval Zanella Netto <adhemerval.zanella@linaro.org> wrote: > > > > On 20/05/24 23:31, H.J. Lu wrote: > > clone3 isn't exported from libc.so. Fix BZ #31770 by making clone3 > > shared-only. > > > > Signed-off-by: H.J. Lu <hjl.tools@gmail.com> > > --- > > sysdeps/unix/sysv/linux/Makefile | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > > index 415aa1f14d..233db08be7 100644 > > --- a/sysdeps/unix/sysv/linux/Makefile > > +++ b/sysdeps/unix/sysv/linux/Makefile > > @@ -112,6 +112,7 @@ sysdep_routines += \ > > xstat \ > > xstat64 \ > > # sysdep_routines > > +shared-only-routines += clone3 > > > > CFLAGS-gethostid.c = -fexceptions > > CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables > > We need __clone3 for posix_spawn and pthread_create, so making it shared-only > is not correct. Wit this patch applied: > > $ make test t=posix/tst-spawn-static run-built-tests=no > x86_64-glibc-linux-gnu-gcc -o /home/azanella/Projects/glibc/build/x86_64-linux-gnu/posix/tst-spawn-static -nostdlib -nostartfiles -static -static-pie [...] > /home/azanella/toolchain/install/compilers/14/x86_64-linux-gnu/bin/../lib/gcc/x86_64-glibc-linux-gnu/14.1.1/../../../../x86_64-glibc-linux-gnu/bin/ld: /home/azanella/Projects/glibc/build/x86_64-linux-gnu/libc.a(spawni.o): in function `__spawnix': > /home/azanella/Projects/glibc/glibc-git/posix/../sysdeps/unix/sysv/linux/spawni.c:417:(.text+0x231): undefined reference to `__clone3' > /home/azanella/toolchain/install/compilers/14/x86_64-linux-gnu/bin/../lib/gcc/x86_64-glibc-linux-gnu/14.1.1/../../../../x86_64-glibc-linux-gnu/bin/ld: /home/azanella/Projects/glibc/build/x86_64-linux-gnu/libc.a(clone-internal.o): in function `__clone3_internal': > [...] > > The correct approach is to remove the __clone3 to clone3 alias in > *all* clone3.S implementations: Can you review https://patchwork.sourceware.org/project/glibc/list/?series=34172 Thanks. > diff --git a/sysdeps/unix/sysv/linux/x86_64/clone3.S b/sysdeps/unix/sysv/linux/x86_64/clone3.S > index 5a2d42234e..4cc19e066c 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/clone3.S > +++ b/sysdeps/unix/sysv/linux/x86_64/clone3.S > @@ -86,4 +86,3 @@ L(thread_start): > PSEUDO_END (__clone3) > > libc_hidden_def (__clone3) > -weak_alias (__clone3, clone3) > > Which results in: > > x86_64-linux-gnu$ readelf -sW libc.a | grep clone3 > 19: 0000000000000000 0 NOTYPE GLOBAL HIDDEN UND __clone3 > 4: 0000000000000000 4 OBJECT LOCAL DEFAULT 3 clone3_supported.0 > 15: 0000000000000060 137 FUNC GLOBAL HIDDEN 1 __clone3_internal > 16: 0000000000000000 0 NOTYPE GLOBAL HIDDEN UND __clone3 > File: libc.a(clone3.o) > 7: 0000000000000000 71 FUNC GLOBAL DEFAULT 1 __clone3
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 415aa1f14d..233db08be7 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -112,6 +112,7 @@ sysdep_routines += \ xstat \ xstat64 \ # sysdep_routines +shared-only-routines += clone3 CFLAGS-gethostid.c = -fexceptions CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables
clone3 isn't exported from libc.so. Fix BZ #31770 by making clone3 shared-only. Signed-off-by: H.J. Lu <hjl.tools@gmail.com> --- sysdeps/unix/sysv/linux/Makefile | 1 + 1 file changed, 1 insertion(+)