From patchwork Sat Dec 4 20:36:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 48500 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 785053858416 for ; Sat, 4 Dec 2021 20:36:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 785053858416 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1638650191; bh=SqlBg52HtN5UGftpIMRDmQc7SFAxj+uHbSF3Wc/UUxo=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=y46re6owzh8Nnzp8zrCPr+1Y2zEbyl3fS0uPHIZvARdAuSGJkYRyijK6pqv5BD+Bk t8LtD8i+8ObGYlFPyRymsbS1nB4kbRQd9xHPytWD0ODUcrC4vontW6nRUvyqzlEPE2 tywWxcs9NkLXgg1IkeHlaC9xjQ6fqTVJAoQGWhaU= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 596E73858D39 for ; Sat, 4 Dec 2021 20:36:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 596E73858D39 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-201-bcbun2iVNLCM82XFhBqmQQ-1; Sat, 04 Dec 2021 15:36:05 -0500 X-MC-Unique: bcbun2iVNLCM82XFhBqmQQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2FB8D2E69 for ; Sat, 4 Dec 2021 20:36:04 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.193.123]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 56463197FC for ; Sat, 4 Dec 2021 20:36:03 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH] Introduce to define TEXT_START for csu/gmon-start.c Date: Sat, 04 Dec 2021 21:36:01 +0100 Message-ID: <878rx0t8em.fsf@oldenburg.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The generic version uses to obtain the ENTRY_POINT name and redeclares it as a data symbol, under a different identifier. This way, it is no longer necessary to inhibit the declaration of the entry point as a function. The previous approach to define __ASSEMBLY__ to suppress the declaration breaks if headers included by are not compatible with __ASSEMBLY__. This happens with rseq integration because it is necessary to include kernel headers in more places. Tested on i686-linux-gnu and x86_64-linux-gnu. Built with build-many-glibcs.py. --- csu/gmon-start.c | 22 ++--------------- sysdeps/generic/gmon-entry.h | 28 ++++++++++++++++++++++ sysdeps/hppa/{entry.h => gmon-entry.h} | 9 ++----- sysdeps/ia64/entry.h | 13 ---------- sysdeps/ia64/gmon-entry.h | 7 ++++++ .../powerpc/powerpc64/{entry.h => gmon-entry.h} | 23 +++++++----------- 6 files changed, 47 insertions(+), 55 deletions(-) diff --git a/csu/gmon-start.c b/csu/gmon-start.c index 344606a676..1e35e2f829 100644 --- a/csu/gmon-start.c +++ b/csu/gmon-start.c @@ -38,32 +38,14 @@ #include #include #include -#define __ASSEMBLY__ -#include - -/* 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[]; +#include /* 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"))); -#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 diff --git a/sysdeps/generic/gmon-entry.h b/sysdeps/generic/gmon-entry.h new file mode 100644 index 0000000000..720b0d3338 --- /dev/null +++ b/sysdeps/generic/gmon-entry.h @@ -0,0 +1,28 @@ +/* Entry point address for csu/gmon-start.c. Generic version. + Copyright (C) 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 + . */ + +#include + +/* 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. */ +#define __TEXT_START0(name) \ + ({ extern char _start_as_data[] asm (#name); &_start_as_data[0]; }) +#define __TEXT_START1(name) __TEXT_START0(name) +#define TEXT_START __TEXT_START1(ENTRY_POINT) diff --git a/sysdeps/hppa/entry.h b/sysdeps/hppa/gmon-entry.h similarity index 52% rename from sysdeps/hppa/entry.h rename to sysdeps/hppa/gmon-entry.h index 5ea5b47448..d59f331889 100644 --- a/sysdeps/hppa/entry.h +++ b/sysdeps/hppa/gmon-entry.h @@ -1,13 +1,8 @@ -#ifndef __ASSEMBLY__ -extern void _start (void); -#endif +#include /* 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); +#define TEXT_START __canonicalize_funcptr_for_compare((unsigned int)_start) diff --git a/sysdeps/ia64/entry.h b/sysdeps/ia64/entry.h deleted file mode 100644 index e11b49fc53..0000000000 --- a/sysdeps/ia64/entry.h +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#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/ia64/gmon-entry.h b/sysdeps/ia64/gmon-entry.h new file mode 100644 index 0000000000..971da7ebd9 --- /dev/null +++ b/sysdeps/ia64/gmon-entry.h @@ -0,0 +1,7 @@ +#include +#include +#include + +/* The function's entry point is stored in the first word of the + function descriptor (plabel) of _start(). */ +#define TEXT_START ELF_PTR_TO_FDESC (_start)->ip diff --git a/sysdeps/powerpc/powerpc64/entry.h b/sysdeps/powerpc/powerpc64/gmon-entry.h similarity index 73% rename from sysdeps/powerpc/powerpc64/entry.h rename to sysdeps/powerpc/powerpc64/gmon-entry.h index 99c81cb982..04dbfd1231 100644 --- a/sysdeps/powerpc/powerpc64/entry.h +++ b/sysdeps/powerpc/powerpc64/gmon-entry.h @@ -1,5 +1,5 @@ -/* Finding the entry point and start of text. PowerPC64 version. - Copyright (C) 2002-2021 Free Software Foundation, Inc. +/* Entry point address for csu/gmon-start.c. powerpc64 version. + Copyright (C) 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 @@ -16,22 +16,15 @@ License along with the GNU C Library; if not, see . */ - -#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); - +#if _CALL_ELF == 2 +# include +#else +# include /* 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 \ +# define TEXT_START \ ({ extern unsigned long int _start_as_data[] asm ("_start"); \ - _start_as_data[0]; }) + _start_as_data[0]; }) #endif