Subject: Re: [PATCH] New --pe-dll-characteristcs switch for PE ld.
From: "Charles Wilson" <[email-masked]>
To: [email-masked]
Cc: "[email-masked]" <[email-masked]>
Date: Fri, 06 Mar 2009 14:06:07 -0500
List-Id: <cygwin.cygwin.com>

Christopher Faylor wrote:
> I would like to see an objcopy option at some point.  I don't agree with
> the prevailing cygwin opinion that you need a separate binary to deal
> with this.  It seems silly to have objcopy able to do only some things
> to a PE and, if objcopy can do this, then I don't see why you need an
> extra program to manipulate this field.

I agree that objcopy should be able to manipulate this (these) field(s).
However, having a simple tool that does a simple thing is The Unix Way.
Having a giant do-everything tool is...not.  For that we have Perl. <g>

[The following gets OT for binutils; I've CC:ed the cygwin list. If you
wish to continue this subthread, please take it over there]
Seriously, with regards to cygwin though, there are a few important
reasons for the bit-twiddler program to be separate from  objcopy, even
if it duplicates some of its functionality.

1) we're going to recommend that -- until everything in the cygwin
distro is rebuilt using a not-yet-available ld with new defaults --
users (including lusers and n00bs) -- run a bit-twiddler tool on many,
if not all, of the DLLs and EXEs in their installation. It would be bad
if this tool was developer-centric, with lots of confusing (to the
uninitiated) options that have the potential to seriously foul up the
target object(s) in unrecoverable ways, if used incorrectly.  Like
objcopy.  The bit-twiddler proggie, being so simple and limited in
scope, can always revert any changes it makes. Even when used by a n00b.

2) Do we really want all users -- who might not be developers -- who
happen to run in to a particular problem be forced to download and
install all of binutils, just for objcopy?

3) We're dealing with an issue where EXEs will not operate at all if
they do not have the correct DllCharacteristics bits.  Which exes suffer
from this limitation is not immediately obvious, and we don't know what
triggers the misbehavior (on WindowsTS, at least). So far we are "lucky"
-- it appears that the binutils tools such as nm and objcopy are NOT
affected by this issue, but we don't know why, nor if our "luck" will
change in the future. In the end, we might be forced to distribute the
bit-twiddler as a mingw app, not a cygwin one. I don't think we (cygwin)
want to distribute a standalone version of i686-pc-mingw32-objcopy, nor
as in #2 above, force all users (who happen to run in to ...) to
download mingw-cross-binutils.

4) The behavior of a specific bit-twiddler program can be tweaked to
better suit our intended purpose: to be called on a large list of files
ONCE to perform similar operations on all of those files, thus avoiding
lots of forks.  This is important not just for speed, but also because
the dynbase issue is the solution to a problem that fails specifically
when you're doing a lot of forks. (Granted, you could avoid this latter
issue by ensuring that the bit-twiddler program -- be it objdump or
peflags -- itself is only shipped with the dynbase flag preset). But
AFAIK objdump is not meant to operate in a "SIMD" manner -- that is, do
the same operation on an entire list of target objects. Rather, objcopy
takes exactly two file names: one input and one optional output.  If the
output file isn't specified, then the temporary modified version is
renamed over the input (which is the behavior we'd want to exploit for a
make-all-dynbase script -- or we'd do the rename manually IN that
script, having given objcopy an explicit temporary name for its output).
 That's a lot of extra disk writes and data copying -- again, slow. 
peflags operates inplace.

5) Why does cygwin ship rebase? Technically objcopy could and should do
this, too (even though that particular operation is a lot more
complicated than just setting a value in the PE file's header). But #1
thru #4 above all also apply with regards to rebase.exe, even if objcopy
had that capability.

--
Chuck

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/