From d20db0561a6a36f914fde030512503b114ef9a0c Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Sat, 3 Aug 2024 06:28:41 +0000 Subject: automatic import of glibc --- ...table_start-as-the-lowest-address-for-pro.patch | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 Use-__executable_start-as-the-lowest-address-for-pro.patch (limited to 'Use-__executable_start-as-the-lowest-address-for-pro.patch') diff --git a/Use-__executable_start-as-the-lowest-address-for-pro.patch b/Use-__executable_start-as-the-lowest-address-for-pro.patch new file mode 100644 index 0000000..06ddfb1 --- /dev/null +++ b/Use-__executable_start-as-the-lowest-address-for-pro.patch @@ -0,0 +1,106 @@ +From 84a7eb1f87c1d01b58ad887a0ab5d87abbc1c772 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Fri, 30 Jul 2021 19:07:30 -0700 +Subject: [PATCH] Use __executable_start as the lowest address for profiling + [BZ #28153] + +Glibc assumes that ENTRY_POINT is the lowest address for which we need +to keep profiling records and BFD linker uses a linker script to place +the input sections. + +Starting from GCC 4.6, the main function is placed in .text.startup +section and starting from binutils 2.22, BFD linker with + +commit add44f8d5c5c05e08b11e033127a744d61c26aee +Author: Alan Modra +Date: Thu Nov 25 03:03:02 2010 +0000 + + * scripttempl/elf.sc: Group .text.exit, text.startup and .text.hot + sections. + +places .text.startup section before .text section, which leave the main +function out of profiling records. + +Starting from binutils 2.15, linker provides __executable_start to mark +the lowest address of the executable. Use __executable_start as the +lowest address to keep the main function in profiling records. This fixes +[BZ #28153]. + +Tested on Linux/x86-64, Linux/x32 and Linux/i686 as well as with +build-many-glibcs.py. +--- + csu/gmon-start.c | 10 +++++++++- + gmon/tst-gmon-gprof.sh | 2 ++ + gmon/tst-gmon-static-gprof.sh | 2 ++ + 3 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/csu/gmon-start.c b/csu/gmon-start.c +index b343288..344606a 100644 +--- a/csu/gmon-start.c ++++ b/csu/gmon-start.c +@@ -52,6 +52,11 @@ 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"))); ++ + #ifndef TEXT_START + # ifdef ENTRY_POINT_DECL + # define TEXT_START ENTRY_POINT +@@ -92,7 +97,10 @@ __gmon_start__ (void) + called = 1; + + /* Start keeping profiling records. */ +- __monstartup ((u_long) TEXT_START, (u_long) &etext); ++ if (&executable_start != NULL) ++ __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 + collected data. */ +diff --git a/gmon/tst-gmon-gprof.sh b/gmon/tst-gmon-gprof.sh +index 9d37158..dc0be02 100644 +--- a/gmon/tst-gmon-gprof.sh ++++ b/gmon/tst-gmon-gprof.sh +@@ -39,12 +39,14 @@ trap cleanup 0 + cat > "$expected" < "$expected_dot" < "$expected" < "$expected_dot" <