libc: Access _logname_valid more efficiently.

The variable _logname_valid is not exported via the version script;
therefore, change C and i386/amd64 assembler code to remove indirection
(which allowed interposition). This makes the code slightly smaller and
faster.

Also, remove #define PIC_GOT from i386/amd64 in !PIC mode. Without PIC,
there is no place containing the address of each variable, so there is no
possible definition for PIC_GOT.
This commit is contained in:
Jilles Tjoelker 2013-08-17 19:24:58 +00:00
parent a678ca234f
commit 0f3a4d8051
5 changed files with 4 additions and 16 deletions

View File

@ -48,12 +48,7 @@ ENTRY(__sys_setlogin)
mov $SYS_setlogin,%rax
KERNCALL
jb HIDENAME(cerror)
#ifdef PIC
movq PIC_GOT(CNAME(_logname_valid)),%rdx
movl $0,(%rdx)
#else
movl $0,CNAME(_logname_valid)(%rip)
#endif
ret /* setlogin(name) */
END(__sys_setlogin)

View File

@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$");
extern int _getlogin(char *, int);
int _logname_valid; /* known to setlogin() */
int _logname_valid __hidden; /* known to setlogin() */
static pthread_mutex_t logname_mutex = PTHREAD_MUTEX_INITIALIZER;
static char *

View File

@ -41,16 +41,9 @@ __FBSDID("$FreeBSD$");
.globl CNAME(_logname_valid) /* in _getlogin() */
SYSCALL(setlogin)
#ifdef PIC
PIC_PROLOGUE
pushl %eax
movl PIC_GOT(CNAME(_logname_valid)),%eax
movl $0,(%eax)
popl %eax
movl $0,PIC_GOTOFF(CNAME(_logname_valid))
PIC_EPILOGUE
#else
movl $0,CNAME(_logname_valid)
#endif
ret /* setlogin(name) */
END(__sys_setlogin)

View File

@ -43,7 +43,6 @@
#define PIC_GOT(x) x@GOTPCREL(%rip)
#else
#define PIC_PLT(x) x
#define PIC_GOT(x) x
#endif
/*

View File

@ -49,11 +49,12 @@
popl %ebx
#define PIC_PLT(x) x@PLT
#define PIC_GOT(x) x@GOT(%ebx)
#define PIC_GOTOFF(x) x@GOTOFF(%ebx)
#else
#define PIC_PROLOGUE
#define PIC_EPILOGUE
#define PIC_PLT(x) x
#define PIC_GOT(x) x
#define PIC_GOTOFF(x) x
#endif
/*