mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
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:
parent
c1cb2deeca
commit
4fb4e7e821
@ -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. */
|
||||
|
@ -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);
|
@ -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);
|
@ -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
|
Loading…
Reference in New Issue
Block a user