This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.26-557-gd165ca6


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  d165ca64980f90ccace088670652cc203d1b5411 (commit)
      from  bc9620d040b7494f457ccb750c9797b47ed76ada (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d165ca64980f90ccace088670652cc203d1b5411

commit d165ca64980f90ccace088670652cc203d1b5411
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Oct 12 03:45:55 2017 -0700

    Support profiling PIE [BZ #22284]
    
    Since PIE can be loaded at any address, we need to subtract load address
    from PCs.
    
    	[BZ #22284]
    	* gmon/Makefile [$(have-fpie)$(build-shared) == yesyes] (tests,
    	tests-pie): Add tst-gmon-pie.
    	(CFLAGS-tst-gmon-pie.c): New.
    	(CRT-tst-gmon-pie): Likewise.
    	(tst-gmon-pie-ENV): Likewise.
    	[$(have-fpie)$(build-shared) == yesyes] (tests-special): Likewise.
    	($(objpfx)tst-gmon-pie.out): Likewise.
    	(clean-tst-gmon-pie-data): Likewise.
    	($(objpfx)tst-gmon-pie-gprof.out): Likewise.
    	* gmon/gmon.c [PIC]: Include <link.h>.
    	[PIC] (callback): New function.
    	(write_hist): Add an argument for load address.  Subtract load
    	address from PCs.
    	(write_call_graph): Likewise.
    	(write_gmon): Call __dl_iterate_phdr to get load address, pass
    	it to write_hist and write_call_graph.
    
    Reviewed-by: Carlos O'Donell <carlos@redhat.com>

diff --git a/ChangeLog b/ChangeLog
index e8f8382..90ffb8e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2017-10-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+	[BZ #22284]
+	* gmon/Makefile [$(have-fpie)$(build-shared) == yesyes] (tests,
+	tests-pie): Add tst-gmon-pie.
+	(CFLAGS-tst-gmon-pie.c): New.
+	(CRT-tst-gmon-pie): Likewise.
+	(tst-gmon-pie-ENV): Likewise.
+	[$(have-fpie)$(build-shared) == yesyes] (tests-special): Likewise.
+	($(objpfx)tst-gmon-pie.out): Likewise.
+	(clean-tst-gmon-pie-data): Likewise.
+	($(objpfx)tst-gmon-pie-gprof.out): Likewise.
+	* gmon/gmon.c [PIC]: Include <link.h>.
+	[PIC] (callback): New function.
+	(write_hist): Add an argument for load address.  Subtract load
+	address from PCs.
+	(write_call_graph): Likewise.
+	(write_gmon): Call __dl_iterate_phdr to get load address, pass
+	it to write_hist and write_call_graph.
+
 2017-10-11  Joseph Myers  <joseph@codesourcery.com>
 
 	* math/Makefile (test-types-basic): New variable.
diff --git a/gmon/Makefile b/gmon/Makefile
index 79e29d1..2cd077d 100644
--- a/gmon/Makefile
+++ b/gmon/Makefile
@@ -33,6 +33,11 @@ tests-static	+= tst-profile-static
 LDFLAGS-tst-profile-static = -profile
 endif
 
+ifeq (yesyes,$(have-fpie)$(build-shared))
+tests += tst-gmon-pie
+tests-pie += tst-gmon-pie
+endif
+
 # The mcount code won't work without a frame pointer.
 CFLAGS-mcount.c := -fno-omit-frame-pointer
 
@@ -44,6 +49,14 @@ ifeq ($(run-built-tests),yes)
 tests-special += $(objpfx)tst-gmon-gprof.out
 endif
 
+CFLAGS-tst-gmon-pie.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
+CRT-tst-gmon-pie := $(csu-objpfx)gcrt1.o
+tst-gmon-pie-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon-pie.data
+ifeq ($(run-built-tests),yes)
+tests-special += $(objpfx)tst-gmon-pie-gprof.out
+endif
+
+
 include ../Rules
 
 # We cannot compile mcount.c with -pg because that would
@@ -69,3 +82,11 @@ clean-tst-gmon-data:
 $(objpfx)tst-gmon-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon.out
 	$(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \
 	$(evaluate-test)
+
+$(objpfx)tst-gmon-pie.out: clean-tst-gmon-pie-data
+clean-tst-gmon-pie-data:
+	rm -f $(objpfx)tst-gmon-pie.data.*
+
+$(objpfx)tst-gmon-pie-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon-pie.out
+	$(SHELL) $< $(GPROF) $(objpfx)tst-gmon-pie $(objpfx)tst-gmon-pie.data.* > $@; \
+	$(evaluate-test)
diff --git a/gmon/gmon.c b/gmon/gmon.c
index f1aa3b7..dee6480 100644
--- a/gmon/gmon.c
+++ b/gmon/gmon.c
@@ -46,6 +46,26 @@
 #include <libc-internal.h>
 #include <not-cancel.h>
 
+#ifdef PIC
+# include <link.h>
+
+static int
+callback (struct dl_phdr_info *info, size_t size, void *data)
+{
+  if (info->dlpi_name[0] == '\0')
+    {
+      /* The link map for the executable is created by calling
+	 _dl_new_object with "" as filename.  dl_iterate_phdr
+	 calls the callback function with filename from the
+	 link map as dlpi_name.  */
+      u_long *load_address = data;
+      *load_address = (u_long) info->dlpi_addr;
+      return 1;
+    }
+
+  return 0;
+}
+#endif
 
 /*  Head of basic-block list or NULL. */
 struct __bb *__bb_head attribute_hidden;
@@ -63,8 +83,8 @@ static int	s_scale;
 void moncontrol (int mode);
 void __moncontrol (int mode);
 libc_hidden_proto (__moncontrol)
-static void write_hist (int fd);
-static void write_call_graph (int fd);
+static void write_hist (int fd, u_long load_address);
+static void write_call_graph (int fd, u_long load_address);
 static void write_bb_counts (int fd);
 
 /*
@@ -173,7 +193,7 @@ weak_alias (__monstartup, monstartup)
 
 
 static void
-write_hist (int fd)
+write_hist (int fd, u_long load_address)
 {
   u_char tag = GMON_TAG_TIME_HIST;
 
@@ -210,8 +230,8 @@ write_hist (int fd)
 	      != offsetof (struct gmon_hist_hdr, dimen_abbrev)))
 	abort ();
 
-      thdr.low_pc = (char *) _gmonparam.lowpc;
-      thdr.high_pc = (char *) _gmonparam.highpc;
+      thdr.low_pc = (char *) _gmonparam.lowpc - load_address;
+      thdr.high_pc = (char *) _gmonparam.highpc - load_address;
       thdr.hist_size = _gmonparam.kcountsize / sizeof (HISTCOUNTER);
       thdr.prof_rate = __profile_frequency ();
       strncpy (thdr.dimen, "seconds", sizeof (thdr.dimen));
@@ -223,7 +243,7 @@ write_hist (int fd)
 
 
 static void
-write_call_graph (int fd)
+write_call_graph (int fd, u_long load_address)
 {
 #define NARCS_PER_WRITEV	32
   u_char tag = GMON_TAG_CG_ARC;
@@ -266,8 +286,9 @@ write_call_graph (int fd)
 	    }
 	  arc;
 
-	  arc.frompc = (char *) frompc;
-	  arc.selfpc = (char *) _gmonparam.tos[to_index].selfpc;
+	  arc.frompc = (char *) frompc - load_address;
+	  arc.selfpc = ((char *) _gmonparam.tos[to_index].selfpc
+			- load_address);
 	  arc.count  = _gmonparam.tos[to_index].count;
 	  memcpy (raw_arc + nfilled, &arc, sizeof (raw_arc [0]));
 
@@ -376,11 +397,17 @@ write_gmon (void)
     memset (ghdr.spare, '\0', sizeof (ghdr.spare));
     __write_nocancel (fd, &ghdr, sizeof (struct gmon_hdr));
 
+    /* Get load_address to profile PIE.  */
+    u_long load_address = 0;
+#ifdef PIC
+    __dl_iterate_phdr (callback, &load_address);
+#endif
+
     /* write PC histogram: */
-    write_hist (fd);
+    write_hist (fd, load_address);
 
     /* write call-graph: */
-    write_call_graph (fd);
+    write_call_graph (fd, load_address);
 
     /* write basic-block execution counts: */
     write_bb_counts (fd);
diff --git a/gmon/tst-gmon-pie.c b/gmon/tst-gmon-pie.c
new file mode 100644
index 0000000..1eef258
--- /dev/null
+++ b/gmon/tst-gmon-pie.c
@@ -0,0 +1 @@
+#include "tst-gmon.c"

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog           |   20 ++++++++++++++++++++
 gmon/Makefile       |   21 +++++++++++++++++++++
 gmon/gmon.c         |   47 +++++++++++++++++++++++++++++++++++++----------
 gmon/tst-gmon-pie.c |    1 +
 4 files changed, 79 insertions(+), 10 deletions(-)
 create mode 100644 gmon/tst-gmon-pie.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]