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.
150 lines
5.2 KiB
150 lines
5.2 KiB
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
|
|
|