Add hidden visibility to internal function prototypes
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 21 Aug 2017 12:50:38 +0000 (05:50 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 21 Aug 2017 12:50:52 +0000 (05:50 -0700)
Add hidden visibility to internal function prototypes to allow direct
access to internal functions within libc.a without using GOT when the
compiler defaults to -fPIE.

Size comparison of elf/ldconfig when the compiler defaults to -fPIE:

On x86-64:
        text    data     bss     dec     hex
Before: 619646   20132    5488  645266   9d892
After : 619502   20132    5488  645122   9d802
On i686:
        text    data     bss     dec     hex
Before: 550333   10748    3060  564141   89bad
After : 546453   10732    3060  560245   88c75

* include/libc-symbols.h (__hidden_proto_hiddenattr): New for
building libc.a.
(hidden_proto): Likewise.
(hidden_tls_proto): Likewise.
(__hidden_proto): Likewise.

ChangeLog
include/libc-symbols.h

index e7ffb591b1af7ac01749b08799fec786770fce38..8ff2d90baee942ab9172e8402c972a5a712a48cb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2017-08-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * include/libc-symbols.h (__hidden_proto_hiddenattr): New for
+       building libc.a.
+       (hidden_proto): Likewise.
+       (hidden_tls_proto): Likewise.
+       (__hidden_proto): Likewise.
+
 2017-08-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        * include/libc-symbols.h (attribute_hidden): Enable hidden
index d6a1c260f6cb80aacd16c9b1b991559421419cf3..fe3571af52925f1c9cb8e2211d5914cf2ca08986 100644 (file)
@@ -513,8 +513,20 @@ for linking")
 # endif
 #else
 # ifndef __ASSEMBLER__
-#  define hidden_proto(name, attrs...)
-#  define hidden_tls_proto(name, attrs...)
+#  if !defined SHARED && IS_IN (libc) && !defined LIBC_NONSHARED \
+      && !defined NO_HIDDEN
+#   define __hidden_proto_hiddenattr(attrs...) \
+  __attribute__ ((visibility ("hidden"), ##attrs))
+#   define hidden_proto(name, attrs...) \
+  __hidden_proto (name, , name, ##attrs)
+#   define hidden_tls_proto(name, attrs...) \
+  __hidden_proto (name, __thread, name, ##attrs)
+#  define __hidden_proto(name, thread, internal, attrs...)          \
+  extern thread __typeof (name) name __hidden_proto_hiddenattr (attrs);
+# else
+#   define hidden_proto(name, attrs...)
+#   define hidden_tls_proto(name, attrs...)
+# endif
 # else
 #  define HIDDEN_JUMPTARGET(name) JUMPTARGET(name)
 # endif /* Not  __ASSEMBLER__ */