svn commit: r240152 - in head/lib/libc/i386: . gen sys
Jilles Tjoelker
jilles at FreeBSD.org
Wed Sep 5 21:41:06 UTC 2012
Author: jilles
Date: Wed Sep 5 21:41:05 2012
New Revision: 240152
URL: http://svn.freebsd.org/changeset/base/240152
Log:
libc/i386: Do not export .cerror.
For some reason, libc exports the symbol .cerror (HIDENAME(cerror)), albeit
in the FBSDprivate_1.0 version. It looks like there is no reason for this
since it is not used from other libraries. Given that it cannot be accessed
from C and its strange calling convention, it is rather unlikely that other
things rely on it. Perhaps it is from a time when symbols could not be
hidden.
Not exporting .cerror causes it to be jumped to directly instead of via the
PLT.
This change also takes advantage of .cerror's new status by not saving and
loading %ebx before jumping to it. (Therefore, .cerror now saves and loads
%ebx itself.) Where there was a conditional jump to a jump to .cerror, the
conditional jump has been changed to jump to .cerror directly (many modern
CPUs don't do static prediction and in any case it is not much of a benefit
anyway).
This change makes libc.so.7 a few kilobytes smaller.
Reviewed by: kib
Modified:
head/lib/libc/i386/SYS.h
head/lib/libc/i386/Symbol.map
head/lib/libc/i386/gen/rfork_thread.S
head/lib/libc/i386/sys/Ovfork.S
head/lib/libc/i386/sys/brk.S
head/lib/libc/i386/sys/cerror.S
head/lib/libc/i386/sys/exect.S
head/lib/libc/i386/sys/getcontext.S
head/lib/libc/i386/sys/ptrace.S
head/lib/libc/i386/sys/sbrk.S
head/lib/libc/i386/sys/syscall.S
Modified: head/lib/libc/i386/SYS.h
==============================================================================
--- head/lib/libc/i386/SYS.h Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/SYS.h Wed Sep 5 21:41:05 2012 (r240152)
@@ -36,21 +36,21 @@
#include <sys/syscall.h>
#include <machine/asm.h>
-#define SYSCALL(x) 2: PIC_PROLOGUE; jmp PIC_PLT(HIDENAME(cerror)); \
- ENTRY(__CONCAT(__sys_,x)); \
+#define SYSCALL(x) ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(x); \
.set CNAME(x),CNAME(__CONCAT(__sys_,x)); \
.weak CNAME(__CONCAT(_,x)); \
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
- mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b
+ mov __CONCAT($SYS_,x),%eax; KERNCALL; \
+ jb HIDENAME(cerror)
#define RSYSCALL(x) SYSCALL(x); ret; END(__CONCAT(__sys_,x))
-#define PSEUDO(x) 2: PIC_PROLOGUE; jmp PIC_PLT(HIDENAME(cerror)); \
- ENTRY(__CONCAT(__sys_,x)); \
+#define PSEUDO(x) ENTRY(__CONCAT(__sys_,x)); \
.weak CNAME(__CONCAT(_,x)); \
.set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
- mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b; ret; \
+ mov __CONCAT($SYS_,x),%eax; KERNCALL; \
+ jb HIDENAME(cerror); ret; \
END(__CONCAT(__sys_,x))
/* gas messes up offset -- although we don't currently need it, do for BCS */
Modified: head/lib/libc/i386/Symbol.map
==============================================================================
--- head/lib/libc/i386/Symbol.map Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/Symbol.map Wed Sep 5 21:41:05 2012 (r240152)
@@ -63,7 +63,6 @@ FBSDprivate_1.0 {
__sys_vfork;
_vfork;
_end;
- .cerror;
_brk;
.curbrk;
.minbrk;
Modified: head/lib/libc/i386/gen/rfork_thread.S
==============================================================================
--- head/lib/libc/i386/gen/rfork_thread.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/gen/rfork_thread.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -113,8 +113,7 @@ ENTRY(rfork_thread)
popl %esi
movl %ebp, %esp
popl %ebp
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
+ jmp HIDENAME(cerror)
END(rfork_thread)
.section .note.GNU-stack,"",%progbits
Modified: head/lib/libc/i386/sys/Ovfork.S
==============================================================================
--- head/lib/libc/i386/sys/Ovfork.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/Ovfork.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -50,8 +50,7 @@ ENTRY(__sys_vfork)
jmp *%ecx
1:
pushl %ecx
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
+ jmp HIDENAME(cerror)
END(__sys_vfork)
.section .note.GNU-stack,"",%progbits
Modified: head/lib/libc/i386/sys/brk.S
==============================================================================
--- head/lib/libc/i386/sys/brk.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/brk.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -58,14 +58,11 @@ ENTRY(brk)
ok:
mov $SYS_break,%eax
KERNCALL
- jb err
+ jb HIDENAME(cerror)
movl 4(%esp),%eax
movl %eax,(%edx)
movl $0,%eax
ret
-err:
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
#else
@@ -77,13 +74,11 @@ err:
ok:
mov $SYS_break,%eax
KERNCALL
- jb err
+ jb HIDENAME(cerror)
movl 4(%esp),%eax
movl %eax,HIDENAME(curbrk)
movl $0,%eax
ret
-err:
- jmp HIDENAME(cerror)
#endif
END(brk)
Modified: head/lib/libc/i386/sys/cerror.S
==============================================================================
--- head/lib/libc/i386/sys/cerror.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/cerror.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -48,13 +48,14 @@ __FBSDID("$FreeBSD$");
.globl CNAME(__error)
.type CNAME(__error), at function
HIDENAME(cerror):
- pushl %eax
#ifdef PIC
- /* The caller must execute the PIC prologue before jumping to cerror. */
+ PIC_PROLOGUE
+ pushl %eax
call PIC_PLT(CNAME(__error))
popl %ecx
PIC_EPILOGUE
#else
+ pushl %eax
call CNAME(__error)
popl %ecx
#endif
Modified: head/lib/libc/i386/sys/exect.S
==============================================================================
--- head/lib/libc/i386/sys/exect.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/exect.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -47,8 +47,7 @@ ENTRY(exect)
pushl %edx
popf
KERNCALL
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror)) /* exect(file, argv, env); */
+ jmp HIDENAME(cerror) /* exect(file, argv, env); */
END(exect)
.section .note.GNU-stack,"",%progbits
Modified: head/lib/libc/i386/sys/getcontext.S
==============================================================================
--- head/lib/libc/i386/sys/getcontext.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/getcontext.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -42,12 +42,9 @@ ENTRY(__sys_getcontext)
movl (%esp),%ecx /* save getcontext return address */
mov $SYS_getcontext,%eax
KERNCALL
- jb 1f
+ jb HIDENAME(cerror)
addl $4,%esp /* remove stale (setcontext) return address */
jmp *%ecx /* restore return address */
-1:
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
END(__sys_getcontext)
.section .note.GNU-stack,"",%progbits
Modified: head/lib/libc/i386/sys/ptrace.S
==============================================================================
--- head/lib/libc/i386/sys/ptrace.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/ptrace.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -50,11 +50,8 @@ ENTRY(ptrace)
#endif
mov $SYS_ptrace,%eax
KERNCALL
- jb err
+ jb HIDENAME(cerror)
ret
-err:
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
END(ptrace)
.section .note.GNU-stack,"",%progbits
Modified: head/lib/libc/i386/sys/sbrk.S
==============================================================================
--- head/lib/libc/i386/sys/sbrk.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/sbrk.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -59,7 +59,7 @@ ENTRY(sbrk)
addl %eax,4(%esp)
mov $SYS_break,%eax
KERNCALL
- jb err
+ jb HIDENAME(cerror)
PIC_PROLOGUE
movl PIC_GOT(HIDENAME(curbrk)),%edx
movl (%edx),%eax
@@ -67,9 +67,6 @@ ENTRY(sbrk)
PIC_EPILOGUE
back:
ret
-err:
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
#else /* !PIC */
@@ -80,13 +77,11 @@ err:
addl %eax,4(%esp)
mov $SYS_break,%eax
KERNCALL
- jb err
+ jb HIDENAME(cerror)
movl HIDENAME(curbrk),%eax
addl %ecx,HIDENAME(curbrk)
back:
ret
-err:
- jmp HIDENAME(cerror)
#endif /* PIC */
END(sbrk)
Modified: head/lib/libc/i386/sys/syscall.S
==============================================================================
--- head/lib/libc/i386/sys/syscall.S Wed Sep 5 20:40:11 2012 (r240151)
+++ head/lib/libc/i386/sys/syscall.S Wed Sep 5 21:41:05 2012 (r240152)
@@ -45,11 +45,8 @@ ENTRY(syscall)
KERNCALL
push %ecx /* need to push a word to keep stack frame intact
upon return; the word must be the return address. */
- jb 1f
+ jb HIDENAME(cerror)
ret
-1:
- PIC_PROLOGUE
- jmp PIC_PLT(HIDENAME(cerror))
END(syscall)
.section .note.GNU-stack,"",%progbits
More information about the svn-src-head
mailing list