This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH] Add pldd(1)
- From: "Yaakov (Cygwin/X)" <yselkowitz at users dot sourceforge dot net>
- To: cygwin-patches at cygwin dot com
- Date: Fri, 24 Feb 2012 02:38:40 -0600
- Subject: [PATCH] Add pldd(1)
- Authentication-results: mr.google.com; spf=pass (google.com: domain of yselkowitz@gmail.com designates 10.42.155.193 as permitted sender) smtp.mail=yselkowitz@gmail.com; dkim=pass header.i=yselkowitz@gmail.com
The pldd(1) command apparently originates from Solaris and was added to
glibc-2.15[1]. Patches and new file attached.
Yaakov
[1] http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS
/* pldd.cc
Copyright 2012 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#define WIN32_LEAN_AND_MEAN
#define UNICODE
#include <errno.h>
#include <error.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/cygwin.h>
#include <cygwin/version.h>
#include <windows.h>
#include <psapi.h>
struct option longopts[] =
{
{"help", no_argument, NULL, '?'},
{"version", no_argument, NULL, 'V'},
{"usage", no_argument, NULL, 0},
{0, no_argument, NULL, 0}
};
const char *opts = "?V";
__attribute__((noreturn))
static void
print_help (void)
{
printf ("Usage: pldd [OPTION...] PID\n\n"
"List dynamic shared objects loaded into a process.\n\n"
" -?, --help Give this help list\n"
" --usage Give a short usage message\n"
" -V, --version Print program version\n");
exit (EXIT_SUCCESS);
}
__attribute__((noreturn))
static void
print_usage (void)
{
printf ("Usage: pldd [-?V] [--help] [--usage] [--version] PID\n");
exit (EXIT_SUCCESS);
}
__attribute__((noreturn))
static void
print_version ()
{
printf ("pldd (cygwin) %d.%d.%d\n"
"List dynamic shared objects loaded into process.\n"
"Copyright (C) 2012 Red Hat, Inc.\n\n"
"This program comes with NO WARRANTY, to the extent permitted by law.\n"
"You may redistribute copies of this program under the terms of\n"
"the Cygwin license. Please consult the CYGWIN_LICENSE file for details.\n",
CYGWIN_VERSION_DLL_MAJOR / 1000,
CYGWIN_VERSION_DLL_MAJOR % 1000,
CYGWIN_VERSION_DLL_MINOR);
exit (EXIT_SUCCESS);
}
__attribute__((noreturn))
static void
print_nargs (void)
{
fprintf (stderr, "Exactly one parameter with process ID required.\n"
"Try `pldd --help' or `pldd --usage' for more information.\n");
exit (EXIT_FAILURE);
}
int
main (int argc, char *argv[])
{
int optch, pid, winpid, i;
char *pidfile, *exefile, *exename;
FILE *fd;
HANDLE hProcess;
HMODULE hModules[1024];
DWORD cbModules;
while ((optch = getopt_long (argc, argv, opts, longopts, &optind)) != -1)
switch (optch)
{
case '?':
print_help ();
break;
case 'V':
print_version ();
break;
case 0:
if (strcmp( "usage", longopts[optind].name ) == 0)
print_usage ();
break;
default:
break;
}
argc -= optind;
argv += optind;
if (argc != 1)
print_nargs ();
pid = atoi (argv[0]);
if ((pid == 0))
error (1, 0, "invalid process ID '%s'", argv[0]);
pidfile = (char *) malloc (32);
sprintf(pidfile, "/proc/%d/winpid", pid);
fd = fopen (pidfile, "rb");
if (!fd)
error (1, ENOENT, "cannot open /proc/%d", pid);
fscanf (fd, "%d", &winpid);
exefile = (char *) malloc (32);
exename = (char *) malloc (MAX_PATH);
sprintf(exefile, "/proc/%d/exename", pid);
fd = fopen (exefile, "rb");
fscanf (fd, "%s", exename);
hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, winpid);
if (!hProcess)
error (1, EPERM, "cannot attach to process %d", pid);
printf ("%d:\t%s\n", pid, exename);
EnumProcessModules (hProcess, hModules, sizeof(hModules), &cbModules);
/* start at 1 to skip the executable itself */
for (i = 1; i < (cbModules / sizeof(HMODULE)); i++)
{
TCHAR winname[MAX_PATH];
char posixname[MAX_PATH];
GetModuleFileNameEx (hProcess, hModules[i], winname, MAX_PATH);
cygwin_conv_path (CCP_WIN_W_TO_POSIX, winname, posixname, MAX_PATH);
printf ("%s\n", posixname);
}
return 0;
}
2012-02-?? Yaakov Selkowitz <yselkowitz@...>
* Makefile.in (CYGWIN_BINS): Add pldd.
(pldd.exe): Add -lpsapi to ALL_LDFLAGS.
* pldd.c: New file.
* utils.sgml (pldd): New section.
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/winsup/utils/Makefile.in,v
retrieving revision 1.98
diff -u -p -r1.98 Makefile.in
--- Makefile.in 29 Jan 2012 09:41:06 -0000 1.98
+++ Makefile.in 24 Feb 2012 07:44:28 -0000
@@ -53,7 +53,7 @@ MINGW_CXX := ${srcdir}/mingw ${CX
# List all binaries to be linked in Cygwin mode. Each binary on this list
# must have a corresponding .o of the same name.
CYGWIN_BINS := ${addsuffix .exe,cygpath getconf getfacl ldd locale kill mkgroup \
- mkpasswd mount passwd ps regtool setfacl setmetamode ssp tzset umount}
+ mkpasswd mount passwd pldd ps regtool setfacl setmetamode ssp tzset umount}
# List all binaries to be linked in MinGW mode. Each binary on this list
# must have a corresponding .o of the same name.
@@ -81,6 +81,7 @@ ps.exe: ALL_LDFLAGS += -lcygwin -lpsapi
strace.exe: MINGW_LDFLAGS += -lntdll
ldd.exe: ALL_LDFLAGS += -lpsapi
+pldd.exe: ALL_LDFLAGS += -lpsapi
ldh.exe: MINGW_LDLIBS :=
ldh.exe: MINGW_LDFLAGS := -nostdlib -lkernel32
Index: utils.sgml
===================================================================
RCS file: /cvs/src/src/winsup/utils/utils.sgml,v
retrieving revision 1.99
diff -u -p -r1.99 utils.sgml
--- utils.sgml 4 Feb 2012 11:42:04 -0000 1.99
+++ utils.sgml 24 Feb 2012 07:44:28 -0000
@@ -1434,6 +1434,23 @@ some systems.</para>
</sect2>
+<sect2 id="pldd"><title>pldd</title>
+
+<screen>
+Usage: pldd [OPTION...] PID
+
+List dynamic shared objects loaded into a process.
+
+ -?, --help Give this help list
+ --usage Give a short usage message
+ -V, --version Print program version
+</screen>
+
+<para><command>pldd</command> prints the shared libraries (DLLs) loaded
+by the process with the given PID.</para>
+
+</sect2>
+
<sect2 id="ps"><title>ps</title>
<screen>
2012-02-?? Yaakov Selkowitz <yselkowitz@...>
* new-features.sgml (ov-new1.7.11): Document pldd.
Index: new-features.sgml
===================================================================
RCS file: /cvs/src/src/winsup/doc/new-features.sgml,v
retrieving revision 1.102
diff -u -p -r1.102 new-features.sgml
--- new-features.sgml 22 Feb 2012 02:06:15 -0000 1.102
+++ new-features.sgml 24 Feb 2012 08:27:09 -0000
@@ -5,6 +5,10 @@
<itemizedlist mark="bullet">
<listitem><para>
+New <command>pldd</command> command for listing DLLs loaded by a process.
+</para></listitem>
+
+<listitem><para>
New API: pthread_getname_np, pthread_setname_np, scandirat.
</para></listitem>