diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-12-05 13:50:17 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-12-05 13:50:21 +0100 |
commit | 4fb4e7e821e36180835bf88e363f9f13b5797e3a (patch) | |
tree | e315c682e44885fe627ad0a2d10d006fef8ee140 | |
parent | c1cb2deeca1a85c6fc5bd41b90816d48a95bc434 (diff) | |
download | glibc-4fb4e7e821e36180835bf88e363f9f13b5797e3a.tar.gz glibc-4fb4e7e821e36180835bf88e363f9f13b5797e3a.tar.xz glibc-4fb4e7e821e36180835bf88e363f9f13b5797e3a.zip |
csu: Always use __executable_start in gmon-start.c
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. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r-- | csu/gmon-start.c | 29 | ||||
-rw-r--r-- | sysdeps/hppa/entry.h | 13 | ||||
-rw-r--r-- | sysdeps/ia64/entry.h | 13 | ||||
-rw-r--r-- | 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 |