Add hidden visibility to internal function prototypes

Message ID CAMe9rOqtXP92qNahY_S8eu8a7jX35asu2Bzhxpd9TXBT9gZbyQ@mail.gmail.com
State New, archived
Headers

Commit Message

H.J. Lu Aug. 17, 2017, 6:25 p.m. UTC
  On Thu, Aug 17, 2017 at 5:40 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> 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.
>

Here is the updated patch to add hidden visibility to internal function
prototypes used within libc.a.

Tested on x86-64 and i686 with and without GCC defaulting to PIE.

OK for master?
  

Comments

H.J. Lu Aug. 20, 2017, 6:01 p.m. UTC | #1
On Thu, Aug 17, 2017 at 11:25 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Aug 17, 2017 at 5:40 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> 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.
>>
>
> Here is the updated patch to add hidden visibility to internal function
> prototypes used within libc.a.
>
> Tested on x86-64 and i686 with and without GCC defaulting to PIE.
>
> OK for master?
>

I will check it in tomorrow.
  

Patch

From 236f3b88f74d408d3ab925809da3bd6d8a995730 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sun, 13 Aug 2017 07:37:34 -0700
Subject: [PATCH] Add hidden visibility to internal function prototypes

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.
---
 include/libc-symbols.h | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index d6a1c260f6..fe3571af52 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 !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__ */
-- 
2.13.5