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:25:25 -0500
List-Id: <cygwin.cygwin.com>

[oops. I replied to a non-existent list, so binutils never saw this and
cygwin will see it twice. Sorry about that]

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/