NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/59391: unnecessary __PIC__ conditionals clutter .S files



The following reply was made to PR lib/59391; it has been noted by GNATS.

From: Valery Ushakov <uwe%stderr.spb.ru@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: lib/59391: unnecessary __PIC__ conditionals clutter .S files
Date: Thu, 8 May 2025 04:09:51 +0300

 The patch below allows one to write something like the following.  For
 static version it will expand to direct absolute accesses.  For PIC
 version it will do GOT or PC-relative respectively.  Same object code
 is generated modulo one s/mov/movs/ in cerror.S to make it compilable
 as thumb (to verify the same code is generated for thumb as well).
 
 
 0:	PIC_GOT_INIT(r3, .Lgot)
 	...
 	MOV_GLOBAL(r4, r3, .Lgvar)
 	str	r0, [r4]
 	...
 1:	MOV_PROTECTED(r4, .Llvar)
 	str	r1, [r4]
 
 	// and in the data after the function
 	.p2align 2
 .Lgot:
 	PIC_GOT_INITREF(0b)
 
 .Lgvar: // gvar has default visibility
 	.word GLOBAL_SYMREF(gvar)
 
 .Llvar: // lvar has protected or hidden visibility
 	.word PROTECTED_SYMREF(lvar)
 
 
 Index: sys/arch/arm/include/asm.h
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/arm/include/asm.h,v
 retrieving revision 1.39
 diff -u -p -c -r1.39 asm.h
 *** sys/arch/arm/include/asm.h	7 May 2025 16:26:47 -0000	1.39
 --- sys/arch/arm/include/asm.h	8 May 2025 00:32:21 -0000
 ***************
 *** 189,217 ****
   
   #define	ASMSTR		.asciz
   
 - #ifdef __PIC__
 - #define	REL_SYM(a, b)	((a) - (b))
 - #define	PLT_SYM(x)	x
 - #define	GOT_SYM(x)	PIC_SYM(x, GOT)
 - #define	GOT_GET(x,got,sym)	\
 - 	ldr	x, sym;		\
 - 	ldr	x, [x, got]
   
   /*
 !  * Load _GLOBAL_OFFSET_TABLE_ address into register:
    *
 !  * 0:	GOT_INIT(rX, .Lgot)
    *	...
    *
    *      // and in the data after the function
 !  *	GOT_INITSYM(.Lgot, 0b)
    */
 ! #define	GOT_INIT(Rgot, gotsym)	  \
 ! 	ldr	Rgot, gotsym	; \
 ! 	add	Rgot, Rgot, pc
 ! #define	GOT_INITSYM(gotsym, initlabel)	\
 ! 	.align 0;		\
 ! 	gotsym:	.word _C_LABEL(_GLOBAL_OFFSET_TABLE_) - (initlabel+(1+2)*_INSN_SIZE)
   
   #ifdef __STDC__
   #define	PIC_SYM(x,y)	x(y)
 --- 189,243 ----
   
   #define	ASMSTR		.asciz
   
   
   /*
 !  * Hide the gory details of PIC accesses vs. normal accesses.  Use as
 !  * in the following example.  For static version it will expand to
 !  * direct absolute accesses.  For PIC version it will do GOT or
 !  * PC-relative respectively.
    *
 !  * 0:	PIC_GOT_INIT(r3, .Lgot)
    *	...
 +  *	MOV_GLOBAL(r4, r3, .Lgvar)
 +  *	str	r0, [r4]
 +  *	...
 +  * 1:	MOV_PROTECTED(r4, .Llvar)
 +  *	str	r1, [r4]
    *
    *      // and in the data after the function
 !  *	.p2align 2
 !  * .Lgot:
 !  *	PIC_GOT_INITREF(0b)
 !  *
 !  * .Lgvar: // gvar has default visibility
 !  *	.word GLOBAL_SYMREF(gvar)
 !  *
 !  * .Llvar: // lvar has protected or hidden visibility
 !  *	.word PROTECTED_SYMREF(lvar)
    */
 ! #ifdef __PIC__
 ! #define	REL_SYM(a, b)	((a) - (b))
 ! #define	PLT_SYM(x)	x
 ! 
 ! #define	PIC_GOT_INIT(Rgot, reflabel) \
 ! 	MOV_PROTECTED(Rgot, reflabel)
 ! 
 ! #define	PIC_GOT_INITREF(initlabel) \
 ! 	.word PROTECTED_SYMREF(_C_LABEL(_GLOBAL_OFFSET_TABLE_), initlabel)
 ! 
 ! #define MOV_GLOBAL(Rdst, Rgot, reflabel)	\
 ! 	ldr	Rdst, reflabel;			\
 ! 	ldr	Rdst, [Rdst, Rgot]
 ! 
 ! #define	GLOBAL_SYMREF(sym) \
 ! 	PIC_SYM(sym, GOT)
 ! 
 ! #define MOV_PROTECTED(Rdst, reflabel)	\
 ! 	ldr	Rdst, reflabel;		\
 ! 	add	Rdst, Rdst, pc
 ! 
 ! #define PROTECTED_SYMREF(sym, movlabel)	\
 ! 	((sym) - ((movlabel) + (1+2)*_INSN_SIZE))
   
   #ifdef __STDC__
   #define	PIC_SYM(x,y)	x(y)
 ***************
 *** 219,232 ****
   #define	PIC_SYM(x,y)	x/**/(/**/y/**/)
   #endif
   
 ! #else
   #define	REL_SYM(a, b)	(a)
   #define	PLT_SYM(x)	x
 ! #define	GOT_SYM(x)	x
 ! #define	GOT_GET(x,got,sym)	\
 ! 	ldr	x, sym;
 ! #define	GOT_INIT(Rgot, gotsym)
 ! #define	GOT_INITSYM(gotsym, initlabel)
   #define	PIC_SYM(x,y)	x
   #endif	/* __PIC__ */
   
 --- 245,267 ----
   #define	PIC_SYM(x,y)	x/**/(/**/y/**/)
   #endif
   
 ! #else  /* !__PIC__ */
   #define	REL_SYM(a, b)	(a)
   #define	PLT_SYM(x)	x
 ! 
 ! #define	PIC_GOT_INIT(Rgot, reflabel)
 ! #define	PIC_GOT_INITREF(initlabel)
 ! 
 ! #define MOV_GLOBAL(Rdst, Rgot, reflabel) \
 ! 	ldr	Rdst, reflabel	/* Rgot is not used */
 ! 
 ! #define	GLOBAL_SYMREF(sym) (sym)
 ! 
 ! #define MOV_PROTECTED(Rdst, reflabel)	\
 ! 	ldr	Rdst, reflabel
 ! 
 ! #define PROTECTED_SYMREF(sym, movlabel) (sym)
 ! 
   #define	PIC_SYM(x,y)	x
   #endif	/* __PIC__ */
   
 Index: tests/kernel/arch/arm/contextspfunc.S
 ===================================================================
 RCS file: /cvsroot/src/tests/kernel/arch/arm/contextspfunc.S,v
 retrieving revision 1.2
 diff -u -p -c -r1.2 contextspfunc.S
 *** tests/kernel/arch/arm/contextspfunc.S	7 May 2025 16:26:47 -0000	1.2
 --- tests/kernel/arch/arm/contextspfunc.S	8 May 2025 00:32:22 -0000
 *************** RCSID("$NetBSD: contextspfunc.S,v 1.2 20
 *** 39,51 ****
    *	the global variable contextsp and call contextdone.
    */
   ENTRY(contextspfunc)
 ! 0:	GOT_INIT(r0, .Lgot)
   	mov	r1, sp
 ! 	GOT_GET(r2, r0, .Lcontextsp)
   	str	r1, [r2]
   	b	PLT_SYM(_C_LABEL(contextdone))
   
 ! 	GOT_INITSYM(.Lgot, 0b)
   .Lcontextsp:
 ! 	.word	GOT_SYM(contextsp)
   END(contextspfunc)
 --- 39,52 ----
    *	the global variable contextsp and call contextdone.
    */
   ENTRY(contextspfunc)
 ! 0:	PIC_GOT_INIT(r0, .Lgot)
   	mov	r1, sp
 ! 	MOV_GLOBAL(r2, r0, .Lcontextsp)
   	str	r1, [r2]
   	b	PLT_SYM(_C_LABEL(contextdone))
   
 ! 	.p2align 2
 ! .Lgot:	PIC_GOT_INITREF(0b)
   .Lcontextsp:
 ! 	.word	GLOBAL_SYMREF(contextsp)
   END(contextspfunc)
 Index: tests/kernel/arch/arm/execsp.S
 ===================================================================
 RCS file: /cvsroot/src/tests/kernel/arch/arm/execsp.S,v
 retrieving revision 1.4
 diff -u -p -c -r1.4 execsp.S
 *** tests/kernel/arch/arm/execsp.S	7 May 2025 16:26:47 -0000	1.4
 --- tests/kernel/arch/arm/execsp.S	8 May 2025 00:32:22 -0000
 *************** RCSID("$NetBSD: execsp.S,v 1.4 2025/05/0
 *** 40,54 ****
    *	to the usual csu __start routine.
    */
   ENTRY(execsp_start)
 ! 0:	GOT_INIT(r3, .Lgot.execsp_start)
   	mov	r4, sp
 ! 	GOT_GET(r5, r3, .Lstartsp)
   	str	r4, [r5]
   	b	PLT_SYM(_C_LABEL(__start))
   
 ! 	GOT_INITSYM(.Lgot.execsp_start, 0b)
   .Lstartsp:
 ! 	.word	GOT_SYM(startsp)
   END(execsp_start)
   
   /*
 --- 40,56 ----
    *	to the usual csu __start routine.
    */
   ENTRY(execsp_start)
 ! 0:	PIC_GOT_INIT(r3, .Lgot.execsp_start)
   	mov	r4, sp
 ! 	MOV_GLOBAL(r5, r3, .Lstartsp)
   	str	r4, [r5]
   	b	PLT_SYM(_C_LABEL(__start))
   
 ! 	.p2align 2
 ! .Lgot.execsp_start:
 ! 	PIC_GOT_INITREF(0b)
   .Lstartsp:
 ! 	.word	GLOBAL_SYMREF(startsp)
   END(execsp_start)
   
   /*
 *************** END(execsp_start)
 *** 58,72 ****
    *	returns.
    */
   ENTRY(execsp_ctor)
 ! 0:	GOT_INIT(r0, .Lgot.execsp_ctor)
   	mov	r1, sp
 ! 	GOT_GET(r2, r0, .Lctorsp)
   	str	r1, [r2]
   	RET
   
 ! 	GOT_INITSYM(.Lgot.execsp_ctor, 0b)
   .Lctorsp:
 ! 	.word	GOT_SYM(ctorsp)
   END(execsp_ctor)
   
   	/* Make execsp_ctor a constructor. */
 --- 60,76 ----
    *	returns.
    */
   ENTRY(execsp_ctor)
 ! 0:	PIC_GOT_INIT(r0, .Lgot.execsp_ctor)
   	mov	r1, sp
 ! 	MOV_GLOBAL(r2, r0, .Lctorsp)
   	str	r1, [r2]
   	RET
   
 ! 	.p2align 2
 ! .Lgot.execsp_ctor:
 ! 	PIC_GOT_INITREF(0b)
   .Lctorsp:
 ! 	.word	GLOBAL_SYMREF(ctorsp)
   END(execsp_ctor)
   
   	/* Make execsp_ctor a constructor. */
 *************** END(execsp_ctor)
 *** 82,97 ****
    *	been initialized.
    */
   ENTRY(main)
 ! 0:	GOT_INIT(r0, .Lgot.main)
   	mov	r1, sp
 ! 	GOT_GET(r2, r0, .Lmainsp)
   	str	r1, [r2]
   	mov	r0, #0
   	RET
   
 ! 	GOT_INITSYM(.Lgot.main, 0b)
   .Lmainsp:
 ! 	.word	GOT_SYM(mainsp)
   END(main)
   
   /*
 --- 86,103 ----
    *	been initialized.
    */
   ENTRY(main)
 ! 0:	PIC_GOT_INIT(r0, .Lgot.main)
   	mov	r1, sp
 ! 	MOV_GLOBAL(r2, r0, .Lmainsp)
   	str	r1, [r2]
   	mov	r0, #0
   	RET
   
 ! 	.p2align 2
 ! .Lgot.main:
 ! 	PIC_GOT_INITREF(0b)
   .Lmainsp:
 ! 	.word	GLOBAL_SYMREF(mainsp)
   END(main)
   
   /*
 *************** END(main)
 *** 102,116 ****
    *	back to the t_signal_and_sp parent.
    */
   ENTRY(execsp_dtor)
 ! 0:	GOT_INIT(r0, .Lgot.execsp_dtor)
   	mov	r1, sp
 ! 	GOT_GET(r2, r0, .Ldtorsp)
   	str	r1, [r2]
   	b	PLT_SYM(_C_LABEL(execsp_main))
   
 ! 	GOT_INITSYM(.Lgot.execsp_dtor, 0b)
   .Ldtorsp:
 ! 	.word	GOT_SYM(dtorsp)
   END(execsp_dtor)
   
   	/* Make execsp_ctor a destructor. */
 --- 108,124 ----
    *	back to the t_signal_and_sp parent.
    */
   ENTRY(execsp_dtor)
 ! 0:	PIC_GOT_INIT(r0, .Lgot.execsp_dtor)
   	mov	r1, sp
 ! 	MOV_GLOBAL(r2, r0, .Ldtorsp)
   	str	r1, [r2]
   	b	PLT_SYM(_C_LABEL(execsp_main))
   
 ! 	.p2align 2
 ! .Lgot.execsp_dtor:
 ! 	PIC_GOT_INITREF(0b)
   .Ldtorsp:
 ! 	.word	GLOBAL_SYMREF(dtorsp)
   END(execsp_dtor)
   
   	/* Make execsp_ctor a destructor. */
 Index: tests/kernel/arch/arm/signalsphandler.S
 ===================================================================
 RCS file: /cvsroot/src/tests/kernel/arch/arm/signalsphandler.S,v
 retrieving revision 1.3
 diff -u -p -c -r1.3 signalsphandler.S
 *** tests/kernel/arch/arm/signalsphandler.S	7 May 2025 16:26:47 -0000	1.3
 --- tests/kernel/arch/arm/signalsphandler.S	8 May 2025 00:32:22 -0000
 *************** RCSID("$NetBSD: signalsphandler.S,v 1.3 
 *** 39,51 ****
    *	variable signalsp and return.
    */
   ENTRY(signalsphandler)
 ! 0:	GOT_INIT(r0, .Lgot)
   	mov	r1, sp
 ! 	GOT_GET(r2, r0, .Lsignalsp)
   	str	r1, [r2]
   	RET
   
 ! 	GOT_INITSYM(.Lgot, 0b)
   .Lsignalsp:
 ! 	.word	GOT_SYM(signalsp)
   END(signalsphandler)
 --- 39,52 ----
    *	variable signalsp and return.
    */
   ENTRY(signalsphandler)
 ! 0:	PIC_GOT_INIT(r0, .Lgot)
   	mov	r1, sp
 ! 	MOV_GLOBAL(r2, r0, .Lsignalsp)
   	str	r1, [r2]
   	RET
   
 ! 	.p2align 2
 ! .Lgot:	PIC_GOT_INITREF(0b)
   .Lsignalsp:
 ! 	.word	GLOBAL_SYMREF(signalsp)
   END(signalsphandler)
 Index: lib/libc/arch/arm/gen/_setjmp.S
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/arm/gen/_setjmp.S,v
 retrieving revision 1.20
 diff -u -p -c -r1.20 _setjmp.S
 *** lib/libc/arch/arm/gen/_setjmp.S	8 May 2025 00:28:31 -0000	1.20
 --- lib/libc/arch/arm/gen/_setjmp.S	8 May 2025 00:32:22 -0000
 *************** ENTRY(_setjmp)
 *** 60,71 ****
   	ldr	r1, .L_setjmp_magic
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	ldr	r2, .Lfpu_present
 ! #ifdef __PIC__
 ! 	add	r2, r2, pc	/* pc = &.LPIC0 */
 ! #endif
   	ldr	r2, [r2]
 - .LPIC0:
   #if defined(__thumb__) && defined(_ARM_ARCH_T2)
   	cbz	r2, 1f
   #else
 --- 60,67 ----
   	ldr	r1, .L_setjmp_magic
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 0:	MOV_PROTECTED(r2, .Lfpu_present)
   	ldr	r2, [r2]
   #if defined(__thumb__) && defined(_ARM_ARCH_T2)
   	cbz	r2, 1f
   #else
 *************** ENTRY(_setjmp)
 *** 106,114 ****
   	RET
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	.align	0
   .Lfpu_present:
 ! 	.word	REL_SYM(_libc_arm_fpu_present, .LPIC0)
   #endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
   END(_setjmp)
   
 --- 102,110 ----
   	RET
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	.p2align 2
   .Lfpu_present:
 ! 	.word	PROTECTED_SYMREF(_C_LABEL(_libc_arm_fpu_present), 0b)
   #endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
   END(_setjmp)
   
 Index: lib/libc/arch/arm/gen/setjmp.S
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/arm/gen/setjmp.S,v
 retrieving revision 1.22
 diff -u -p -c -r1.22 setjmp.S
 *** lib/libc/arch/arm/gen/setjmp.S	8 May 2025 00:28:31 -0000	1.22
 --- lib/libc/arch/arm/gen/setjmp.S	8 May 2025 00:32:22 -0000
 *************** ENTRY(__setjmp14)
 *** 75,86 ****
   	ldr	r1, .Lsetjmp_magic
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	ldr	r2, .Lfpu_present
 ! #ifdef __PIC__
 ! 	add	r2, r2, pc	/* pc = &.LPIC0 */
 ! #endif
   	ldr	r2, [r2]
 - .LPIC0:
   #if defined(__thumb__) && defined(_ARM_ARCH_T2)
   	cbz	r2, 1f		/* don't save if we don't have a FPU */
   #else
 --- 75,82 ----
   	ldr	r1, .Lsetjmp_magic
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 0:	MOV_PROTECTED(r2, .Lfpu_present)
   	ldr	r2, [r2]
   #if defined(__thumb__) && defined(_ARM_ARCH_T2)
   	cbz	r2, 1f		/* don't save if we don't have a FPU */
   #else
 *************** ENTRY(__setjmp14)
 *** 120,128 ****
   	RET
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	.align	0
   .Lfpu_present:
 ! 	.word	REL_SYM(_libc_arm_fpu_present, .LPIC0)
   #endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
   END(__setjmp14)
   
 --- 116,124 ----
   	RET
   
   #if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
 ! 	.p2align 2
   .Lfpu_present:
 ! 	.word	PROTECTED_SYMREF(_C_LABEL(_libc_arm_fpu_present), 0b)
   #endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
   END(__setjmp14)
   
 Index: lib/libc/arch/arm/sys/cerror.S
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/arm/sys/cerror.S,v
 retrieving revision 1.18
 diff -u -p -c -r1.18 cerror.S
 *** lib/libc/arch/arm/sys/cerror.S	7 May 2025 16:26:47 -0000	1.18
 --- lib/libc/arch/arm/sys/cerror.S	8 May 2025 00:32:22 -0000
 *************** ENTRY_NP(CERROR)
 *** 82,92 ****
   	.fnstart
   	.cfi_startproc
   #endif
 ! 0:	GOT_INIT(r3, .Lgot)
 ! 	ldr	r1, .Lerrno
 ! #ifdef __PIC__
 ! 	ldr	r1, [r3, r1]
 ! #endif /* __PIC__ */
   	str	r0, [r1]
   	MOV_RETVAL_MINUS_1
   	RET
 --- 82,89 ----
   	.fnstart
   	.cfi_startproc
   #endif
 ! 0:	PIC_GOT_INIT(r3, .Lgot)
 ! 	MOV_GLOBAL(r1, r3, .Lerrno)
   	str	r0, [r1]
   	MOV_RETVAL_MINUS_1
   	RET
 *************** ENTRY_NP(CERROR)
 *** 94,102 ****
   	.cfi_endproc
   	.fnend
   #endif
 ! 
 ! 	GOT_INITSYM(.Lgot, 0b)
   .Lerrno:
 ! 	.word	GOT_SYM(_C_LABEL(errno))
   #endif /* _REENTRANT */
   END(CERROR)
 --- 91,99 ----
   	.cfi_endproc
   	.fnend
   #endif
 ! 	.p2align 2
 ! .Lgot:	PIC_GOT_INITREF(0b)
   .Lerrno:
 ! 	.word	GLOBAL_SYMREF(_C_LABEL(errno))
   #endif /* _REENTRANT */
   END(CERROR)
 Index: lib/libc/arch/arm/sys/ptrace.S
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/arm/sys/ptrace.S,v
 retrieving revision 1.14
 diff -u -p -c -r1.14 ptrace.S
 *** lib/libc/arch/arm/sys/ptrace.S	6 May 2025 20:21:33 -0000	1.14
 --- lib/libc/arch/arm/sys/ptrace.S	8 May 2025 00:32:22 -0000
 ***************
 *** 35,40 ****
 --- 35,43 ----
   
   ENTRY(ptrace)
   #ifdef _REENTRANT
 + 	/* __errno() returns the address of a thread local variable */
 + 	.globl	_C_LABEL(__errno)
 + 
   #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
   	push	{r0-r3, lr}
   #else
 *************** ENTRY(ptrace)
 *** 52,69 ****
   	mov	lr, r4
   	pop	{r0-r4}
   #endif
 ! #else
   	push	{r0, r1}
 ! #ifdef __PIC__
 ! 	/* Setup the GOT */
 ! 	ldr	r0, .Lgot
 ! 	adr	r1, .Lgot
 ! 	add	r0, r0, r1
 ! 	ldr	r1, .Lerrno
 ! 	ldr	r1, [r0, r1]
 ! #else
 ! 	ldr	r1, .Lerrno
 ! #endif /* __PIC__ */
   	movs	r0, #0
   	str	r0, [r1]
   	pop	{r0, r1}
 --- 55,68 ----
   	mov	lr, r4
   	pop	{r0-r4}
   #endif
 ! 
 ! #else /* !_REENTRANT */
 ! 	/* errno is a global variable */
 ! 	.globl	_C_LABEL(errno)
 ! 
   	push	{r0, r1}
 ! 0:	PIC_GOT_INIT(r0, .Lgot)
 ! 	MOV_GLOBAL(r1, r0, .Lerrno)
   	movs	r0, #0
   	str	r0, [r1]
   	pop	{r0, r1}
 *************** ENTRY(ptrace)
 *** 74,86 ****
   	RET
   
   #ifndef _REENTRANT
 ! #ifdef __PIC__
 ! 	.align	0
 ! .Lgot:
 ! 	.word	_C_LABEL(_GLOBAL_OFFSET_TABLE_) - .Lgot
 ! #endif /* __PIC__ */
 ! 
   .Lerrno:
 ! 	.word	PIC_SYM(_C_LABEL(errno), GOT)
   #endif /* !_REENTRANT */
   END(ptrace)
 --- 73,81 ----
   	RET
   
   #ifndef _REENTRANT
 ! 	.p2align 2
 ! .Lgot:	PIC_GOT_INITREF(0b)
   .Lerrno:
 ! 	.word	GLOBAL_SYMREF(_C_LABEL(errno))
   #endif /* !_REENTRANT */
   END(ptrace)
 Index: lib/libc/arch/arm/sys/sbrk.S
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/arm/sys/sbrk.S,v
 retrieving revision 1.14
 diff -u -p -c -r1.14 sbrk.S
 *** lib/libc/arch/arm/sys/sbrk.S	6 May 2025 20:21:34 -0000	1.14
 --- lib/libc/arch/arm/sys/sbrk.S	8 May 2025 00:32:22 -0000
 *************** _C_LABEL(__curbrk):
 *** 51,67 ****
    * Change the data segment size
    */
   ENTRY(_sbrk)
 ! 	/* get address or offset to __curbrk */
 ! 	ldr	r2, .Lcurbrk
 ! #ifdef __PIC__
 ! 	add	r2, r2, pc	/* pc = &.LPIC0 */
 ! #endif
   
   	/* Get the current brk address */
   	ldr	r1, [r2]
   
   	/* Calculate new value */
 ! .LPIC0:	mov	r3, r0
   	adds	r0, r0, r1
   	SYSTRAP(break)
   	_INVOKE_CERROR()
 --- 51,64 ----
    * Change the data segment size
    */
   ENTRY(_sbrk)
 ! 	/* Get address of __curbrk */
 ! 1:	MOV_PROTECTED(r2, .Lcurbrk)
   
   	/* Get the current brk address */
   	ldr	r1, [r2]
   
   	/* Calculate new value */
 ! 	mov	r3, r0
   	adds	r0, r0, r1
   	SYSTRAP(break)
   	_INVOKE_CERROR()
 *************** ENTRY(_sbrk)
 *** 74,80 ****
   	/* Return old curbrk value */
   	RET
   
 ! 	.align	0
   .Lcurbrk:
 ! 	.word	REL_SYM(_C_LABEL(__curbrk), .LPIC0)
   END(_sbrk)
 --- 71,77 ----
   	/* Return old curbrk value */
   	RET
   
 ! 	.p2align 2
   .Lcurbrk:
 ! 	.word	PROTECTED_SYMREF(_C_LABEL(__curbrk), 1b)
   END(_sbrk)
 
 -uwe
 


Home | Main Index | Thread Index | Old Index