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 <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. */
|
||||||
|
@ -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