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

Reply via email to