From 5fe846c5f6f2fac2ca94065573e52f541f6d53a9 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Fri, 18 Aug 2017 09:52:52 -0700
Subject: [PATCH] Mark __dso_handle as hidden [BZ #18822]

Since __dso_handle is always defined by either crtbegin.o from GCC or
dso_handle.c, it should be marked as hidden and be passed directly.

	[BZ #18822]
	* dlfcn/modatexit.c (foo): Remove __dso_handle check.
	* dlfcn/modcxaatexit.c: Include <dso_handle.h>.
	(__dso_handle): Remove declaration.
	* dlfcn/tstatexit.c (__dso_handle): Removed.
	(main): Don't check __dso_handle.
	* dlfcn/tstcxaatexit.c (__dso_handle): Removed.
	(main): Don't check __dso_handle.
	* include/dso_handle.h: New file.
	* malloc/mtrace.c: Include <dso_handle.h>.
	(mtrace): Pass __dso_handle directly.
	* nptl/pthread_atfork.c: Include <dso_handle.h>.
	(__dso_handle): Remove declaration.
	(__pthread_atfork): Pass __dso_handle directly.
	* nptl/tst-atfork2mod.c: Include <dso_handle.h>.
	(__dso_handle): Removed.
	* posix/wordexp-test.c: Include <dso_handle.h>.
	(__dso_handle): Remove declaration.
	(__app_register_atfork): Pass __dso_handle directly.
	* stdlib/at_quick_exit.c: Include <dso_handle.h>.
	(__dso_handle): Remove declaration.
	(at_quick_exit): Pass __dso_handle directly.
	* stdlib/atexit.c: Include <dso_handle.h>.
	(__dso_handle): Remove declaration.
	(atexit): Pass __dso_handle directly.
	* stdlib/tst-tls-atexit-lib.c: Include <dso_handle.h>.
	(__dso_handle): Removed.
---
 dlfcn/modatexit.c           | 2 --
 dlfcn/modcxaatexit.c        | 2 +-
 dlfcn/tstatexit.c           | 8 --------
 dlfcn/tstcxaatexit.c        | 8 --------
 include/dso_handle.h        | 3 +++
 malloc/mtrace.c             | 4 ++--
 nptl/pthread_atfork.c       | 8 ++------
 nptl/tst-atfork2mod.c       | 2 +-
 posix/wordexp-test.c        | 5 ++---
 stdlib/at_quick_exit.c      | 8 ++------
 stdlib/atexit.c             | 9 ++-------
 stdlib/tst-tls-atexit-lib.c | 3 +--
 12 files changed, 16 insertions(+), 46 deletions(-)
 create mode 100644 include/dso_handle.h

diff --git a/dlfcn/modatexit.c b/dlfcn/modatexit.c
index e620d10c70..95c18dcbac 100644
--- a/dlfcn/modatexit.c
+++ b/dlfcn/modatexit.c
@@ -35,9 +35,7 @@ dummy (void)
 void
 foo (void *p)
 {
-  extern void *__dso_handle __attribute__ ((__weak__));
   printf ("This is %s\n", __FUNCTION__);
   atexit (dummy);
-  if (&__dso_handle) puts ("have dso handle"); else puts ("no dso handle");
   ip = p;
 }
diff --git a/dlfcn/modcxaatexit.c b/dlfcn/modcxaatexit.c
index fbda2f3c9f..917a97d813 100644
--- a/dlfcn/modcxaatexit.c
+++ b/dlfcn/modcxaatexit.c
@@ -17,6 +17,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <dso_handle.h>
 
 extern void fluffy (void *p);
 extern void bar (void *p);
@@ -34,7 +35,6 @@ fluffy (void *p)
 void
 bar (void *p)
 {
-  extern void *__dso_handle;
   printf ("This is %s\n", __FUNCTION__);
   __cxa_atexit (fluffy, p, __dso_handle);
 }
diff --git a/dlfcn/tstatexit.c b/dlfcn/tstatexit.c
index 2073843b8f..e25a3f8000 100644
--- a/dlfcn/tstatexit.c
+++ b/dlfcn/tstatexit.c
@@ -20,8 +20,6 @@
 #include <stdlib.h>
 
 
-extern void *__dso_handle __attribute__ ((__weak__));
-
 int
 main (void)
 {
@@ -30,12 +28,6 @@ main (void)
   void (*fp) (void *);
   int v = 0;
 
-  if (&__dso_handle == NULL)
-    {
-      puts ("__dso_handle not available, cannot perform the test");
-      exit (0);
-    }
-
   h = dlopen (fname, RTLD_NOW);
   if (h == NULL)
     {
diff --git a/dlfcn/tstcxaatexit.c b/dlfcn/tstcxaatexit.c
index fde645c16b..37f25d63d4 100644
--- a/dlfcn/tstcxaatexit.c
+++ b/dlfcn/tstcxaatexit.c
@@ -19,8 +19,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-extern void *__dso_handle __attribute__ ((__weak__));
-
 int
 main (void)
 {
@@ -29,12 +27,6 @@ main (void)
   void (*fp) (void *);
   int v = 0;
 
-  if (&__dso_handle == NULL)
-    {
-      puts ("__dso_handle not available, cannot perform the test");
-      exit (0);
-    }
-
   h = dlopen (fname, RTLD_LAZY);
   if (h == NULL)
     {
diff --git a/include/dso_handle.h b/include/dso_handle.h
new file mode 100644
index 0000000000..d9c1ebbce4
--- /dev/null
+++ b/include/dso_handle.h
@@ -0,0 +1,3 @@
+/* __dso_handle is always defined by either crtbegin.o from GCC or our
+   dso_handle.c.  */
+extern void *__dso_handle __attribute__ ((__visibility__ ("hidden")));
diff --git a/malloc/mtrace.c b/malloc/mtrace.c
index 6c362d9679..9eb2f5f1c7 100644
--- a/malloc/mtrace.c
+++ b/malloc/mtrace.c
@@ -34,6 +34,7 @@
 #include <_itoa.h>
 
 #include <libc-internal.h>
+#include <dso_handle.h>
 
 #include <libio/iolibio.h>
 #define setvbuf(s, b, f, l) _IO_setvbuf (s, b, f, l)
@@ -315,10 +316,9 @@ mtrace (void)
 #ifdef _LIBC
           if (!added_atexit_handler)
             {
-              extern void *__dso_handle __attribute__ ((__weak__));
               added_atexit_handler = 1;
               __cxa_atexit ((void (*)(void *))release_libc_mem, NULL,
-                            &__dso_handle ? __dso_handle : NULL);
+			    __dso_handle);
             }
 #endif
         }
diff --git a/nptl/pthread_atfork.c b/nptl/pthread_atfork.c
index dc2ea07887..f1aa2b3cf1 100644
--- a/nptl/pthread_atfork.c
+++ b/nptl/pthread_atfork.c
@@ -35,10 +35,7 @@
 
 #include "pthreadP.h"
 #include <fork.h>
-
-/* This is defined by newer gcc version unique for each module.  */
-extern void *__dso_handle __attribute__ ((__weak__,
-					  __visibility__ ("hidden")));
+#include <dso_handle.h>
 
 
 /* Hide the symbol so that no definition but the one locally in the
@@ -51,8 +48,7 @@ attribute_hidden
 __pthread_atfork (void (*prepare) (void), void (*parent) (void),
 		  void (*child) (void))
 {
-  return __register_atfork (prepare, parent, child,
-			    &__dso_handle == NULL ? NULL : __dso_handle);
+  return __register_atfork (prepare, parent, child, __dso_handle);
 }
 #ifndef __pthread_atfork
 extern int pthread_atfork (void (*prepare) (void), void (*parent) (void),
diff --git a/nptl/tst-atfork2mod.c b/nptl/tst-atfork2mod.c
index fe64046d3c..ea47d5825a 100644
--- a/nptl/tst-atfork2mod.c
+++ b/nptl/tst-atfork2mod.c
@@ -19,6 +19,7 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <dso_handle.h>
 
 
 extern int val;
@@ -46,7 +47,6 @@ static void
 __attribute__ ((constructor))
 init (void)
 {
-  extern void *__dso_handle;
   printf ("dsohandle = %p\n", __dso_handle);
 
   if (pthread_atfork (prepare, parent, child) != 0)
diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c
index 17ae812346..c030a4d670 100644
--- a/posix/wordexp-test.c
+++ b/posix/wordexp-test.c
@@ -27,16 +27,15 @@
 #include <string.h>
 #include <wordexp.h>
 #include <libc-pointer-arith.h>
+#include <dso_handle.h>
 
 #define IFS " \n\t"
 
-extern void *__dso_handle __attribute__ ((__weak__, __visibility__ ("hidden")));
 extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *);
 
 static int __app_register_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void))
 {
-  return __register_atfork (prepare, parent, child,
-			    &__dso_handle == NULL ? NULL : __dso_handle);
+  return __register_atfork (prepare, parent, child, __dso_handle);
 }
 
 /* Number of forks seen.  */
diff --git a/stdlib/at_quick_exit.c b/stdlib/at_quick_exit.c
index 3b74d0a688..0f1c1fde9e 100644
--- a/stdlib/at_quick_exit.c
+++ b/stdlib/at_quick_exit.c
@@ -33,18 +33,14 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <stdlib.h>
+#include <dso_handle.h>
 #include "exit.h"
 
 
-/* This is defined by newer gcc version unique for each module.  */
-extern void *__dso_handle __attribute__ ((__weak__));
-
-
 /* Register FUNC to be executed by `quick_exit'.  */
 int
 attribute_hidden
 at_quick_exit (void (*func) (void))
 {
-  return __cxa_at_quick_exit ((void (*) (void *)) func,
-			      &__dso_handle == NULL ? NULL : __dso_handle);
+  return __cxa_at_quick_exit ((void (*) (void *)) func, __dso_handle);
 }
diff --git a/stdlib/atexit.c b/stdlib/atexit.c
index f28b6ba1b7..aaecb4a503 100644
--- a/stdlib/atexit.c
+++ b/stdlib/atexit.c
@@ -33,13 +33,9 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <stdlib.h>
+#include <dso_handle.h>
 #include "exit.h"
 
-
-/* This is defined by newer gcc version unique for each module.  */
-extern void *__dso_handle __attribute__ ((__weak__));
-
-
 /* Register FUNC to be executed by `exit'.  */
 int
 #ifndef atexit
@@ -47,6 +43,5 @@ attribute_hidden
 #endif
 atexit (void (*func) (void))
 {
-  return __cxa_atexit ((void (*) (void *)) func, NULL,
-		       &__dso_handle == NULL ? NULL : __dso_handle);
+  return __cxa_atexit ((void (*) (void *)) func, NULL, __dso_handle);
 }
diff --git a/stdlib/tst-tls-atexit-lib.c b/stdlib/tst-tls-atexit-lib.c
index a227e4653c..06ec02f4ee 100644
--- a/stdlib/tst-tls-atexit-lib.c
+++ b/stdlib/tst-tls-atexit-lib.c
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <stdlib.h>
-
-extern void *__dso_handle;
+#include <dso_handle.h>
 
 typedef struct
 {
-- 
2.13.5
