svn commit: trunk/uClibc/libc/sysdeps/linux/i386

vda at uclibc.org vda at uclibc.org
Fri Dec 12 23:34:42 UTC 2008


Author: vda
Date: 2008-12-12 15:34:42 -0800 (Fri, 12 Dec 2008)
New Revision: 24397

Log:
i386/brk.c: gcc can't figure out how to use %ebx in PIC mode,
 help it. Code size is the same.



Modified:
   trunk/uClibc/libc/sysdeps/linux/i386/brk.c


Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/i386/brk.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/i386/brk.c	2008-12-12 15:21:51 UTC (rev 24396)
+++ trunk/uClibc/libc/sysdeps/linux/i386/brk.c	2008-12-12 23:34:42 UTC (rev 24397)
@@ -25,14 +25,19 @@
 void *__curbrk attribute_hidden = 0;
 
 /* libc_hidden_proto(brk) */
-int brk (void *addr)
+int brk(void *addr)
 {
-	void *newbrk, *ebx;
+	void *newbrk;
 
-	__asm__ (
-		"int $0x80\n"
-		: "=a" (newbrk), "=b" (ebx)
-		: "0" (__NR_brk), "1" (addr)
+	/* %ebx is used in PIC code, need to save/restore it manually.
+	 * gcc won't do it for us if we will request it in constraints
+	 */
+	__asm__("pushl	%%ebx\n"
+		"movl	%2, %%ebx\n"
+		"int	$0x80\n"
+		"popl	%%ebx\n"
+		: "=a" (newbrk)
+		: "0" (__NR_brk), "g" (addr)
 	);
 
 	__curbrk = newbrk;




More information about the uClibc-cvs mailing list