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
This commit is contained in:
Jilles Tjoelker 2012-09-05 21:41:05 +00:00
parent 77c0749cb2
commit a8599e090f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=240152
11 changed files with 19 additions and 41 deletions

View File

@ -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 */

View File

@ -63,7 +63,6 @@ FBSDprivate_1.0 {
__sys_vfork;
_vfork;
_end;
.cerror;
_brk;
.curbrk;
.minbrk;

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -48,13 +48,14 @@ __FBSDID("$FreeBSD$");
.globl CNAME(__error)
.type CNAME(__error),@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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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