summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2012-09-05 21:41:05 +0000
committerjilles <jilles@FreeBSD.org>2012-09-05 21:41:05 +0000
commita78b4512de2417c42cb715e4a9749dac0db57870 (patch)
treeab6fbc2386bbf370c267af773fea5b1552266781 /lib
parent4076c29bf70fb2f37d9ad4355d79bf316addf0ba (diff)
downloadFreeBSD-src-a78b4512de2417c42cb715e4a9749dac0db57870.zip
FreeBSD-src-a78b4512de2417c42cb715e4a9749dac0db57870.tar.gz
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
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/i386/SYS.h12
-rw-r--r--lib/libc/i386/Symbol.map1
-rw-r--r--lib/libc/i386/gen/rfork_thread.S3
-rw-r--r--lib/libc/i386/sys/Ovfork.S3
-rw-r--r--lib/libc/i386/sys/brk.S9
-rw-r--r--lib/libc/i386/sys/cerror.S5
-rw-r--r--lib/libc/i386/sys/exect.S3
-rw-r--r--lib/libc/i386/sys/getcontext.S5
-rw-r--r--lib/libc/i386/sys/ptrace.S5
-rw-r--r--lib/libc/i386/sys/sbrk.S9
-rw-r--r--lib/libc/i386/sys/syscall.S5
11 files changed, 19 insertions, 41 deletions
diff --git a/lib/libc/i386/SYS.h b/lib/libc/i386/SYS.h
index a4a147a..355b117 100644
--- a/lib/libc/i386/SYS.h
+++ b/lib/libc/i386/SYS.h
@@ -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 */
diff --git a/lib/libc/i386/Symbol.map b/lib/libc/i386/Symbol.map
index 8a01802..78be4c4 100644
--- a/lib/libc/i386/Symbol.map
+++ b/lib/libc/i386/Symbol.map
@@ -63,7 +63,6 @@ FBSDprivate_1.0 {
__sys_vfork;
_vfork;
_end;
- .cerror;
_brk;
.curbrk;
.minbrk;
diff --git a/lib/libc/i386/gen/rfork_thread.S b/lib/libc/i386/gen/rfork_thread.S
index 3333d84..1f8181d 100644
--- a/lib/libc/i386/gen/rfork_thread.S
+++ b/lib/libc/i386/gen/rfork_thread.S
@@ -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
diff --git a/lib/libc/i386/sys/Ovfork.S b/lib/libc/i386/sys/Ovfork.S
index e3cc45d..3ef7169 100644
--- a/lib/libc/i386/sys/Ovfork.S
+++ b/lib/libc/i386/sys/Ovfork.S
@@ -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
diff --git a/lib/libc/i386/sys/brk.S b/lib/libc/i386/sys/brk.S
index 968e437..8a465d2 100644
--- a/lib/libc/i386/sys/brk.S
+++ b/lib/libc/i386/sys/brk.S
@@ -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)
diff --git a/lib/libc/i386/sys/cerror.S b/lib/libc/i386/sys/cerror.S
index 129cc1b..ad3a033 100644
--- a/lib/libc/i386/sys/cerror.S
+++ b/lib/libc/i386/sys/cerror.S
@@ -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
diff --git a/lib/libc/i386/sys/exect.S b/lib/libc/i386/sys/exect.S
index 3ae87b8..1378b4b 100644
--- a/lib/libc/i386/sys/exect.S
+++ b/lib/libc/i386/sys/exect.S
@@ -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
diff --git a/lib/libc/i386/sys/getcontext.S b/lib/libc/i386/sys/getcontext.S
index c24dbdc..7114689 100644
--- a/lib/libc/i386/sys/getcontext.S
+++ b/lib/libc/i386/sys/getcontext.S
@@ -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
diff --git a/lib/libc/i386/sys/ptrace.S b/lib/libc/i386/sys/ptrace.S
index 6e5e885..e4bdf7c 100644
--- a/lib/libc/i386/sys/ptrace.S
+++ b/lib/libc/i386/sys/ptrace.S
@@ -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
diff --git a/lib/libc/i386/sys/sbrk.S b/lib/libc/i386/sys/sbrk.S
index 337087a..99fc220 100644
--- a/lib/libc/i386/sys/sbrk.S
+++ b/lib/libc/i386/sys/sbrk.S
@@ -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)
diff --git a/lib/libc/i386/sys/syscall.S b/lib/libc/i386/sys/syscall.S
index e5d6e23..8a08631 100644
--- a/lib/libc/i386/sys/syscall.S
+++ b/lib/libc/i386/sys/syscall.S
@@ -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
OpenPOWER on IntegriCloud