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),@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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to