[v2] csu: Always use __executable_start in gmon-start.c
Checks
Context |
Check |
Description |
dj/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
dj/TryBot-32bit |
success
|
Build for i686
|
Commit Message
Current binutils defines __executable_start as the lowest text
address, so using the entry point address as a fallback is no
longer necessary. As a result, overriding <entry.h> is only
necessary if the entry point is not called _start.
The previous approach to define __ASSEMBLY__ to suppress the
declaration breaks if headers included by <entry.h> are not
compatible with __ASSEMBLY__. This happens with rseq integration
because it is necessary to include kernel headers in more places.
Tested on i686-linux-gnu, powerpc-linux-gnu, powerpc64-linux-gnu,
powerpc64le-linux-gnu, x86_64-linux-gnu. Built with
build-many-glibcs.py.
---
v2: Remove TEXT_START instead of generalizing it.
csu/gmon-start.c | 29 +++--------------------------
sysdeps/hppa/entry.h | 13 -------------
sysdeps/ia64/entry.h | 13 -------------
sysdeps/powerpc/powerpc64/entry.h | 37 -------------------------------------
4 files changed, 3 insertions(+), 89 deletions(-)
Comments
On Sun, Dec 5, 2021 at 2:37 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> Current binutils defines __executable_start as the lowest text
> address, so using the entry point address as a fallback is no
> longer necessary. As a result, overriding <entry.h> is only
> necessary if the entry point is not called _start.
>
> The previous approach to define __ASSEMBLY__ to suppress the
> declaration breaks if headers included by <entry.h> are not
> compatible with __ASSEMBLY__. This happens with rseq integration
> because it is necessary to include kernel headers in more places.
>
> Tested on i686-linux-gnu, powerpc-linux-gnu, powerpc64-linux-gnu,
> powerpc64le-linux-gnu, x86_64-linux-gnu. Built with
> build-many-glibcs.py.
>
> ---
> v2: Remove TEXT_START instead of generalizing it.
>
> csu/gmon-start.c | 29 +++--------------------------
> sysdeps/hppa/entry.h | 13 -------------
> sysdeps/ia64/entry.h | 13 -------------
> sysdeps/powerpc/powerpc64/entry.h | 37 -------------------------------------
> 4 files changed, 3 insertions(+), 89 deletions(-)
>
> diff --git a/csu/gmon-start.c b/csu/gmon-start.c
> index 344606a676..260c7613e2 100644
> --- a/csu/gmon-start.c
> +++ b/csu/gmon-start.c
> @@ -38,32 +38,12 @@
> #include <stdlib.h>
> #include <unistd.h>
> #include <elf-initfini.h>
> -#define __ASSEMBLY__
> -#include <entry.h>
> -
> -/* Beginning and end of our code segment. We cannot declare them
> - as the external functions since we want the addresses of those
> - labels. Taking the address of a function may have different
> - meanings on different platforms. */
> -#ifdef ENTRY_POINT_DECL
> -ENTRY_POINT_DECL(extern)
> -#else
> -extern char ENTRY_POINT[];
> -#endif
> -extern char etext[];
>
> /* Use __executable_start as the lowest address to keep profiling records
> if it provided by the linker. */
> -extern const char executable_start[] asm ("__executable_start")
> - __attribute__ ((weak, visibility ("hidden")));
> +extern const char __executable_start[] __attribute__ ((visibility ("hidden")));
>
> -#ifndef TEXT_START
> -# ifdef ENTRY_POINT_DECL
> -# define TEXT_START ENTRY_POINT
> -# else
> -# define TEXT_START &ENTRY_POINT
> -# endif
> -#endif
> +extern char etext[];
>
> #if !ELF_INITFINI
> /* Instead of defining __gmon_start__ globally in gcrt1.o, we make it
> @@ -97,10 +77,7 @@ __gmon_start__ (void)
> called = 1;
>
> /* Start keeping profiling records. */
> - if (&executable_start != NULL)
> - __monstartup ((u_long) &executable_start, (u_long) &etext);
> - else
> - __monstartup ((u_long) TEXT_START, (u_long) &etext);
> + __monstartup ((u_long) &__executable_start, (u_long) &etext);
>
> /* Call _mcleanup before exiting; it will write out gmon.out from the
> collected data. */
> diff --git a/sysdeps/hppa/entry.h b/sysdeps/hppa/entry.h
> deleted file mode 100644
> index 5ea5b47448..0000000000
> --- a/sysdeps/hppa/entry.h
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#ifndef __ASSEMBLY__
> -extern void _start (void);
> -#endif
> -
> -/* Lives in libgcc.so and canonicalizes function pointers for comparison. */
> -extern unsigned int __canonicalize_funcptr_for_compare (unsigned int fptr);
> -
> -/* The function's entry point is stored in the first word of the
> - function descriptor (plabel) of _start(). */
> -#define ENTRY_POINT __canonicalize_funcptr_for_compare((unsigned int)_start)
> -
> -/* We have to provide a special declaration. */
> -#define ENTRY_POINT_DECL(class) class void _start (void);
> diff --git a/sysdeps/ia64/entry.h b/sysdeps/ia64/entry.h
> deleted file mode 100644
> index e11b49fc53..0000000000
> --- a/sysdeps/ia64/entry.h
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#include <link.h>
> -#include <dl-fptr.h>
> -
> -#ifndef __ASSEMBLY__
> -extern void _start (void);
> -#endif
> -
> -/* The function's entry point is stored in the first word of the
> - function descriptor (plabel) of _start(). */
> -#define ENTRY_POINT ELF_PTR_TO_FDESC (_start)->ip
> -
> -/* We have to provide a special declaration. */
> -#define ENTRY_POINT_DECL(class) class void _start (void);
> diff --git a/sysdeps/powerpc/powerpc64/entry.h b/sysdeps/powerpc/powerpc64/entry.h
> deleted file mode 100644
> index 99c81cb982..0000000000
> --- a/sysdeps/powerpc/powerpc64/entry.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -/* Finding the entry point and start of text. PowerPC64 version.
> - Copyright (C) 2002-2021 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <https://www.gnu.org/licenses/>. */
> -
> -
> -#ifndef __ASSEMBLY__
> -extern void _start (void);
> -#endif
> -
> -#define ENTRY_POINT _start
> -
> -#if _CALL_ELF != 2
> -/* We have to provide a special declaration. */
> -#define ENTRY_POINT_DECL(class) class void _start (void);
> -
> -/* Use the address of ._start as the lowest address for which we need
> - to keep profiling records. We can't copy the ia64 scheme as our
> - entry poiny address is really the address of the function
> - descriptor, not the actual function entry. */
> -#define TEXT_START \
> - ({ extern unsigned long int _start_as_data[] asm ("_start"); \
> - _start_as_data[0]; })
> -#endif
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
@@ -38,32 +38,12 @@
#include <stdlib.h>
#include <unistd.h>
#include <elf-initfini.h>
-#define __ASSEMBLY__
-#include <entry.h>
-
-/* Beginning and end of our code segment. We cannot declare them
- as the external functions since we want the addresses of those
- labels. Taking the address of a function may have different
- meanings on different platforms. */
-#ifdef ENTRY_POINT_DECL
-ENTRY_POINT_DECL(extern)
-#else
-extern char ENTRY_POINT[];
-#endif
-extern char etext[];
/* Use __executable_start as the lowest address to keep profiling records
if it provided by the linker. */
-extern const char executable_start[] asm ("__executable_start")
- __attribute__ ((weak, visibility ("hidden")));
+extern const char __executable_start[] __attribute__ ((visibility ("hidden")));
-#ifndef TEXT_START
-# ifdef ENTRY_POINT_DECL
-# define TEXT_START ENTRY_POINT
-# else
-# define TEXT_START &ENTRY_POINT
-# endif
-#endif
+extern char etext[];
#if !ELF_INITFINI
/* Instead of defining __gmon_start__ globally in gcrt1.o, we make it
@@ -97,10 +77,7 @@ __gmon_start__ (void)
called = 1;
/* Start keeping profiling records. */
- if (&executable_start != NULL)
- __monstartup ((u_long) &executable_start, (u_long) &etext);
- else
- __monstartup ((u_long) TEXT_START, (u_long) &etext);
+ __monstartup ((u_long) &__executable_start, (u_long) &etext);
/* Call _mcleanup before exiting; it will write out gmon.out from the
collected data. */
deleted file mode 100644
@@ -1,13 +0,0 @@
-#ifndef __ASSEMBLY__
-extern void _start (void);
-#endif
-
-/* Lives in libgcc.so and canonicalizes function pointers for comparison. */
-extern unsigned int __canonicalize_funcptr_for_compare (unsigned int fptr);
-
-/* The function's entry point is stored in the first word of the
- function descriptor (plabel) of _start(). */
-#define ENTRY_POINT __canonicalize_funcptr_for_compare((unsigned int)_start)
-
-/* We have to provide a special declaration. */
-#define ENTRY_POINT_DECL(class) class void _start (void);
deleted file mode 100644
@@ -1,13 +0,0 @@
-#include <link.h>
-#include <dl-fptr.h>
-
-#ifndef __ASSEMBLY__
-extern void _start (void);
-#endif
-
-/* The function's entry point is stored in the first word of the
- function descriptor (plabel) of _start(). */
-#define ENTRY_POINT ELF_PTR_TO_FDESC (_start)->ip
-
-/* We have to provide a special declaration. */
-#define ENTRY_POINT_DECL(class) class void _start (void);
deleted file mode 100644
@@ -1,37 +0,0 @@
-/* Finding the entry point and start of text. PowerPC64 version.
- Copyright (C) 2002-2021 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-
-#ifndef __ASSEMBLY__
-extern void _start (void);
-#endif
-
-#define ENTRY_POINT _start
-
-#if _CALL_ELF != 2
-/* We have to provide a special declaration. */
-#define ENTRY_POINT_DECL(class) class void _start (void);
-
-/* Use the address of ._start as the lowest address for which we need
- to keep profiling records. We can't copy the ia64 scheme as our
- entry poiny address is really the address of the function
- descriptor, not the actual function entry. */
-#define TEXT_START \
- ({ extern unsigned long int _start_as_data[] asm ("_start"); \
- _start_as_data[0]; })
-#endif