public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Place ENTRY_POINT in .text.startup section [BZ #28153]
@ 2021-07-31  4:22 H.J. Lu
  2021-07-31  5:40 ` Andreas Schwab
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu @ 2021-07-31  4:22 UTC (permalink / raw)
  To: libc-alpha

Glibc assumes that ENTRY_POINT is the lowest address for which we need
to keep profiling records.  Since GCC 4.6, the main function is placed
in .text.startup section.  Because ENTRY_POINT in gcrt1.o, which is read
in by the linker first, is not placed in .text.startup section, linker
may place the main function below ENTRY_POINT which leaves the main
function out of profiling records.

Place ENTRY_POINT in .text.startup section fixes [BZ #28153].

Tested on Linux/x86-64 and Linux/i686 as well as with build-many-glibcs.py.
---
 gmon/tst-gmon-gprof.sh            | 2 ++
 gmon/tst-gmon-static-gprof.sh     | 2 ++
 sysdeps/aarch64/start.S           | 2 +-
 sysdeps/alpha/start.S             | 2 +-
 sysdeps/arc/start.S               | 1 +
 sysdeps/arm/start.S               | 2 +-
 sysdeps/csky/abiv2/start.S        | 2 +-
 sysdeps/hppa/start.S              | 2 +-
 sysdeps/i386/start.S              | 1 +
 sysdeps/ia64/start.S              | 1 +
 sysdeps/m68k/start.S              | 2 +-
 sysdeps/microblaze/start.S        | 2 +-
 sysdeps/mips/start.S              | 2 +-
 sysdeps/nios2/start.S             | 2 +-
 sysdeps/powerpc/powerpc32/start.S | 2 +-
 sysdeps/powerpc/powerpc64/start.S | 2 +-
 sysdeps/riscv/start.S             | 1 +
 sysdeps/s390/s390-32/start.S      | 2 +-
 sysdeps/s390/s390-64/start.S      | 2 +-
 sysdeps/sh/start.S                | 2 +-
 sysdeps/sparc/sparc32/start.S     | 2 +-
 sysdeps/sparc/sparc64/start.S     | 2 +-
 sysdeps/x86_64/start.S            | 1 +
 23 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/gmon/tst-gmon-gprof.sh b/gmon/tst-gmon-gprof.sh
index 9d371582b9..dc0be02110 100644
--- a/gmon/tst-gmon-gprof.sh
+++ b/gmon/tst-gmon-gprof.sh
@@ -39,12 +39,14 @@ trap cleanup 0
 cat > "$expected" <<EOF
 f1 2000
 f2 1000
+f3 1
 EOF
 
 # Special version for powerpc with function descriptors.
 cat > "$expected_dot" <<EOF
 .f1 2000
 .f2 1000
+.f3 1
 EOF
 
 "$GPROF" -C "$program" "$data" \
diff --git a/gmon/tst-gmon-static-gprof.sh b/gmon/tst-gmon-static-gprof.sh
index 79218df967..4cc99c80d0 100644
--- a/gmon/tst-gmon-static-gprof.sh
+++ b/gmon/tst-gmon-static-gprof.sh
@@ -39,6 +39,7 @@ trap cleanup 0
 cat > "$expected" <<EOF
 f1 2000
 f2 1000
+f3 1
 main 1
 EOF
 
@@ -46,6 +47,7 @@ EOF
 cat > "$expected_dot" <<EOF
 .f1 2000
 .f2 1000
+.f3 1
 .main 1
 EOF
 
diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S
index 417da8802b..4d982b6bd9 100644
--- a/sysdeps/aarch64/start.S
+++ b/sysdeps/aarch64/start.S
@@ -42,7 +42,7 @@
 					NULL
  */
 
-	.text
+	.section .text.startup,"ax",%progbits
 ENTRY(_start)
 	/* Create an initial frame with 0 LR and FP */
 	cfi_undefined (x30)
diff --git a/sysdeps/alpha/start.S b/sysdeps/alpha/start.S
index 65dcd4d392..0fb765c3f1 100644
--- a/sysdeps/alpha/start.S
+++ b/sysdeps/alpha/start.S
@@ -36,7 +36,7 @@
 
 #include <sysdep.h>
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.align 3
 	.globl _start
 	.ent _start, 0
diff --git a/sysdeps/arc/start.S b/sysdeps/arc/start.S
index 5302a57cab..33403535d4 100644
--- a/sysdeps/arc/start.S
+++ b/sysdeps/arc/start.S
@@ -33,6 +33,7 @@
         env[0...N]      environment variables (pointers)
         NULL.  */
 
+	.section .text.startup,"ax",%progbits
 ENTRY (ENTRY_POINT)
 
 	/* Needed to make gdb backtraces stop here.  */
diff --git a/sysdeps/arm/start.S b/sysdeps/arm/start.S
index 9b56bc0cca..756046dd9a 100644
--- a/sysdeps/arm/start.S
+++ b/sysdeps/arm/start.S
@@ -69,7 +69,7 @@
 	.syntax unified
 #endif
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,#function
 _start:
diff --git a/sysdeps/csky/abiv2/start.S b/sysdeps/csky/abiv2/start.S
index a565cfa87b..f2b0e74eb6 100644
--- a/sysdeps/csky/abiv2/start.S
+++ b/sysdeps/csky/abiv2/start.S
@@ -41,7 +41,7 @@
 
 #include <sysdep.h>
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start;
 	.type _start,@function;
 	.align 4;
diff --git a/sysdeps/hppa/start.S b/sysdeps/hppa/start.S
index 4a1877f8e8..86a21082e8 100644
--- a/sysdeps/hppa/start.S
+++ b/sysdeps/hppa/start.S
@@ -51,7 +51,7 @@
 .Lp__libc_start_main:
 	.word P%__libc_start_main
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.align 4
 	.globl _start
 	.export _start, ENTRY
diff --git a/sysdeps/i386/start.S b/sysdeps/i386/start.S
index 5296b27e65..16767de443 100644
--- a/sysdeps/i386/start.S
+++ b/sysdeps/i386/start.S
@@ -54,6 +54,7 @@
 
 #include <sysdep.h>
 
+	.section .text.startup,"ax",%progbits
 ENTRY (_start)
 	/* Clearing frame pointer is insufficient, use CFI.  */
 	cfi_undefined (eip)
diff --git a/sysdeps/ia64/start.S b/sysdeps/ia64/start.S
index b28f8cb429..e2b11f42d6 100644
--- a/sysdeps/ia64/start.S
+++ b/sysdeps/ia64/start.S
@@ -48,6 +48,7 @@
  *	out6:	stack_end
  */
 
+	.section .text.startup,"ax",%progbits
 	.align 32
 	.global _start
 
diff --git a/sysdeps/m68k/start.S b/sysdeps/m68k/start.S
index 98da4db9f3..b2a7f171a5 100644
--- a/sysdeps/m68k/start.S
+++ b/sysdeps/m68k/start.S
@@ -54,7 +54,7 @@
 
 #include <sysdep.h>
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,@function
 _start:
diff --git a/sysdeps/microblaze/start.S b/sysdeps/microblaze/start.S
index 6589bd4dc7..66c8d8a18d 100644
--- a/sysdeps/microblaze/start.S
+++ b/sysdeps/microblaze/start.S
@@ -33,7 +33,7 @@
    License along with the GNU C Library.  If not, see
    <https://www.gnu.org/licenses/>.  */
 
-    .text
+	.section .text.startup,"ax",%progbits
     .globl _start
     .type _start,@function
 _start:
diff --git a/sysdeps/mips/start.S b/sysdeps/mips/start.S
index 4ec42a2a7f..de0e95a9b8 100644
--- a/sysdeps/mips/start.S
+++ b/sysdeps/mips/start.S
@@ -71,7 +71,7 @@
 		      void (*rtld_fini) (void), void *stack_end)
 */
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl ENTRY_POINT
 	.type ENTRY_POINT,@function
 #ifndef __mips16
diff --git a/sysdeps/nios2/start.S b/sysdeps/nios2/start.S
index 7c9696977f..bb03937d6e 100644
--- a/sysdeps/nios2/start.S
+++ b/sysdeps/nios2/start.S
@@ -65,7 +65,7 @@
 	value, terminated by an AT_NULL tag.
 */
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,%function
 _start:
diff --git a/sysdeps/powerpc/powerpc32/start.S b/sysdeps/powerpc/powerpc32/start.S
index 39ce1a18ff..5671d5d7a8 100644
--- a/sysdeps/powerpc/powerpc32/start.S
+++ b/sysdeps/powerpc/powerpc32/start.S
@@ -56,7 +56,7 @@ L(start_addresses):
 	.long 	0 /* Used to be fini.  */
 	ASM_SIZE_DIRECTIVE(L(start_addresses))
 
-	.section ".text"
+	.section .text.startup,"ax",%progbits
 ENTRY(_start)
  /* Save the stack pointer, in case we're statically linked under Linux.  */
 	mr	r9,r1
diff --git a/sysdeps/powerpc/powerpc64/start.S b/sysdeps/powerpc/powerpc64/start.S
index 71c0c67926..e9b6a434f3 100644
--- a/sysdeps/powerpc/powerpc64/start.S
+++ b/sysdeps/powerpc/powerpc64/start.S
@@ -61,7 +61,7 @@ L(start_addresses):
 	.section	".toc","aw"
 .L01:
 	.tc	L(start_addresses)[TC],L(start_addresses)
-	.section ".text"
+	.section .text.startup,"ax",%progbits
 ENTRY (_start)
  /* Save the stack pointer, in case we're statically linked under Linux.  */
 	mr	r9,r1
diff --git a/sysdeps/riscv/start.S b/sysdeps/riscv/start.S
index 806f6aacd6..8bbf77d9dd 100644
--- a/sysdeps/riscv/start.S
+++ b/sysdeps/riscv/start.S
@@ -42,6 +42,7 @@
    a0 contains the address of a function to be passed to atexit.
    __libc_start_main wants this in a5.  */
 
+	.section .text.startup,"ax",%progbits
 ENTRY (ENTRY_POINT)
 	/* Terminate call stack by noting ra is undefined.  Use a dummy
 	   .cfi_label to force starting the FDE.  */
diff --git a/sysdeps/s390/s390-32/start.S b/sysdeps/s390/s390-32/start.S
index b6cfa4caf3..a418b7f1c6 100644
--- a/sysdeps/s390/s390-32/start.S
+++ b/sysdeps/s390/s390-32/start.S
@@ -55,7 +55,7 @@
 					NULL
 */
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,@function
 _start:
diff --git a/sysdeps/s390/s390-64/start.S b/sysdeps/s390/s390-64/start.S
index 4e6526308a..2bc7f89e6a 100644
--- a/sysdeps/s390/s390-64/start.S
+++ b/sysdeps/s390/s390-64/start.S
@@ -55,7 +55,7 @@
 					NULL
 */
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,@function
 _start:
diff --git a/sysdeps/sh/start.S b/sysdeps/sh/start.S
index 606ee59222..4beaf43f81 100644
--- a/sysdeps/sh/start.S
+++ b/sysdeps/sh/start.S
@@ -57,7 +57,7 @@
 					NULL
 */
 
-	.text
+	.section .text.startup,"ax",%progbits
 	.globl _start
 	.type _start,@function
 _start:
diff --git a/sysdeps/sparc/sparc32/start.S b/sysdeps/sparc/sparc32/start.S
index 00bf898fb9..073596d815 100644
--- a/sysdeps/sparc/sparc32/start.S
+++ b/sysdeps/sparc/sparc32/start.S
@@ -37,7 +37,7 @@
 #include <sysdep.h>
 
 
-	.section ".text"
+	.section .text.startup,"ax",%progbits
 	.align 4
 	.global _start
 	.type _start,#function
diff --git a/sysdeps/sparc/sparc64/start.S b/sysdeps/sparc/sparc64/start.S
index 8520717eba..ad65517ef8 100644
--- a/sysdeps/sparc/sparc64/start.S
+++ b/sysdeps/sparc/sparc64/start.S
@@ -37,7 +37,7 @@
 #include <sysdep.h>
 
 
-	.section ".text"
+	.section .text.startup,"ax",%progbits
 	.align 4
 	.global _start
 	.type _start,#function
diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S
index 1b3e36826b..ff5d1d2af4 100644
--- a/sysdeps/x86_64/start.S
+++ b/sysdeps/x86_64/start.S
@@ -55,6 +55,7 @@
 
 #include <sysdep.h>
 
+	.section .text.startup,"ax",%progbits
 ENTRY (_start)
 	/* Clearing frame pointer is insufficient, use CFI.  */
 	cfi_undefined (rip)
-- 
2.31.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Place ENTRY_POINT in .text.startup section [BZ #28153]
  2021-07-31  4:22 [PATCH] Place ENTRY_POINT in .text.startup section [BZ #28153] H.J. Lu
@ 2021-07-31  5:40 ` Andreas Schwab
  2021-07-31 12:42   ` H.J. Lu
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2021-07-31  5:40 UTC (permalink / raw)
  To: H.J. Lu via Libc-alpha

On Jul 30 2021, H.J. Lu via Libc-alpha wrote:

> Since GCC 4.6, the main function is placed in .text.startup section.

Not generally.

> Place ENTRY_POINT in .text.startup section fixes [BZ #28153].

The linker places .text.unlikely and .text.exit before .text.startup.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Place ENTRY_POINT in .text.startup section [BZ #28153]
  2021-07-31  5:40 ` Andreas Schwab
@ 2021-07-31 12:42   ` H.J. Lu
  0 siblings, 0 replies; 3+ messages in thread
From: H.J. Lu @ 2021-07-31 12:42 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: H.J. Lu via Libc-alpha

On Fri, Jul 30, 2021 at 10:40 PM Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> On Jul 30 2021, H.J. Lu via Libc-alpha wrote:
>
> > Since GCC 4.6, the main function is placed in .text.startup section.
>
> Not generally.
>
> > Place ENTRY_POINT in .text.startup section fixes [BZ #28153].
>
> The linker places .text.unlikely and .text.exit before .text.startup.

We can put it in .text.unlikely section.

> Andreas.
>
> --
> Andreas Schwab, schwab@linux-m68k.org
> GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
> "And now for something completely different."



-- 
H.J.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-07-31 12:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-31  4:22 [PATCH] Place ENTRY_POINT in .text.startup section [BZ #28153] H.J. Lu
2021-07-31  5:40 ` Andreas Schwab
2021-07-31 12:42   ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).