References to hidden symbols don't need to use the PLT. It looks like ld is smart enough to optimize them out, but it's clearer to not generate the PLT reference: replace "PIC_SYM(_libc_foo, PLT)" with "_libc_foo" in longjmp, __modsi3, setjmp, and longjmp.
More usefully, by referencing the internal names, we can avoid PLT entries for a number of internal functions: - __errno (referenced by ___cerror) - _memcpy (referenced by bcopy, memcpy, and memmove) - memset (reference by bzero) - setjmp, _setjmp (referenced by sigsetjmp) - longjmp, _longjmp (referenced by siglongjmp) _memcpy could itself be hidden, but now is not the time to remove a symbol from the ABI. While here, split out arm/DEFS.h from arm/SYS.h like on some other archs, so we can use _HIDDEN, END_STRONG, and END_WEAK without pulling in all of the SYS.h stuff. ok? Philip Guenther Index: lib/libc/arch/arm/DEFS.h =================================================================== RCS file: lib/libc/arch/arm/DEFS.h diff -N lib/libc/arch/arm/DEFS.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/libc/arch/arm/DEFS.h 18 Jul 2016 13:32:23 -0000 @@ -0,0 +1,40 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2016 Philip Guenther <[email protected]> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <machine/asm.h> + +/* + * We define a hidden alias with the prefix "_libc_" for each global symbol + * that may be used internally. By referencing _libc_x instead of x, other + * parts of libc prevent overriding by the application and avoid unnecessary + * relocations. + */ +#define _HIDDEN(x) _libc_##x +#define _HIDDEN_ALIAS(x,y) \ + STRONG_ALIAS(_HIDDEN(x),y); \ + .hidden _HIDDEN(x) +#define _HIDDEN_FALIAS(x,y) \ + _HIDDEN_ALIAS(x,y); \ + .type _HIDDEN(x),#function + +/* + * For functions implemented in ASM that aren't syscalls. + * END_STRONG(x) Like DEF_STRONG() in C; for standard/reserved C names + * END_WEAK(x) Like DEF_WEAK() in C; for non-ISO C names + */ +#define END_STRONG(x) END(x); _HIDDEN_FALIAS(x,x); END(_HIDDEN(x)) +#define END_WEAK(x) END_STRONG(x); .weak x Index: lib/libc/arch/arm/SYS.h =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/SYS.h,v retrieving revision 1.15 diff -u -p -r1.15 SYS.h --- lib/libc/arch/arm/SYS.h 7 May 2016 19:05:21 -0000 1.15 +++ lib/libc/arch/arm/SYS.h 18 Jul 2016 13:32:39 -0000 @@ -35,31 +35,8 @@ * from: @(#)SYS.h 5.5 (Berkeley) 5/7/91 */ -#include <machine/asm.h> +#include "DEFS.h" #include <sys/syscall.h> - - -/* - * We define a hidden alias with the prefix "_libc_" for each global symbol - * that may be used internally. By referencing _libc_x instead of x, other - * parts of libc prevent overriding by the application and avoid unnecessary - * relocations. - */ -#define _HIDDEN(x) _libc_##x -#define _HIDDEN_ALIAS(x,y) \ - STRONG_ALIAS(_HIDDEN(x),y); \ - .hidden _HIDDEN(x) -#define _HIDDEN_FALIAS(x,y) \ - _HIDDEN_ALIAS(x,y); \ - .type _HIDDEN(x),#function - -/* - * For functions implemented in ASM that aren't syscalls. - * END_STRONG(x) Like DEF_STRONG() in C; for standard/reserved C names - * END_WEAK(x) Like DEF_WEAK() in C; for non-ISO C names - */ -#define END_STRONG(x) END(x); _HIDDEN_FALIAS(x,x); END(_HIDDEN(x)) -#define END_WEAK(x) END_STRONG(x); .weak x #define SYSENTRY(x) \ Index: lib/libc/arch/arm/gen/_setjmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/gen/_setjmp.S,v retrieving revision 1.3 diff -u -p -r1.3 _setjmp.S --- lib/libc/arch/arm/gen/_setjmp.S 23 May 2016 00:18:57 -0000 1.3 +++ lib/libc/arch/arm/gen/_setjmp.S 18 Jul 2016 13:35:01 -0000 @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ -#include <machine/asm.h> +#include "DEFS.h" #include <machine/setjmp.h> /* @@ -69,6 +69,7 @@ ENTRY(_setjmp) .L_setjmp_magic: .word _JB_MAGIC__SETJMP +END_STRONG(_setjmp) ENTRY(_longjmp) ldr r2, .L_setjmp_magic @@ -101,5 +102,6 @@ ENTRY(_longjmp) /* validation failed, die die die. */ botch: - bl PIC_SYM(_libc_abort, PLT) + bl _HIDDEN(abort) b . - 8 /* Cannot get here */ +END_STRONG(_longjmp) Index: lib/libc/arch/arm/gen/divsi3.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/gen/divsi3.S,v retrieving revision 1.2 diff -u -p -r1.2 divsi3.S --- lib/libc/arch/arm/gen/divsi3.S 1 Feb 2004 05:40:52 -0000 1.2 +++ lib/libc/arch/arm/gen/divsi3.S 18 Jul 2016 13:34:56 -0000 @@ -15,7 +15,7 @@ * SUCH DAMAGE. */ -#include <machine/asm.h> +#include "DEFS.h" /* * stack is aligned as there's a possibility of branching to .L_overflow @@ -41,7 +41,7 @@ ENTRY(__modsi3) .L_overflow: #if !defined(_KERNEL) && !defined(_STANDALONE) mov r0, #8 /* SIGFPE */ - bl PIC_SYM(_C_LABEL(raise), PLT) /* raise it */ + bl _HIDDEN(raise) /* raise it */ mov r0, #0 #else /* XXX should cause a fatal error */ Index: lib/libc/arch/arm/gen/setjmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/gen/setjmp.S,v retrieving revision 1.4 diff -u -p -r1.4 setjmp.S --- lib/libc/arch/arm/gen/setjmp.S 23 May 2016 00:18:57 -0000 1.4 +++ lib/libc/arch/arm/gen/setjmp.S 18 Jul 2016 13:35:15 -0000 @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ -#include <machine/asm.h> +#include "DEFS.h" #include <machine/setjmp.h> /* @@ -51,7 +51,7 @@ ENTRY(setjmp) stmfd sp!, {r0, r14} mov r0, #0x00000000 - bl PIC_SYM(_C_LABEL(_libc_sigblock), PLT) + bl _HIDDEN(sigblock) mov r1, r0 ldmfd sp!, {r0, r14} @@ -78,6 +78,7 @@ ENTRY(setjmp) .Lsetjmp_magic: .word _JB_MAGIC_SETJMP +END_STRONG(setjmp) ENTRY(longjmp) @@ -94,7 +95,7 @@ ENTRY(longjmp) sub sp, sp, #4 /* align the stack */ mov r0, r2 - bl PIC_SYM(_C_LABEL(_libc_sigsetmask), PLT) + bl _HIDDEN(sigsetmask) add sp, sp, #4 /* unalign the stack */ ldmfd sp!, {r0, r1, r14} @@ -130,5 +131,6 @@ ENTRY(longjmp) /* validation failed, die die die. */ botch: - bl PIC_SYM(_libc_abort, PLT) + bl _HIDDEN(abort) b . - 8 /* Cannot get here */ +END_STRONG(longjmp) Index: lib/libc/arch/arm/gen/sigsetjmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/gen/sigsetjmp.S,v retrieving revision 1.2 diff -u -p -r1.2 sigsetjmp.S --- lib/libc/arch/arm/gen/sigsetjmp.S 1 Feb 2004 05:40:52 -0000 1.2 +++ lib/libc/arch/arm/gen/sigsetjmp.S 18 Jul 2016 13:34:19 -0000 @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ -#include <machine/asm.h> +#include "DEFS.h" #include <machine/setjmp.h> /* @@ -48,8 +48,8 @@ ENTRY(sigsetjmp) teq r1, #0 - beq PIC_SYM(_C_LABEL(_setjmp), PLT) - b PIC_SYM(_C_LABEL(setjmp), PLT) + beq _HIDDEN(_setjmp) + b _HIDDEN(setjmp) .L_setjmp_magic: .word _JB_MAGIC__SETJMP @@ -58,5 +58,5 @@ ENTRY(siglongjmp) ldr r2, .L_setjmp_magic ldr r3, [r0] teq r2, r3 - beq PIC_SYM(_C_LABEL(_longjmp), PLT) - b PIC_SYM(_C_LABEL(longjmp), PLT) + beq _HIDDEN(_longjmp) + b _HIDDEN(longjmp) Index: lib/libc/arch/arm/string/_memcpy.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/_memcpy.S,v retrieving revision 1.5 diff -u -p -r1.5 _memcpy.S --- lib/libc/arch/arm/string/_memcpy.S 31 Aug 2015 02:53:56 -0000 1.5 +++ lib/libc/arch/arm/string/_memcpy.S 18 Jul 2016 13:37:23 -0000 @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" /* * This is one fun bit of code ... @@ -462,4 +462,4 @@ ENTRY(_memcpy) .Lmemcpy_bsrcul1l4: add r1, r1, #1 b .Lmemcpy_bl4 -END(_memcpy) +END_STRONG(_memcpy) Index: lib/libc/arch/arm/string/bcopy.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/bcopy.S,v retrieving revision 1.4 diff -u -p -r1.4 bcopy.S --- lib/libc/arch/arm/string/bcopy.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/bcopy.S 18 Jul 2016 13:36:20 -0000 @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" /* bcopy = memcpy/memmove with arguments reversed. */ @@ -39,5 +39,5 @@ ENTRY(bcopy) eor r0, r1, r0 eor r1, r0, r1 eor r0, r1, r0 - b PIC_SYM(_C_LABEL(_memcpy), PLT) + b _HIDDEN(_memcpy) END_WEAK(bcopy) Index: lib/libc/arch/arm/string/bzero.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/bzero.S,v retrieving revision 1.4 diff -u -p -r1.4 bzero.S --- lib/libc/arch/arm/string/bzero.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/bzero.S 18 Jul 2016 13:36:28 -0000 @@ -30,10 +30,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" ENTRY(bzero) mov r2, r1 mov r1, #0 - b PIC_SYM(_C_LABEL(memset), PLT) + b _HIDDEN(memset) END_WEAK(bzero) Index: lib/libc/arch/arm/string/ffs.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/ffs.S,v retrieving revision 1.4 diff -u -p -r1.4 ffs.S --- lib/libc/arch/arm/string/ffs.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/ffs.S 18 Jul 2016 13:37:24 -0000 @@ -29,7 +29,7 @@ * SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" /* * ffs - find first set bit, this algorithm isolates the first set Index: lib/libc/arch/arm/string/memcmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/memcmp.S,v retrieving revision 1.5 diff -u -p -r1.5 memcmp.S --- lib/libc/arch/arm/string/memcmp.S 31 Aug 2015 02:53:56 -0000 1.5 +++ lib/libc/arch/arm/string/memcmp.S 18 Jul 2016 13:37:27 -0000 @@ -29,7 +29,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" ENTRY(memcmp) /* if (len == 0) return 0 */ Index: lib/libc/arch/arm/string/memcpy.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/memcpy.S,v retrieving revision 1.5 diff -u -p -r1.5 memcpy.S --- lib/libc/arch/arm/string/memcpy.S 31 Aug 2015 02:53:56 -0000 1.5 +++ lib/libc/arch/arm/string/memcpy.S 18 Jul 2016 13:36:42 -0000 @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" /* * XXX @@ -40,6 +40,6 @@ ENTRY(memcpy) stmfd sp!, {r0, lr} - bl PIC_SYM(_C_LABEL(_memcpy), PLT) + bl _HIDDEN(_memcpy) ldmfd sp!, {r0, pc} END_STRONG(memcpy) Index: lib/libc/arch/arm/string/memmove.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/memmove.S,v retrieving revision 1.4 diff -u -p -r1.4 memmove.S --- lib/libc/arch/arm/string/memmove.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/memmove.S 18 Jul 2016 13:37:00 -0000 @@ -30,10 +30,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" ENTRY(memmove) stmfd sp!, {r0, lr} - bl PIC_SYM(_C_LABEL(_memcpy), PLT) + bl _HIDDEN(_memcpy) ldmfd sp!, {r0, pc} END_STRONG(memmove) Index: lib/libc/arch/arm/string/memset.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/memset.S,v retrieving revision 1.4 diff -u -p -r1.4 memset.S --- lib/libc/arch/arm/string/memset.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/memset.S 18 Jul 2016 13:37:29 -0000 @@ -33,7 +33,7 @@ * SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" /* * Sets a block of memory to the specified value Index: lib/libc/arch/arm/string/strcmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/strcmp.S,v retrieving revision 1.4 diff -u -p -r1.4 strcmp.S --- lib/libc/arch/arm/string/strcmp.S 31 Aug 2015 02:53:56 -0000 1.4 +++ lib/libc/arch/arm/string/strcmp.S 18 Jul 2016 13:37:30 -0000 @@ -29,7 +29,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" ENTRY(strcmp) 1: Index: lib/libc/arch/arm/string/strncmp.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/string/strncmp.S,v retrieving revision 1.5 diff -u -p -r1.5 strncmp.S --- lib/libc/arch/arm/string/strncmp.S 31 Aug 2015 02:53:56 -0000 1.5 +++ lib/libc/arch/arm/string/strncmp.S 18 Jul 2016 13:37:32 -0000 @@ -29,7 +29,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "SYS.h" +#include "DEFS.h" ENTRY(strncmp) /* if (len == 0) return 0 */ Index: lib/libc/arch/arm/sys/cerror.S =================================================================== RCS file: /data/src/openbsd/src/lib/libc/arch/arm/sys/cerror.S,v retrieving revision 1.8 diff -u -p -r1.8 cerror.S --- lib/libc/arch/arm/sys/cerror.S 7 May 2016 19:05:21 -0000 1.8 +++ lib/libc/arch/arm/sys/cerror.S 18 Jul 2016 13:47:26 -0000 @@ -37,7 +37,7 @@ _ENTRY(CERROR) stmfd sp!, {r4, lr} mov r4, r0 - bl PIC_SYM(_C_LABEL(__errno), PLT) + bl _HIDDEN(__errno) str r4, [r0] mvn r0, #0x00000000 mvn r1, #0x00000000
