Message ID | 20190826205844.31878-1-shorne@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [uclibc-ng-devel] or1k: Fix compiling with PIC and latest binutils use PLT for __syscall_error | expand |
Hi Stafford, Le 26/08/2019 à 22:58, Stafford Horne a écrit : > This symbol was causing a build failure with the new toolchain. It > looks like it has always been wrong. > > The main issue was checking for PIC rather than __PIC__. Indeed, I also noticed this. I've made a similar/simpler patch but the system doesn't boot (init program is stuck after "Run /init as init process") Sadly, the system doesn't boot even with your patch. Have you successfully runtime tested uClibc-ng build with your patch? Best regards, Romain > > Remove all PSEUDO_* macros and ther SYSCALL_ERROR_NAME macro as they are > not needed by uclibc-ng, they are used in glibc for building up syscalls > there, but not here. > > Fixes error: > /opt/shorne/software/or1k-linux/bin/../lib/gcc/or1k-linux/9.0.1/../../../../or1k-linux/bin/ld: libc/libc_so.a(or1k_clone.os): pc-relative relocation against dynamic symbol __syscall_error > /opt/shorne/software/or1k-linux/bin/../lib/gcc/or1k-linux/9.0.1/../../../../or1k-linux/bin/ld: final link failed: bad value > > Signed-off-by: Stafford Horne <shorne@gmail.com> > --- > libc/sysdeps/linux/or1k/or1k_clone.S | 8 +++++-- > libc/sysdeps/linux/or1k/sysdep.h | 32 ---------------------------- > 2 files changed, 6 insertions(+), 34 deletions(-) > > diff --git a/libc/sysdeps/linux/or1k/or1k_clone.S b/libc/sysdeps/linux/or1k/or1k_clone.S > index a2c16ac9e..2de873a02 100644 > --- a/libc/sysdeps/linux/or1k/or1k_clone.S > +++ b/libc/sysdeps/linux/or1k/or1k_clone.S > @@ -71,7 +71,11 @@ L(oldpid): > l.ori r3, r11, 0 > > L(error): > - l.j SYSCALL_ERROR_NAME > +#ifdef __PIC__ > + l.j plt(__syscall_error) > +#else > + l.j __syscall_error > +#endif > l.ori r3,r11,0 > > -PSEUDO_END (__or1k_clone) > +END (__or1k_clone) > diff --git a/libc/sysdeps/linux/or1k/sysdep.h b/libc/sysdeps/linux/or1k/sysdep.h > index 4dba3f2a0..782981c55 100644 > --- a/libc/sysdeps/linux/or1k/sysdep.h > +++ b/libc/sysdeps/linux/or1k/sysdep.h > @@ -43,38 +43,6 @@ License along with the GNU C Library; if not, see > l.sys 1; \ > l.nop > > -#define PSEUDO(name, syscall_name, args) \ > - ENTRY (name); \ > - DO_CALL(syscall_name); \ > - /* if -4096 < ret < 0 holds, it's an error */ \ > - l.sfgeui r11, 0xf001; \ > - l.bf L(pseudo_end); \ > - l.nop > - > -#define PSEUDO_NOERRNO(name, syscall_name, args) \ > - ENTRY (name); \ > - DO_CALL(syscall_name) > - > -#define PSEUDO_END(name) \ > -L(pseudo_end): \ > - l.j SYSCALL_ERROR_NAME; \ > - l.ori r3,r11,0; \ > - END (name) > - > -#define PSEUDO_END_NOERRNO(name) \ > - END (name) > - > -#ifndef PIC > -/* For static code, on error jump to __syscall_error directly. */ > -# define SYSCALL_ERROR_NAME __syscall_error > -#elif NOT_IN_libc > -/* Use the internal name for libc/libpthread shared objects. */ > -# define SYSCALL_ERROR_NAME __GI___syscall_error > -#else > -/* Otherwise, on error do a full PLT jump. */ > -# define SYSCALL_ERROR_NAME plt(__syscall_error) > -#endif > - > /* Make use of .size directive. */ > #define ASM_SIZE_DIRECTIVE(name) .size name,.-name; > >
On Tue, Aug 27, 2019 at 09:37:32PM +0200, Romain Naour wrote: > Hi Stafford, > > Le 26/08/2019 à 22:58, Stafford Horne a écrit : > > This symbol was causing a build failure with the new toolchain. It > > looks like it has always been wrong. > > > > The main issue was checking for PIC rather than __PIC__. > > Indeed, I also noticed this. > I've made a similar/simpler patch but the system doesn't boot (init program is > stuck after "Run /init as init process") > > Sadly, the system doesn't boot even with your patch. > Have you successfully runtime tested uClibc-ng build with your patch? > Hello, No, I haven't got it booting. I have only been able to successfully compile using this. I don't have an environment setup right now to boot a uclibc-ng target. What are you using qemu, or1ksim, fpga? In terms of possible issues, I did just fix 2 bugs that caused glibc to not build: - gcc bug - could not read GOT due to clobbering r9 https://gcc.gnu.org/ml/gcc-patches/2019-08/msg01549.html - binutils bug - issue with PLT entries and lazy symbol resolution (Already upstream) https://sourceware.org/ml/binutils/2019-08/msg00214.html -Stafford
Hi, Stafford Horne wrote, > On Tue, Aug 27, 2019 at 09:37:32PM +0200, Romain Naour wrote: > > Hi Stafford, > > > > Le 26/08/2019 à 22:58, Stafford Horne a écrit : > > > This symbol was causing a build failure with the new toolchain. It > > > looks like it has always been wrong. > > > > > > The main issue was checking for PIC rather than __PIC__. > > > > Indeed, I also noticed this. > > I've made a similar/simpler patch but the system doesn't boot (init program is > > stuck after "Run /init as init process") > > > > Sadly, the system doesn't boot even with your patch. > > Have you successfully runtime tested uClibc-ng build with your patch? > > > > Hello, > > No, I haven't got it booting. > > I have only been able to successfully compile using this. I don't have an > environment setup right now to boot a uclibc-ng target. What are you using > qemu, or1ksim, fpga? > > In terms of possible issues, I did just fix 2 bugs that caused glibc to not > build: > - gcc bug - could not read GOT due to clobbering r9 > https://gcc.gnu.org/ml/gcc-patches/2019-08/msg01549.html > - binutils bug - issue with PLT entries and lazy symbol resolution > (Already upstream) > https://sourceware.org/ml/binutils/2019-08/msg00214.html Patch applied and pushed. With the binutils/gcc patch the system boots fine in Qemu. The testsuite does show also good results, just 6-7 test failures. best regards Waldemar
diff --git a/libc/sysdeps/linux/or1k/or1k_clone.S b/libc/sysdeps/linux/or1k/or1k_clone.S index a2c16ac9e..2de873a02 100644 --- a/libc/sysdeps/linux/or1k/or1k_clone.S +++ b/libc/sysdeps/linux/or1k/or1k_clone.S @@ -71,7 +71,11 @@ L(oldpid): l.ori r3, r11, 0 L(error): - l.j SYSCALL_ERROR_NAME +#ifdef __PIC__ + l.j plt(__syscall_error) +#else + l.j __syscall_error +#endif l.ori r3,r11,0 -PSEUDO_END (__or1k_clone) +END (__or1k_clone) diff --git a/libc/sysdeps/linux/or1k/sysdep.h b/libc/sysdeps/linux/or1k/sysdep.h index 4dba3f2a0..782981c55 100644 --- a/libc/sysdeps/linux/or1k/sysdep.h +++ b/libc/sysdeps/linux/or1k/sysdep.h @@ -43,38 +43,6 @@ License along with the GNU C Library; if not, see l.sys 1; \ l.nop -#define PSEUDO(name, syscall_name, args) \ - ENTRY (name); \ - DO_CALL(syscall_name); \ - /* if -4096 < ret < 0 holds, it's an error */ \ - l.sfgeui r11, 0xf001; \ - l.bf L(pseudo_end); \ - l.nop - -#define PSEUDO_NOERRNO(name, syscall_name, args) \ - ENTRY (name); \ - DO_CALL(syscall_name) - -#define PSEUDO_END(name) \ -L(pseudo_end): \ - l.j SYSCALL_ERROR_NAME; \ - l.ori r3,r11,0; \ - END (name) - -#define PSEUDO_END_NOERRNO(name) \ - END (name) - -#ifndef PIC -/* For static code, on error jump to __syscall_error directly. */ -# define SYSCALL_ERROR_NAME __syscall_error -#elif NOT_IN_libc -/* Use the internal name for libc/libpthread shared objects. */ -# define SYSCALL_ERROR_NAME __GI___syscall_error -#else -/* Otherwise, on error do a full PLT jump. */ -# define SYSCALL_ERROR_NAME plt(__syscall_error) -#endif - /* Make use of .size directive. */ #define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
This symbol was causing a build failure with the new toolchain. It looks like it has always been wrong. The main issue was checking for PIC rather than __PIC__. Remove all PSEUDO_* macros and ther SYSCALL_ERROR_NAME macro as they are not needed by uclibc-ng, they are used in glibc for building up syscalls there, but not here. Fixes error: /opt/shorne/software/or1k-linux/bin/../lib/gcc/or1k-linux/9.0.1/../../../../or1k-linux/bin/ld: libc/libc_so.a(or1k_clone.os): pc-relative relocation against dynamic symbol __syscall_error /opt/shorne/software/or1k-linux/bin/../lib/gcc/or1k-linux/9.0.1/../../../../or1k-linux/bin/ld: final link failed: bad value Signed-off-by: Stafford Horne <shorne@gmail.com> --- libc/sysdeps/linux/or1k/or1k_clone.S | 8 +++++-- libc/sysdeps/linux/or1k/sysdep.h | 32 ---------------------------- 2 files changed, 6 insertions(+), 34 deletions(-)