This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch/RFA] rebase: Add -n option.


Hi Jason,


per the discussion starting at
http://cygwin.com/ml/cygwin/2012-04/msg00443.html
I would like to apply the following patch to rebase and friends.


Thanks,
Corinna


    ChangeLog:

	* configure.ac (AC_INIT): Bump version to 4.2.0.
	* configure: Regenerate.
	* peflagsall.in: Set DefaultDynBase to 0 to remove the dynamicbase
	flag by default, rather than to set it.  Add .oct to DefaultSuffixes,
	just as in rebaseall.in.  Fix help text accordingly.
	* rebase.c (long_options): Add --no-dynamicbase.
	(short_options): Add -n.
	(parse_args): Handle -n/--no-dynamicbase option.  Set
	ReBaseDropDynamicbaseFlag flag.
	(usage): Add text for new -n/--no-dynamicbase option.
	* rebaseall.in: Call rebase with -n flag on Cygwin.
	* README: Document all aforementioned changes.

    imagehelper/ChangeLog:

	* imagehelper.h (ReBaseDropDynamicbaseFlag): Declare.
	* rebaseimage.cc: Include windows.h.  Handle old w32api releases.
	(ReBaseDropDynamicbaseFlag): Define.
	(ReBaseImage64): Drop IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE flag
	in DllCharacteristics if successfully rebased and
	ReBaseDropDynamicbaseFlag is true.


Index: README
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/README,v
retrieving revision 1.3
diff -u -p -r1.3 README
--- README	19 Mar 2012 17:57:48 -0000	1.3
+++ README	23 Apr 2012 17:27:52 -0000
@@ -142,8 +142,8 @@ dlls on your entire system:
 Both procedures may be combined into a single, 4-step procedure if desired.
 
 Note that by default, peflagsall will set the tsaware flag on all executables
-(ash.exe and peflags.exe themselves excluded), and will set the dynamicbase
-flag on all 'dll' and 'so' files (cygwin1.dll and cyglsa64.dll excluded).
+(ash.exe and peflags.exe themselves excluded), and will remove the dynamicbase
+flag on all 'dll', 'so' and 'oct' files (cygwin1.dll and cyglsa64.dll excluded).
 
 If you are used to using the -s option with rebaseall, to add additional
 suffixes to the rebase list (such as .oct), be warned that peflags behaves
@@ -176,7 +176,7 @@ where:
     -p => skip test for running ash or dash only.  This option is supposed to
           be used by Cygwin's setup tool.  Only use it if you know what you're
 	  doing!
-    -s => specify DLL suffix, use multiple if necessary (default: dll, so)
+    -s => specify DLL suffix, use multiple if necessary (default: dll, so, oct)
     -T => specify filelist (or stdin) to list additional files
     -4 => operate only on 32bit objects (ignore 64bit objects) (*)
     -8 => operate only on 64bit objects (ignore 32bit objects) (*)
@@ -197,15 +197,15 @@ The following is the peflagsall command 
 
     peflagsall [-p extra_args] [-d bool] [-t bool] [-s suffix] [-T FileList | -] [-vnh]
 
-    When invoked with no arguments, peflagsall modifies every cygwin exe|dll|so
-    on the system: .exe files have their tsaware flag set, while .dll and .so files
-    have their dynamicbase flag set. However, if any of [-d|-t|-s] are specified
-    then ONLY the actions so specified will occur.
+    When invoked with no arguments, peflagsall modifies every cygwin exe|dll|so|oct
+    on the system: .exe files have their tsaware flag set, while .dll, .so and .oct
+    files have their dynamicbase flag removed. However, if any of [-d|-t|-s] are
+    specified then ONLY the actions so specified will occur.
        -p extra_args   pass extra_args to peflags.exe
        -d bool         set the dynamicbase flag to 'bool' on all specified files
        -t bool         set the tsaware flag to 'bool' on all specified files
        -s suffix       search for all files with the specified suffix(es)
-                         default: 'exe|dll|so'
+                         default: 'exe|dll|so|oct'
        -T FileList     in addition to files located via the normal search and
                        suffix list, also operate on files listed in FileList
                        May be '-' which indicates stdin
@@ -244,6 +244,7 @@ The following is the rebase command line
                               files top-down from there.  Without this option the
                               files are rebased from BaseAddress bottom-up.
                               With the -s option, this option is implicitly set.
+      -n, --no-dynamicbase    Remove PE dynamicbase flag from rebased DLLs, if set.
       -o, --offset=OFFSET     Specify an additional offset between adjacent DLLs
                               when rebasing.  Default is no offset.
       -t, --touch             Use this option to make sure the file's modification
Index: configure.ac
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/configure.ac,v
retrieving revision 1.7
diff -u -p -r1.7 configure.ac
--- configure.ac	19 Mar 2012 17:57:48 -0000	1.7
+++ configure.ac	23 Apr 2012 17:27:52 -0000
@@ -2,7 +2,7 @@
 # configure.ac for rebase
 
 AC_PREREQ([2.64])
-AC_INIT([rebase], [4.1.0], [cygwin@cygwin.com])
+AC_INIT([rebase], [4.2.0], [cygwin@cygwin.com])
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_SRCDIR([peflags.c])
 AC_PREFIX_DEFAULT([/usr])
Index: peflagsall.in
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/peflagsall.in,v
retrieving revision 1.2
diff -u -p -r1.2 peflagsall.in
--- peflagsall.in	29 Jul 2011 13:17:44 -0000	1.2
+++ peflagsall.in	23 Apr 2012 17:27:52 -0000
@@ -28,12 +28,12 @@ ProgramName=${0##*/}
 ProgramOptions='p:d:t:s:T:knvh'
 DefaultExtraArgs=
 DefaultTSAware=1
-DefaultDynBase=1
+DefaultDynBase=0
 DefaultKeep=
 DefaultDoNothing=
 DefaultVerbose=
 DefaultFileList=
-DefaultSuffixes='exe|dll|so'
+DefaultSuffixes='exe|dll|so|oct'
 
 # Define functions
 usage_string="usage: $ProgramName [-p extra_args] [-d bool] [-t bool] [-s suffix] [-T FileList | -] [-vnh]"
@@ -47,14 +47,14 @@ long_help ()
 {
     echo "$usage_string"
     echo "When invoked with no arguments, $ProgramName modifies every cygwin $DefaultSuffixes"
-    echo "on the system: .exe files have their tsaware flag set, while .dll and .so files"
-    echo "have their dynamicbase flag set. However, if any of [-d|-t|-s] are specified"
-    echo "then ONLY the actions so specified will occur."
+    echo "on the system: .exe files have their tsaware flag set, while .dll, .so and .oct"
+    echo "files have their dynamicbase flag removed. However, if any of [-d|-t|-s] are"
+    echo "specified then ONLY the actions so specified will occur."
     echo "   -p extra_args   pass extra_args to peflags.exe"  
     echo "   -d bool         set the dynamicbase flag to 'bool' on all specified files"
     echo "   -t bool         set the tsaware flag to 'bool' on all specified files"
     echo "   -s suffix       search for all files with the specified suffix(es)"
-    echo "                     default: 'exe|dll|so'"
+    echo "                     default: 'exe|dll|so|oct'"
     echo "   -T FileList     in addition to files located via the normal search and"
     echo "                   suffix list, also operate on files listed in FileList"
     echo "                   May be '-' which indicates stdin"
Index: rebase.c
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebase.c,v
retrieving revision 1.14
diff -u -p -r1.14 rebase.c
--- rebase.c	26 Mar 2012 23:45:52 -0000	1.14
+++ rebase.c	23 Apr 2012 17:27:53 -0000
@@ -1072,13 +1072,13 @@ static struct option long_options[] = {
   {"database",	no_argument,	   NULL, 's'},
   {"touch",	no_argument,	   NULL, 't'},
   {"filelist",	required_argument, NULL, 'T'},
-  {"usage",	no_argument,	   NULL, 'h'},
+  {"no-dynamicbase", no_argument,  NULL, 'n'},
   {"verbose",	no_argument,	   NULL, 'v'},
   {"version",	no_argument,	   NULL, 'V'},
   {NULL,	no_argument,	   NULL,  0 }
 };
 
-static const char *short_options = "48b:dhio:qstT:vV";
+static const char *short_options = "48b:dhino:qstT:vV";
 
 void
 parse_args (int argc, char *argv[])
@@ -1126,6 +1126,9 @@ parse_args (int argc, char *argv[])
 	case 'T':
 	  file_list = optarg;
 	  break;
+	case 'n':
+	  ReBaseDropDynamicbaseFlag = TRUE;
+	  break;
 	case 'v':
 	  verbose = TRUE;
 	  break;
@@ -1278,6 +1281,7 @@ Rebase PE files, usually DLLs, to a spec
                           files top-down from there.  Without this option the\n\
                           files are rebased from BaseAddress bottom-up.\n\
                           With the -s option, this option is implicitly set.\n\
+  -n, --no-dynamicbase    Remove PE dynamicbase flag from rebased DLLs, if set.\n\
   -o, --offset=OFFSET     Specify an additional offset between adjacent DLLs\n\
                           when rebasing.  Default is no offset.\n\
   -t, --touch             Use this option to make sure the file's modification\n\
Index: rebaseall.in
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebaseall.in,v
retrieving revision 1.7
diff -u -p -r1.7 rebaseall.in
--- rebaseall.in	19 Mar 2012 17:57:48 -0000	1.7
+++ rebaseall.in	23 Apr 2012 17:27:53 -0000
@@ -33,6 +33,7 @@ ProgramOptions='48b:o:ps:tT:v'
 DefaultBaseAddress=0x70000000
 DefaultOffset=@DEFAULT_OFFSET_VALUE@
 DefaultTouch=
+DefaultNoDyn=
 DefaultVerbose=
 DefaultFileList=
 DefaultSuffixes='dll|so|oct'
@@ -57,6 +58,7 @@ trap cleanup 1 2 15
 BaseAddress=""
 Offset="${DefaultOffset}"
 Touch="${DefaultTouch}"
+NoDyn="${DefaultNoDyn}"
 Verbose="${DefaultVerbose}"
 FileList="${DefaultFileList}"
 Suffixes="${DefaultSuffixes}"
@@ -203,6 +205,9 @@ case $Platform in
       sed -e '/cygwin1\.dll$/d' -e '/cyglsa.*\.dll$/d' \
           -e '/sys-root\/mingw/d' -e 's/^/\//' \
           -e '/d?ash\.exe$/d' -e '/rebase\.exe$/d' >"${TmpFile}"
+      # Unconditionally add the -n flag so rebased DLLs get the
+      # dynamicbase flag removed.
+      NoDyn='-n'
     ;;
   mingw|msys)
     for f in /bin /lib
@@ -224,9 +229,9 @@ fi
 
 if [ -z "${BaseAddress}" ]
 then
-  rebase "${Verbose}" "${Touch}" -s "${Mach}" -T "${TmpFile}"
+  rebase "${Verbose}" "${Touch}" "${NoDyn}" -s "${Mach}" -T "${TmpFile}"
 else
-  rebase "${Verbose}" "${Touch}" -s "${Mach}" -b "${BaseAddress}" -o "${Offset}" -T "${TmpFile}"
+  rebase "${Verbose}" "${Touch}" "${NoDyn}" -s "${Mach}" -b "${BaseAddress}" -o "${Offset}" -T "${TmpFile}"
 fi
 ExitCode=$?
 
Index: imagehelper/imagehelper.h
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/imagehelper.h,v
retrieving revision 1.6
diff -u -p -r1.6 imagehelper.h
--- imagehelper/imagehelper.h	19 Mar 2012 17:57:49 -0000	1.6
+++ imagehelper/imagehelper.h	23 Apr 2012 17:27:53 -0000
@@ -30,6 +30,9 @@ extern "C" {
 /* Set to TRUE if ReBaseImage{64} should also set the files last write
    time to TimeStamp when the file has been successfully rebased. */
 extern BOOL ReBaseChangeFileTime;
+/* Set to TRUE, if rebasing should also drop the /DYNAMICBASE flag
+   from the PE flags. */
+extern BOOL ReBaseDropDynamicbaseFlag;
 
 BOOL ReBaseImage64(
   LPCSTR CurrentImageName,
Index: imagehelper/rebaseimage.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebaseimage.cc,v
retrieving revision 1.5
diff -u -p -r1.5 rebaseimage.cc
--- imagehelper/rebaseimage.cc	19 Mar 2012 17:57:49 -0000	1.5
+++ imagehelper/rebaseimage.cc	23 Apr 2012 17:27:53 -0000
@@ -21,10 +21,17 @@
 #include <iostream>
 #include <sstream>
 
+#include <windows.h>
+/* Take care of old w32api releases which screwed up the definition. */
+#ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
+# define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x40
+#endif
+
 #include "objectfile.h"
 #include "imagehelper.h"
 
 BOOL ReBaseChangeFileTime = FALSE;
+BOOL ReBaseDropDynamicbaseFlag = FALSE;
 
 BOOL ReBaseImage64 (
   LPCSTR CurrentImageName,
@@ -121,12 +128,22 @@ BOOL ReBaseImage64 (
       return false;
     }
 
-  if (!fGoingDown)
-    *NewImageBase += *NewImageSize;
-
   if (ReBaseChangeFileTime)
     dll.setFileTime (TimeStamp);
 
+  if (ReBaseDropDynamicbaseFlag)
+    {
+      if (dll.is64bit ())
+	ntheader64->OptionalHeader.DllCharacteristics
+	  &= ~IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
+      else
+	ntheader32->OptionalHeader.DllCharacteristics
+	  &= ~IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
+    }
+
+  if (!fGoingDown)
+    *NewImageBase += *NewImageSize;
+
   SetLastError(NO_ERROR);
   return true;
 }

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]