Add hidden visibility to internal function prototypes

Message ID 20170817122244.GA14297@gmail.com
State New, archived
Headers

Commit Message

Lu, Hongjiu Aug. 17, 2017, 12:22 p.m. UTC
  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

Any comments?

H.J.
---
	* include/libc-symbols.h (__hidden_proto_hiddenattr): New for
	the compiler defaulting to -fPIE.
	(hidden_proto): Likewise.
	(hidden_tls_proto): Likewise.
	(__hidden_proto): Likewise.
---
 include/libc-symbols.h | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
  

Comments

Florian Weimer Aug. 17, 2017, 12:34 p.m. UTC | #1
On 08/17/2017 02:22 PM, H.J. Lu wrote:
> 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:

This is for static linking, right?

Is there a reason to restrict this to PIE builds?  Why not use hidden
visibility unconditionally?

Thanks,
Florian
  
H.J. Lu Aug. 17, 2017, 12:40 p.m. UTC | #2
On Thu, Aug 17, 2017 at 5:34 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 08/17/2017 02:22 PM, H.J. Lu wrote:
>> 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:
>
> This is for static linking, right?
>
> Is there a reason to restrict this to PIE builds?  Why not use hidden
> visibility unconditionally?
>

Yes, there is only used for static PIE build and we can replace
BUILD_PIE_DEFAULT with !defined SHARED.  But it makes
no difference for non-PIE static build.
  

Patch

diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index d6a1c260f6..6c75a6f012 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -513,8 +513,20 @@  for linking")
 # endif
 #else
 # ifndef __ASSEMBLER__
-#  define hidden_proto(name, attrs...)
-#  define hidden_tls_proto(name, attrs...)
+#  if BUILD_PIE_DEFAULT && 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__ */