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>
This commit is contained in:
Florian Weimer 2021-12-05 13:50:17 +01:00
parent c1cb2deeca
commit 4fb4e7e821
4 changed files with 3 additions and 89 deletions

View File

@ -38,32 +38,12 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <elf-initfini.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 /* Use __executable_start as the lowest address to keep profiling records
if it provided by the linker. */ if it provided by the linker. */
extern const char executable_start[] asm ("__executable_start") extern const char __executable_start[] __attribute__ ((visibility ("hidden")));
__attribute__ ((weak, visibility ("hidden")));
#ifndef TEXT_START extern char etext[];
# ifdef ENTRY_POINT_DECL
# define TEXT_START ENTRY_POINT
# else
# define TEXT_START &ENTRY_POINT
# endif
#endif
#if !ELF_INITFINI #if !ELF_INITFINI
/* Instead of defining __gmon_start__ globally in gcrt1.o, we make it /* Instead of defining __gmon_start__ globally in gcrt1.o, we make it
@ -97,10 +77,7 @@ __gmon_start__ (void)
called = 1; called = 1;
/* Start keeping profiling records. */ /* Start keeping profiling records. */
if (&executable_start != NULL) __monstartup ((u_long) &__executable_start, (u_long) &etext);
__monstartup ((u_long) &executable_start, (u_long) &etext);
else
__monstartup ((u_long) TEXT_START, (u_long) &etext);
/* Call _mcleanup before exiting; it will write out gmon.out from the /* Call _mcleanup before exiting; it will write out gmon.out from the
collected data. */ collected data. */

View File

@ -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);

View File

@ -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);

View File

@ -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