[08/58] Mark __dso_handle as hidden [BZ #18822]
Commit Message
On Mon, Sep 4, 2017 at 12:22 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 09/03/2017 03:42 PM, H.J. Lu wrote:
>> On Sun, Sep 3, 2017 at 2:11 AM, Florian Weimer <fweimer@redhat.com> wrote:
>>> On 09/03/2017 10:21 AM, Florian Weimer wrote:
>>>> On 09/01/2017 07:59 PM, H.J. Lu wrote:
>>>>> diff --git a/include/stdlib.h b/include/stdlib.h
>>>>> index 2274790a2e..d0dcbf81c3 100644
>>>>> --- a/include/stdlib.h
>>>>> +++ b/include/stdlib.h
>>>>> @@ -5,6 +5,10 @@
>>>>> #endif
>>>>> #include <stdlib/stdlib.h>
>>>>>
>>>>> +/* __dso_handle is always defined by either crtbegin.o from GCC or our
>>>>> + dso_handle.c. */
>>>>> +extern void *__dso_handle __attribute__ ((visibility ("hidden")));
>>>>
>>>> This causes conform test failures. You need to use __visibility__ here.
>
>>> Or alternatively, move the declaration under #ifndef _ISOMAC. That's
>>> probably the better approach because __dso_handle is not part of the
>>> installed headers.
>>>
>>
>> No, we can't do that. Some tests reference __dso_handle and _ISOMAC
>> isn't defined for tests.
>
> These tests should be moved to tests-internal, or __dso_handle should be
We may not define _ISOMAC for these tests since it may introduce
many issues.
> declared in a different header and the tests should include it.
Here is an updated with include/dso_handle.h. OK for master?
Thanks.
Comments
On Mon, Sep 4, 2017 at 2:19 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Mon, Sep 4, 2017 at 12:22 AM, Florian Weimer <fweimer@redhat.com> wrote:
>> On 09/03/2017 03:42 PM, H.J. Lu wrote:
>>> On Sun, Sep 3, 2017 at 2:11 AM, Florian Weimer <fweimer@redhat.com> wrote:
>>>> On 09/03/2017 10:21 AM, Florian Weimer wrote:
>>>>> On 09/01/2017 07:59 PM, H.J. Lu wrote:
>>>>>> diff --git a/include/stdlib.h b/include/stdlib.h
>>>>>> index 2274790a2e..d0dcbf81c3 100644
>>>>>> --- a/include/stdlib.h
>>>>>> +++ b/include/stdlib.h
>>>>>> @@ -5,6 +5,10 @@
>>>>>> #endif
>>>>>> #include <stdlib/stdlib.h>
>>>>>>
>>>>>> +/* __dso_handle is always defined by either crtbegin.o from GCC or our
>>>>>> + dso_handle.c. */
>>>>>> +extern void *__dso_handle __attribute__ ((visibility ("hidden")));
>>>>>
>>>>> This causes conform test failures. You need to use __visibility__ here.
>>
>>>> Or alternatively, move the declaration under #ifndef _ISOMAC. That's
>>>> probably the better approach because __dso_handle is not part of the
>>>> installed headers.
>>>>
>>>
>>> No, we can't do that. Some tests reference __dso_handle and _ISOMAC
>>> isn't defined for tests.
>>
>> These tests should be moved to tests-internal, or __dso_handle should be
>
> We may not define _ISOMAC for these tests since it may introduce
> many issues.
>
>> declared in a different header and the tests should include it.
>
> Here is an updated with include/dso_handle.h. OK for master?
>
> Thanks.
>
Any comments or objections?
Thanks.
On 9/12/17, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Mon, Sep 4, 2017 at 2:19 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Mon, Sep 4, 2017 at 12:22 AM, Florian Weimer <fweimer@redhat.com>
>> wrote:
>>> On 09/03/2017 03:42 PM, H.J. Lu wrote:
>>>> On Sun, Sep 3, 2017 at 2:11 AM, Florian Weimer <fweimer@redhat.com>
>>>> wrote:
>>>>> On 09/03/2017 10:21 AM, Florian Weimer wrote:
>>>>>> On 09/01/2017 07:59 PM, H.J. Lu wrote:
>>>>>>> diff --git a/include/stdlib.h b/include/stdlib.h
>>>>>>> index 2274790a2e..d0dcbf81c3 100644
>>>>>>> --- a/include/stdlib.h
>>>>>>> +++ b/include/stdlib.h
>>>>>>> @@ -5,6 +5,10 @@
>>>>>>> #endif
>>>>>>> #include <stdlib/stdlib.h>
>>>>>>>
>>>>>>> +/* __dso_handle is always defined by either crtbegin.o from GCC or
>>>>>>> our
>>>>>>> + dso_handle.c. */
>>>>>>> +extern void *__dso_handle __attribute__ ((visibility ("hidden")));
>>>>>>
>>>>>> This causes conform test failures. You need to use __visibility__
>>>>>> here.
>>>
>>>>> Or alternatively, move the declaration under #ifndef _ISOMAC. That's
>>>>> probably the better approach because __dso_handle is not part of the
>>>>> installed headers.
>>>>>
>>>>
>>>> No, we can't do that. Some tests reference __dso_handle and _ISOMAC
>>>> isn't defined for tests.
>>>
>>> These tests should be moved to tests-internal, or __dso_handle should be
>>
>> We may not define _ISOMAC for these tests since it may introduce
>> many issues.
>>
>>> declared in a different header and the tests should include it.
>>
>> Here is an updated with include/dso_handle.h. OK for master?
>>
>> Thanks.
>>
>
> Any comments or objections?
>
> Thanks.
>
I will check it in today.
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
@@ -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;
}
@@ -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);
}
@@ -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)
{
@@ -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)
{
new file mode 100644
@@ -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")));
@@ -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
}
@@ -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),
@@ -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)
@@ -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. */
@@ -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);
}
@@ -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);
}
@@ -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