* dllfixdbg: Eliminate extra objcopy step.

This commit is contained in:
Christopher Faylor 2007-11-08 14:36:49 +00:00
parent 75a1688a39
commit a3ba550800
8 changed files with 121 additions and 30 deletions

View File

@ -1,3 +1,7 @@
2007-11-08 Christopher Faylor <me+cygwin@cgf.cx>
* dllfixdbg: Eliminate extra objcopy step.
2007-11-07 Pedro Alves <pedro_alves@portugalmail.pt> 2007-11-07 Pedro Alves <pedro_alves@portugalmail.pt>
* dllfixdbg: Pass --only-keep-debug to objcopy, instead of * dllfixdbg: Pass --only-keep-debug to objcopy, instead of

View File

@ -16,8 +16,7 @@ my $objdump = shift;
my @objcopy = ((shift)); my @objcopy = ((shift));
my $dll = shift; my $dll = shift;
my $dbg = shift; my $dbg = shift;
xit 0, @objcopy, '--only-keep-debug', $dll, $dbg; xit 0, @objcopy, '-R', '.gnu_debuglink_overlay', '--only-keep-debug', $dll, $dbg;
xit 0, @objcopy, '-R', '.gnu_debuglink_overlay', $dbg;
xit 0, @objcopy, '-g', '--add-gnu-debuglink=' . $dbg, $dll; xit 0, @objcopy, '-g', '--add-gnu-debuglink=' . $dbg, $dll;
open(OBJDUMP, '-|', "$objdump --headers $dll"); open(OBJDUMP, '-|', "$objdump --headers $dll");
my %section; my %section;

View File

@ -41,6 +41,17 @@ static const NO_COPY DWORD std_consts[] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
static const char *handle_to_fn (HANDLE, char *); static const char *handle_to_fn (HANDLE, char *);
#define DEVICE_PREFIX "\\device\\"
#define DEVICE_PREFIX_LEN sizeof (DEVICE_PREFIX) - 1
#define REMOTE "\\Device\\LanmanRedirector\\"
#define REMOTE_LEN sizeof (REMOTE) - 1
#define REMOTE1 "\\Device\\WinDfs\\Root\\"
#define REMOTE1_LEN sizeof (REMOTE1) - 1
#define NAMED_PIPE "\\Device\\NamedPipe\\"
#define NAMED_PIPE_LEN sizeof (NAMED_PIPE) - 1
#define POSIX_NAMED_PIPE "/Device/NamedPipe/"
#define POSIX_NAMED_PIPE_LEN sizeof (POSIX_NAMED_PIPE) - 1
/* Set aside space for the table of fds */ /* Set aside space for the table of fds */
void void
dtable_init () dtable_init ()
@ -283,7 +294,7 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
else else
dev = *console_dev; dev = *console_dev;
} }
else if (ft == FILE_TYPE_PIPE) else if (0 && ft == FILE_TYPE_PIPE)
{ {
if (fd == 0) if (fd == 0)
dev = *piper_dev; dev = *piper_dev;
@ -297,7 +308,12 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
else else
{ {
name = handle_to_fn (handle, (char *) alloca (CYG_MAX_PATH + 100)); name = handle_to_fn (handle, (char *) alloca (CYG_MAX_PATH + 100));
bin = 0; if (!strncasematch (name, POSIX_NAMED_PIPE, POSIX_NAMED_PIPE_LEN))
/* nothing */;
else if (fd == 0)
dev = *piper_dev;
else
dev = *pipew_dev;
} }
} }
@ -308,25 +324,31 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
fhandler_base *fh; fhandler_base *fh;
if (dev) if (dev)
fh = build_fh_dev (dev); fh = build_fh_dev (dev, name);
else else
fh = build_fh_name (name); fh = build_fh_name (name);
if (fh) if (fh)
cygheap->fdtab[fd] = fh; cygheap->fdtab[fd] = fh;
if (name)
{
bin = fh->pc_binmode ();
if (!bin) if (!bin)
{ {
bin = fh->get_default_fmode (O_RDWR); bin = fh->get_default_fmode (O_RDWR);
if (bin) if (!bin && dev)
/* nothing */;
else if (dev)
bin = O_BINARY; bin = O_BINARY;
else if (name != unknown_file) }
bin = fh->pc_binmode ();
} }
fh->init (handle, GENERIC_READ | GENERIC_WRITE, bin); DWORD access;
if (fd == 0)
access = GENERIC_READ;
else
access = GENERIC_WRITE; /* Should be rdwr for stderr but not sure that's
possible for some versions of handles */
fh->init (handle, access, bin);
set_std_handle (fd); set_std_handle (fd);
paranoid_printf ("fd %d, handle %p", fd, handle); paranoid_printf ("fd %d, handle %p", fd, handle);
} }
@ -825,11 +847,6 @@ dtable::vfork_child_fixup ()
} }
#endif /*NEWVFORK*/ #endif /*NEWVFORK*/
#define DEVICE_PREFIX "\\device\\"
#define DEVICE_PREFIX_LEN sizeof (DEVICE_PREFIX) - 1
#define REMOTE "\\Device\\LanmanRedirector\\"
#define REMOTE_LEN sizeof (REMOTE) - 1
static const char * static const char *
handle_to_fn (HANDLE h, char *posix_fn) handle_to_fn (HANDLE h, char *posix_fn)
{ {
@ -844,7 +861,7 @@ handle_to_fn (HANDLE h, char *posix_fn)
NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf), NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf),
NULL); NULL);
if (NT_SUCCESS (res)) if (!NT_SUCCESS (res))
{ {
strcpy (posix_fn, unknown_file); strcpy (posix_fn, unknown_file);
debug_printf ("NtQueryObject failed"); debug_printf ("NtQueryObject failed");
@ -901,6 +918,7 @@ handle_to_fn (HANDLE h, char *posix_fn)
} }
char *w32 = win32_fn; char *w32 = win32_fn;
bool justslash = false;
if (maxmatchlen) if (maxmatchlen)
{ {
n = strlen (maxmatchdos); n = strlen (maxmatchdos);
@ -910,15 +928,38 @@ handle_to_fn (HANDLE h, char *posix_fn)
memcpy (w32, maxmatchdos, n); memcpy (w32, maxmatchdos, n);
w32[n] = '\\'; w32[n] = '\\';
} }
else if (strncasematch (w32, NAMED_PIPE, NAMED_PIPE_LEN))
{
debug_printf ("pipe");
justslash = true;
}
else if (strncasematch (w32, REMOTE, REMOTE_LEN)) else if (strncasematch (w32, REMOTE, REMOTE_LEN))
{ {
w32 += REMOTE_LEN - 2; w32 += REMOTE_LEN - 2;
*w32 = '\\'; *w32 = '\\';
debug_printf ("remote drive"); debug_printf ("remote drive");
justslash = true;
}
else if (strncasematch (w32, REMOTE1, REMOTE1_LEN))
{
w32 += REMOTE1_LEN - 2;
*w32 = '\\';
debug_printf ("remote drive");
justslash = true;
} }
if (!justslash)
debug_printf ("derived path '%s'", w32);
cygwin_conv_to_full_posix_path (w32, posix_fn); cygwin_conv_to_full_posix_path (w32, posix_fn);
else
{
char *s, *d;
for (s = w32, d = posix_fn; *s; s++, d++)
if (*s == '\\')
*d = '/';
else
*d = *s;
}
debug_printf ("derived path '%s', posix '%s'", w32, posix_fn);
return posix_fn; return posix_fn;
} }

View File

@ -1639,6 +1639,7 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
switch (WaitForMultipleObjects (n, w4, false, INFINITE)) switch (WaitForMultipleObjects (n, w4, false, INFINITE))
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
debug_printf ("normal read");
if (!bytes || if (!bytes ||
GetOverlappedResult (h, get_overlapped (), bytes, false)) GetOverlappedResult (h, get_overlapped (), bytes, false))
res = 1; res = 1;
@ -1649,12 +1650,14 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes)
} }
break; break;
case WAIT_OBJECT_0 + 1: case WAIT_OBJECT_0 + 1:
debug_printf ("got a signal");
CancelIo (h); CancelIo (h);
set_errno (EINTR); set_errno (EINTR);
res = 0; res = 0;
break; break;
default: default:
err = GetLastError (); err = GetLastError ();
debug_printf ("WFMO error, %E");
goto err; goto err;
break; break;
} }

View File

@ -149,6 +149,7 @@ class fhandler_base
path_conv pc; path_conv pc;
virtual void set_name (path_conv &pc); virtual void set_name (path_conv &pc);
virtual void set_name (const char *s) {pc.set_normalized_path (s, false);}
int error () const {return pc.error;} int error () const {return pc.error;}
void set_error (int error) {pc.error = error;} void set_error (int error) {pc.error = error;}
bool exists () const {return pc.exists ();} bool exists () const {return pc.exists ();}
@ -546,6 +547,7 @@ public:
int __stdcall fadvise (_off64_t, _off64_t, int) __attribute__ ((regparm (3))); int __stdcall fadvise (_off64_t, _off64_t, int) __attribute__ ((regparm (3)));
int __stdcall ftruncate (_off64_t, bool) __attribute__ ((regparm (3))); int __stdcall ftruncate (_off64_t, bool) __attribute__ ((regparm (3)));
int ready_for_read (int fd, DWORD howlong); int ready_for_read (int fd, DWORD howlong);
void init (HANDLE, DWORD, mode_t);
static int create (fhandler_pipe *[2], unsigned, int); static int create (fhandler_pipe *[2], unsigned, int);
static int create_selectable (LPSECURITY_ATTRIBUTES, HANDLE&, HANDLE&, DWORD); static int create_selectable (LPSECURITY_ATTRIBUTES, HANDLE&, HANDLE&, DWORD);
}; };

View File

@ -34,6 +34,53 @@ fhandler_pipe::fhandler_pipe ()
need_fork_fixup (true); need_fork_fixup (true);
} }
void
fhandler_pipe::init (HANDLE f, DWORD a, mode_t bin)
{
// FIXME: Have to clean this up someday
if (!*get_win32_name () && get_name ())
{
char *hold_normalized_name = (char *) alloca (strlen (get_name ()) + 1);
strcpy (hold_normalized_name, get_name ());
char *s, *d;
for (s = hold_normalized_name, d = (char *) get_win32_name (); *s; s++, d++)
if (*s == '/')
*d = '\\';
else
*d = *s;
set_name (hold_normalized_name);
}
bool opened_properly = a & FILE_CREATE_PIPE_INSTANCE;
a &= ~FILE_CREATE_PIPE_INSTANCE;
if (!opened_properly)
{
NTSTATUS status;
IO_STATUS_BLOCK io;
HANDLE h = NULL;
DWORD access = SYNCHRONIZE;
if (a & GENERIC_READ)
access |= FILE_READ_DATA | FILE_READ_ATTRIBUTES;
if (a & GENERIC_WRITE)
access |= FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES;
OBJECT_ATTRIBUTES attr;
static UNICODE_STRING fname;
InitializeObjectAttributes (&attr, &fname, OBJ_CASE_INSENSITIVE, f, NULL);
small_printf ("f %p, h %p\n", f, h);
status = NtOpenFile (&h, a | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SEQUENTIAL_ONLY | FILE_SYNCHRONOUS_IO_ALERT);
if (!NT_SUCCESS (status))
system_printf ("Unable to reopen pipe %s, attributes %p, NT error: %p win32: %lu",
get_win32_name (), access, status, RtlNtStatusToDosError (status));
small_printf ("f %p, h %p\n", f, h);
CloseHandle (f);
f = h;
}
fhandler_base::init (f, a, bin);
setup_overlapped ();
}
extern "C" int sscanf (const char *, const char *, ...); extern "C" int sscanf (const char *, const char *, ...);
int int
@ -284,16 +331,14 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode)
fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev); fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev);
int binmode = mode & O_TEXT ?: O_BINARY; int binmode = mode & O_TEXT ?: O_BINARY;
fhs[0]->init (r, GENERIC_READ, binmode); fhs[0]->init (r, FILE_CREATE_PIPE_INSTANCE | GENERIC_READ, binmode);
fhs[1]->init (w, GENERIC_WRITE, binmode); fhs[1]->init (w, FILE_CREATE_PIPE_INSTANCE | GENERIC_WRITE, binmode);
if (mode & O_NOINHERIT) if (mode & O_NOINHERIT)
{ {
fhs[0]->close_on_exec (true); fhs[0]->close_on_exec (true);
fhs[1]->close_on_exec (true); fhs[1]->close_on_exec (true);
} }
fhs[0]->setup_overlapped ();
fhs[1]->setup_overlapped ();
res = 0; res = 0;
} }

View File

@ -743,8 +743,6 @@ readv (int fd, const struct iovec *const iov, const int iovcnt)
while (1) while (1)
{ {
sig_dispatch_pending ();
cygheap_fdget cfd (fd); cygheap_fdget cfd (fd);
if (cfd < 0) if (cfd < 0)
break; break;
@ -814,7 +812,6 @@ extern "C" ssize_t
writev (const int fd, const struct iovec *const iov, const int iovcnt) writev (const int fd, const struct iovec *const iov, const int iovcnt)
{ {
int res = -1; int res = -1;
sig_dispatch_pending ();
const ssize_t tot = check_iovec_for_write (iov, iovcnt); const ssize_t tot = check_iovec_for_write (iov, iovcnt);
cygheap_fdget cfd (fd); cygheap_fdget cfd (fd);