From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 86724 invoked by alias); 1 Apr 2015 11:27:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 86709 invoked by uid 89); 1 Apr 2015 11:27:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 01 Apr 2015 11:27:36 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CC125BBF5B for ; Wed, 1 Apr 2015 11:22:33 +0000 (UTC) Received: from blade.nx (ovpn-116-118.ams2.redhat.com [10.36.116.118]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t31BMWLR026074 for ; Wed, 1 Apr 2015 07:22:32 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id CC6B226410E for ; Wed, 1 Apr 2015 12:22:31 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH 4/7] Introduce linux_pid_to_exec_file Date: Wed, 01 Apr 2015 11:27:00 -0000 Message-Id: <1427887341-31819-5-git-send-email-gbenson@redhat.com> In-Reply-To: <1427887341-31819-1-git-send-email-gbenson@redhat.com> References: <1427887341-31819-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes X-SW-Source: 2015-04/txt/msg00019.txt.bz2 This commit introduces a new function, linux_pid_to_exec_file, that shared Linux code can use to discover the filename of the executable that was run to create a process on the system. gdb/ChangeLog: * nat/linux-nat.h (linux_pid_to_exec_file): New declaration. * nat/linux-nat.c: New file. * Makefile.in (common-linux-nat.o): New rule. * config/aarch64/linux.mh (NATDEPFILES): Add common-linux-nat.o. * config/alpha/alpha-linux.mh (NATDEPFILES): Likewise. * config/arm/linux.mh (NATDEPFILES): Likewise. * config/i386/linux.mh (NATDEPFILES): Likewise. * config/i386/linux64.mh (NATDEPFILES): Likewise. * config/ia64/linux.mh (NATDEPFILES): Likewise. * config/m32r/linux.mh (NATDEPFILES): Likewise. * config/m68k/linux.mh (NATDEPFILES): Likewise. * config/mips/linux.mh (NATDEPFILES): Likewise. * config/pa/linux.mh (NATDEPFILES): Likewise. * config/powerpc/linux.mh (NATDEPFILES): Likewise. * config/powerpc/ppc64-linux.mh (NATDEPFILES): Likewise. * config/powerpc/spu-linux.mh (NATDEPFILES): Likewise. * config/s390/linux.mh (NATDEPFILES): Likewise. * config/sparc/linux.mh (NATDEPFILES): Likewise. * config/sparc/linux64.mh (NATDEPFILES): Likewise. * config/tilegx/linux.mh (NATDEPFILES): Likewise. * config/xtensa/linux.mh (NATDEPFILES): Likewise. * linux-nat.c (linux_child_pid_to_exec_file): Factored out to new function linux_pid_to_exec_file in nat/linux-nat.c. gdb/gdbserver/ChangeLog: * Makefile.in (common-linux-nat.o): New rule. * configure.srv (srv_linux_obj): Add common-linux-nat.o. --- gdb/ChangeLog | 26 ++++++++++++++++++++++++++ gdb/Makefile.in | 4 ++++ gdb/config/aarch64/linux.mh | 2 +- gdb/config/alpha/alpha-linux.mh | 2 +- gdb/config/arm/linux.mh | 2 +- gdb/config/i386/linux.mh | 2 +- gdb/config/i386/linux64.mh | 2 +- gdb/config/ia64/linux.mh | 2 +- gdb/config/m32r/linux.mh | 2 +- gdb/config/m68k/linux.mh | 2 +- gdb/config/mips/linux.mh | 2 +- gdb/config/pa/linux.mh | 2 +- gdb/config/powerpc/linux.mh | 2 +- gdb/config/powerpc/ppc64-linux.mh | 2 +- gdb/config/powerpc/spu-linux.mh | 3 ++- gdb/config/s390/linux.mh | 2 +- gdb/config/sparc/linux.mh | 2 +- gdb/config/sparc/linux64.mh | 2 +- gdb/config/tilegx/linux.mh | 2 +- gdb/config/xtensa/linux.mh | 2 +- gdb/gdbserver/ChangeLog | 5 +++++ gdb/gdbserver/Makefile.in | 3 +++ gdb/gdbserver/configure.srv | 2 +- gdb/linux-nat.c | 10 +--------- gdb/nat/linux-nat.c | 37 +++++++++++++++++++++++++++++++++++++ gdb/nat/linux-nat.h | 9 +++++++++ 26 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 gdb/nat/linux-nat.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 907997b..6920358 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2310,6 +2310,10 @@ x86-linux-dregs.o: ${srcdir}/nat/x86-linux-dregs.c $(COMPILE) $(srcdir)/nat/x86-linux-dregs.c $(POSTCOMPILE) +common-linux-nat.o: ${srcdir}/nat/linux-nat.c + $(COMPILE) $(srcdir)/nat/linux-nat.c + $(POSTCOMPILE) + # # gdb/tui/ dependencies # diff --git a/gdb/config/aarch64/linux.mh b/gdb/config/aarch64/linux.mh index 7f96e4d..d22150a 100644 --- a/gdb/config/aarch64/linux.mh +++ b/gdb/config/aarch64/linux.mh @@ -22,7 +22,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o aarch64-linux-nat.o \ proc-service.o linux-thread-db.o linux-nat.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-osdata.o linux-waitpid.o \ - linux-personality.o + linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES= -ldl $(RDYNAMIC) diff --git a/gdb/config/alpha/alpha-linux.mh b/gdb/config/alpha/alpha-linux.mh index 2ea02a1..81b1199 100644 --- a/gdb/config/alpha/alpha-linux.mh +++ b/gdb/config/alpha/alpha-linux.mh @@ -3,7 +3,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o alpha-linux-nat.o \ fork-child.o proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o linux-personality.o + linux-waitpid.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The dynamically loaded libthread_db needs access to symbols in the diff --git a/gdb/config/arm/linux.mh b/gdb/config/arm/linux.mh index 549bf42..e92188a 100644 --- a/gdb/config/arm/linux.mh +++ b/gdb/config/arm/linux.mh @@ -4,7 +4,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o arm-linux-nat.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o linux-personality.o + linux-waitpid.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES= -ldl $(RDYNAMIC) diff --git a/gdb/config/i386/linux.mh b/gdb/config/i386/linux.mh index 9be2c5f..a32d940 100644 --- a/gdb/config/i386/linux.mh +++ b/gdb/config/i386/linux.mh @@ -6,7 +6,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ linux-btrace.o linux-waitpid.o linux-personality.o x86-linux.o \ - x86-linux-dregs.o + x86-linux-dregs.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The dynamically loaded libthread_db needs access to symbols in the diff --git a/gdb/config/i386/linux64.mh b/gdb/config/i386/linux64.mh index 224a2a9..7666814 100644 --- a/gdb/config/i386/linux64.mh +++ b/gdb/config/i386/linux64.mh @@ -6,7 +6,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ proc-service.o linux-thread-db.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-btrace.o \ linux-waitpid.o linux-personality.o x86-linux.o \ - x86-linux-dregs.o + x86-linux-dregs.o common-linux-nat.o NAT_FILE= config/nm-linux.h NAT_CDEPS = $(srcdir)/proc-service.list diff --git a/gdb/config/ia64/linux.mh b/gdb/config/ia64/linux.mh index 9dce22b..8d9dc12 100644 --- a/gdb/config/ia64/linux.mh +++ b/gdb/config/ia64/linux.mh @@ -6,7 +6,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-personality.o \ - linux-procfs.o linux-ptrace.o linux-waitpid.o + linux-procfs.o linux-ptrace.o linux-waitpid.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/config/m32r/linux.mh b/gdb/config/m32r/linux.mh index 6b810e6..d83df66 100644 --- a/gdb/config/m32r/linux.mh +++ b/gdb/config/m32r/linux.mh @@ -4,7 +4,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o \ m32r-linux-nat.o proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o linux-personality.o + linux-waitpid.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES= -ldl $(RDYNAMIC) diff --git a/gdb/config/m68k/linux.mh b/gdb/config/m68k/linux.mh index f3b3baa..1bc1d78 100644 --- a/gdb/config/m68k/linux.mh +++ b/gdb/config/m68k/linux.mh @@ -6,7 +6,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ linux-personality.o \ - linux-waitpid.o + linux-waitpid.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The dynamically loaded libthread_db needs access to symbols in the diff --git a/gdb/config/mips/linux.mh b/gdb/config/mips/linux.mh index d6a802f..577e410 100644 --- a/gdb/config/mips/linux.mh +++ b/gdb/config/mips/linux.mh @@ -5,7 +5,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o mips-linux-nat.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-waitpid.o \ linux-personality.o \ - mips-linux-watch.o + mips-linux-watch.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/config/pa/linux.mh b/gdb/config/pa/linux.mh index 9539b64..97230b8 100644 --- a/gdb/config/pa/linux.mh +++ b/gdb/config/pa/linux.mh @@ -4,7 +4,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ hppa-linux-nat.o proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-waitpid.o \ - linux-personality.o + linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/config/powerpc/linux.mh b/gdb/config/powerpc/linux.mh index 76e62c0..f8f8a6e 100644 --- a/gdb/config/powerpc/linux.mh +++ b/gdb/config/powerpc/linux.mh @@ -6,7 +6,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o \ ppc-linux-nat.o proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o linux-personality.o + linux-waitpid.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/config/powerpc/ppc64-linux.mh b/gdb/config/powerpc/ppc64-linux.mh index 7eb6507..f9194a0 100644 --- a/gdb/config/powerpc/ppc64-linux.mh +++ b/gdb/config/powerpc/ppc64-linux.mh @@ -6,7 +6,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o \ ppc-linux-nat.o proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o ppc-linux.o linux-personality.o + linux-waitpid.o ppc-linux.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The PowerPC has severe limitations on TOC size, and uses them even diff --git a/gdb/config/powerpc/spu-linux.mh b/gdb/config/powerpc/spu-linux.mh index d44aeeb..345ac8d 100644 --- a/gdb/config/powerpc/spu-linux.mh +++ b/gdb/config/powerpc/spu-linux.mh @@ -4,5 +4,6 @@ # PPU side of the Cell BE and debugging the SPU side. NATDEPFILES = spu-linux-nat.o fork-child.o inf-ptrace.o \ - linux-procfs.o linux-ptrace.o linux-waitpid.o linux-personality.o + linux-procfs.o linux-ptrace.o linux-waitpid.o \ + linux-personality.o common-linux-nat.o diff --git a/gdb/config/s390/linux.mh b/gdb/config/s390/linux.mh index e1ad899..9938e73 100644 --- a/gdb/config/s390/linux.mh +++ b/gdb/config/s390/linux.mh @@ -4,6 +4,6 @@ NATDEPFILES= inf-ptrace.o fork-child.o s390-linux-nat.o \ linux-thread-db.o proc-service.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ linux-personality.o \ - linux-waitpid.o + linux-waitpid.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/config/sparc/linux.mh b/gdb/config/sparc/linux.mh index bd7fc86..30cc477 100644 --- a/gdb/config/sparc/linux.mh +++ b/gdb/config/sparc/linux.mh @@ -5,7 +5,7 @@ NATDEPFILES= sparc-nat.o sparc-linux-nat.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-waitpid.o \ - linux-personality.o + linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The dynamically loaded libthread_db needs access to symbols in the diff --git a/gdb/config/sparc/linux64.mh b/gdb/config/sparc/linux64.mh index 86f984f..73fa282 100644 --- a/gdb/config/sparc/linux64.mh +++ b/gdb/config/sparc/linux64.mh @@ -5,7 +5,7 @@ NATDEPFILES= sparc-nat.o sparc64-nat.o sparc64-linux-nat.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-waitpid.o \ - linux-personality.o + linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list # The dynamically loaded libthread_db needs access to symbols in the diff --git a/gdb/config/tilegx/linux.mh b/gdb/config/tilegx/linux.mh index b5edcd4..cd5528d 100644 --- a/gdb/config/tilegx/linux.mh +++ b/gdb/config/tilegx/linux.mh @@ -6,7 +6,7 @@ NATDEPFILES= inf-ptrace.o fork-child.o \ proc-service.o linux-thread-db.o \ linux-nat.o linux-osdata.o linux-fork.o \ linux-procfs.o linux-ptrace.o linux-waitpid.o \ - linux-personality.o + linux-personality.o common-linux-nat.o # The dynamically loaded libthread_db needs access to symbols in the # gdb executable. diff --git a/gdb/config/xtensa/linux.mh b/gdb/config/xtensa/linux.mh index b4e59b3..9737442 100644 --- a/gdb/config/xtensa/linux.mh +++ b/gdb/config/xtensa/linux.mh @@ -5,7 +5,7 @@ NAT_FILE= config/nm-linux.h NATDEPFILES= inf-ptrace.o fork-child.o xtensa-linux-nat.o \ linux-thread-db.o proc-service.o \ linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ - linux-waitpid.o linux-personality.o + linux-waitpid.o linux-personality.o common-linux-nat.o NAT_CDEPS = $(srcdir)/proc-service.list LOADLIBES = -ldl $(RDYNAMIC) diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 9d698c6..e30636c 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -615,6 +615,9 @@ x86-linux.o: ../nat/x86-linux.c x86-linux-dregs.o: ../nat/x86-linux-dregs.c $(COMPILE) $< $(POSTCOMPILE) +common-linux-nat.o: ../nat/linux-nat.c + $(COMPILE) $< + $(POSTCOMPILE) aarch64.c : $(srcdir)/../regformats/aarch64.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/aarch64.dat aarch64.c diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 81dd235..11c9bc0 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -42,7 +42,7 @@ srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd # Linux object files. This is so we don't have to repeat # these files over and over again. -srv_linux_obj="linux-low.o linux-osdata.o linux-procfs.o linux-ptrace.o linux-waitpid.o linux-personality.o" +srv_linux_obj="linux-low.o linux-osdata.o linux-procfs.o linux-ptrace.o linux-waitpid.o linux-personality.o common-linux-nat.o" # Input is taken from the "${target}" variable. diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 0376299..de4dc1a 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4086,15 +4086,7 @@ linux_nat_thread_name (struct target_ops *self, struct thread_info *thr) static char * linux_child_pid_to_exec_file (struct target_ops *self, int pid) { - static char buf[PATH_MAX]; - char name[PATH_MAX]; - - xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid); - memset (buf, 0, PATH_MAX); - if (readlink (name, buf, PATH_MAX - 1) <= 0) - strcpy (buf, name); - - return buf; + return linux_pid_to_exec_file (pid); } /* Implement the to_xfer_partial interface for memory reads using the /proc diff --git a/gdb/nat/linux-nat.c b/gdb/nat/linux-nat.c new file mode 100644 index 0000000..b9deae3 --- /dev/null +++ b/gdb/nat/linux-nat.c @@ -0,0 +1,37 @@ +/* Native-dependent code for GNU/Linux + + Copyright (C) 2000-2015 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "common-defs.h" +#include "nat/linux-nat.h" + +/* See nat/linux-nat.h. */ + +char * +linux_pid_to_exec_file (int pid) +{ + static char buf[PATH_MAX]; + char name[PATH_MAX]; + + xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid); + memset (buf, 0, PATH_MAX); + if (readlink (name, buf, PATH_MAX - 1) <= 0) + strcpy (buf, name); + + return buf; +} diff --git a/gdb/nat/linux-nat.h b/gdb/nat/linux-nat.h index 7cdaf40..81c2edc 100644 --- a/gdb/nat/linux-nat.h +++ b/gdb/nat/linux-nat.h @@ -78,4 +78,13 @@ extern enum target_stop_reason lwp_stop_reason (struct lwp_info *lwp); extern void linux_stop_lwp (struct lwp_info *lwp); +/* Return the pathname of the executable file that was run to create + the process PID. If the executable file cannot be determined, NULL + is returned. Otherwise, a pointer to a character string containing + the pathname is returned. This string should be copied into a + buffer by the client if the string will not be immediately used, or + if it must persist. */ + +extern char *linux_pid_to_exec_file (int pid); + #endif /* LINUX_NAT_H */ -- 1.7.1