* Makefile.in (CYGWIN_BINS): Add pldd.

(pldd.exe): Add -lpsapi to ALL_LDFLAGS.
* pldd.c: New file.
* utils.sgml (pldd): New section.
This commit is contained in:
Yaakov Selkowitz 2012-02-24 10:19:01 +00:00
parent e3ed49775e
commit e2bf82d361
3 changed files with 164 additions and 1 deletions

View File

@ -53,7 +53,7 @@ MINGW_CXX := ${srcdir}/mingw ${CXX} -I${updir}
# 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 -lntdll
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

145
winsup/utils/pldd.c Normal file
View File

@ -0,0 +1,145 @@
/* 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;
}

View File

@ -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>