You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.2 KiB
151 lines
5.2 KiB
3 years ago
|
commit 4fb4e7e821e36180835bf88e363f9f13b5797e3a
|
||
|
Author: Florian Weimer <fweimer@redhat.com>
|
||
|
Date: Sun Dec 5 13:50:17 2021 +0100
|
||
|
|
||
|
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>
|
||
|
|
||
|
diff --git a/csu/gmon-start.c b/csu/gmon-start.c
|
||
|
index 344606a676c188d4..260c7613e291a32d 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 5ea5b47448ceb2e7..0000000000000000
|
||
|
--- 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 e11b49fc53602eb8..0000000000000000
|
||
|
--- 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 99c81cb9820d188d..0000000000000000
|
||
|
--- 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
|