mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-28 16:43:09 +00:00
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:
parent
77c0749cb2
commit
a8599e090f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=240152
@ -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 */
|
||||
|
@ -63,7 +63,6 @@ FBSDprivate_1.0 {
|
||||
__sys_vfork;
|
||||
_vfork;
|
||||
_end;
|
||||
.cerror;
|
||||
_brk;
|
||||
.curbrk;
|
||||
.minbrk;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user