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], [[email protected]]) +AC_INIT([rebase], [4.2.0], [[email protected]]) 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
