diff -urN rebase-4.4.1.orig/rebase.c rebase-4.4.1/rebase.c --- rebase-4.4.1.orig/rebase.c 2014-06-14 14:11:24.073986700 +0100 +++ rebase-4.4.1/rebase.c 2014-06-14 23:18:28.632106000 +0100 @@ -42,6 +42,7 @@ BOOL save_image_info (); BOOL load_image_info (); +void dedupe_image_info (); BOOL merge_image_info (); BOOL collect_image_info (const char *pathname); void print_image_info (); @@ -67,6 +68,12 @@ BOOL image_storage_flag = FALSE; BOOL image_oblivious_flag = FALSE; BOOL force_rebase_flag = FALSE; +/* Added to support MSYS2. If you do not use database mode (-s) +then the files are not sorted by name. Also, duplicates are +not removed from the list as a pre-process. Instead, a linear +search is performed over the already-processed files and if +the file in question was already done then it is skipped. */ +BOOL obey_order_flag = FALSE; ULONG offset = 0; int args_index = 0; BOOL verbose = FALSE; @@ -193,6 +200,12 @@ } #endif /* __CYGWIN__ */ + /* Start from here .. */ + if (obey_order_flag) + { + image_base = cygwin_dll_image_base + cygwin_dll_image_size; + } + /* Collect file list, if specified. */ if (file_list) { @@ -241,6 +254,8 @@ } else if (!image_storage_flag) { + dedupe_image_info (); + /* Rebase. */ ULONG64 new_image_base = image_base; for (i = 0; i < img_info_size; ++i) @@ -583,32 +598,46 @@ return img->flag.cannot_rebase; } -int -merge_image_info () +void +dedupe_image_info () { - int i, end; - img_info_t *match; - ULONG64 floating_image_base; + int i, j; - /* Sort new files from command line by name. */ - qsort (img_info_list + img_info_rebase_start, - img_info_size - img_info_rebase_start, sizeof (img_info_t), - img_info_name_cmp); + if (!obey_order_flag) + { + /* Sort new files from command line by name. */ + qsort (img_info_list + img_info_rebase_start, + img_info_size - img_info_rebase_start, sizeof (img_info_t), + img_info_name_cmp); + } /* Iterate through new files and eliminate duplicates. */ for (i = img_info_rebase_start; i + 1 < img_info_size; ++i) - if ((img_info_list[i].name_size == img_info_list[i + 1].name_size - && !strcmp (img_info_list[i].name, img_info_list[i + 1].name)) + for (j = i + 1; j < ((obey_order_flag == TRUE) ? i + 2 : img_info_size); ++j) + if ((img_info_list[i].name_size == img_info_list[j].name_size + && !strcmp (img_info_list[i].name, img_info_list[j].name)) #if defined(__CYGWIN__) || defined(__MSYS__) || !strcmp (img_info_list[i].name, CYGWIN_DLL) #endif ) { free (img_info_list[i].name); - memmove (img_info_list + i, img_info_list + i + 1, + memmove (img_info_list + i, img_info_list + j, (img_info_size - i - 1) * sizeof (img_info_t)); --img_info_size; --i; + --j; } +} + +int +merge_image_info () +{ + int i, end; + img_info_t *match; + ULONG64 floating_image_base; + + dedupe_image_info (); + /* Iterate through new files and see if they are already available in existing database. */ if (img_info_rebase_start) @@ -1196,8 +1225,13 @@ break; } } - - if ((image_base == 0 && perform_rebase_flag && !image_storage_flag) +#if defined(__CYGWIN__) || defined(__MSYS__) + if (image_base == 0) + { + obey_order_flag = TRUE; + } +#endif + if ((image_base == 0 && perform_rebase_flag && !image_storage_flag && !obey_order_flag) || (force_rebase_flag && !perform_rebase_flag)) { usage (); diff -urN rebase-4.4.1.orig/rebaseall.in rebase-4.4.1/rebaseall.in --- rebase-4.4.1.orig/rebaseall.in 2014-06-14 14:11:24.073986700 +0100 +++ rebase-4.4.1/rebaseall.in 2014-06-14 14:11:36.750711700 +0100 @@ -29,7 +29,7 @@ PATH=$(cd $tp2 && pwd):@bindir@:/bin ProgramName=${0##*/} -ProgramOptions='48b:o:ps:tT:v' +ProgramOptions='48b:io:ps:tT:v' DefaultBaseAddress=0x70000000 DefaultOffset=@DEFAULT_OFFSET_VALUE@ DefaultTouch= @@ -37,17 +37,18 @@ DefaultVerbose= DefaultFileList= DefaultSuffixes='dll|so|oct' +DatabaseFlag=-s # Define functions usage() { - echo "usage: ${ProgramName} [-b BaseAddress] [-o Offset] [-s DllSuffix] [-T FileList | -] [-4|-8] [-p] [-t] [-v]" + echo "usage: ${ProgramName} [-b BaseAddress] [-o Offset] [-s DllSuffix] [-T FileList | -] [-4|-8] [-p] [-t] [-i] [-v]" exit 1 } cleanup() { - rm -f "${TmpFile}" "${SortedFile}" + rm -f "${TmpFile}" exit ${ExitCode} } @@ -121,6 +122,8 @@ Touch="-t";; T) FileList="${OPTARG}";; + i) + DatabaseFlag=;; v) Verbose="-v";; \?) @@ -175,8 +178,8 @@ [ -f "${db_file}" ] && database_exists="yes" # If BaseAddress has not been specified, and the rebase database doesn't exist -# yet, set BaseAddress to default. -if [ -z "${BaseAddress}" -a "${database_exists}" != "yes" ] +# yet, set BaseAddress to default, unless ignore database has been specified. +if [ -z "${BaseAddress}" -a "${database_exists}" != "yes" -a -n "${DatabaseFlag}" ] then BaseAddress=$DefaultBaseAddress fi @@ -204,8 +207,15 @@ fi # Set temp file -SortedFile="$TmpDir/rebase.lst" -TmpFile="${SortedFile}.in" +TmpFile="$TmpDir/rebase.lst" +# Prepend user supplied file list, if any +if [ -n "${FileList}" ] +then + cat "${FileList}" >"${TmpFile}" +else + [ -f "${TmpFile}" ] && rm -f "${TmpFile}" + touch "${TmpFile}" +fi # Create rebase list case $Platform in @@ -214,7 +224,7 @@ grep -E "\.($Suffixes)\$" | 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}" + -e '/\/d\?ash\.exe$/d' -e '/\/rebase\.exe$/d' >>"${TmpFile}" # some interpreters include a method for installing addons outside of the # package manager, such as CPAN and RubyGems. for d in /usr/lib/perl5/site_perl /usr/lib/py*/site-packages \ @@ -257,20 +267,11 @@ ;; esac -# Append user supplied file list, if any -if [ -n "${FileList}" ] -then - cat "${FileList}" >>"${TmpFile}" -fi - -# Remove duplicates -sort -u "${TmpFile}" > "${SortedFile}" - if [ -z "${BaseAddress}" ] then - rebase "${Verbose}" "${Touch}" "${NoDyn}" -s "${Mach}" -T "${SortedFile}" + rebase "${Verbose}" "${Touch}" "${NoDyn}" "${DatabaseFlag}" "${Mach}" -T "${TmpFile}" else - rebase "${Verbose}" "${Touch}" "${NoDyn}" -s "${Mach}" -b "${BaseAddress}" -o "${Offset}" -T "${SortedFile}" + rebase "${Verbose}" "${Touch}" "${NoDyn}" "${DatabaseFlag}" "${Mach}" -b "${BaseAddress}" -o "${Offset}" -T "${TmpFile}" fi ExitCode=$?