[uclibc-ng-devel] or1k: Fix compiling with PIC and latest binutils use PLT for __syscall_error
diff mbox series

Message ID 20190826205844.31878-1-shorne@gmail.com
State New
Headers show
Series
  • [uclibc-ng-devel] or1k: Fix compiling with PIC and latest binutils use PLT for __syscall_error
Related show

Commit Message

Stafford Horne Aug. 26, 2019, 8:58 p.m. UTC
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(-)

Comments

Romain Naour Aug. 27, 2019, 7:37 p.m. UTC | #1
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;
>  
>
Stafford Horne Aug. 28, 2019, 8:56 p.m. UTC | #2
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

Patch
diff mbox series

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;