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]

Re: [PATCH/rebase] x86_64 Cygwin (was Re: [PATCH 0/2 rebase] Handle CPAN/etc. DLLs in rebaseall)


Hi Jason,

On Feb 13 10:42, Corinna Vinschen wrote:
> On Feb 12 20:24, Jason Tishler wrote:
> > On Tue, Feb 12, 2013 at 12:01:52PM +0100, Corinna Vinschen wrote:
> > > On Feb 12 04:19, Yaakov wrote:
> > > > Then the conf.d could be in addition to my patch, in which case my
> > > > patch is just avoiding the need for the packages in question to
> > > > state that which we already know.
> > > 
> > > I'm ok with that, but ultimately it's Jason's call.
> > 
> > I'm fine with the above too.  Let me know when your patches are
> > committed and I will release rebase.
> 
> Here's a preliminary patch for 64 bit Cygwin.
> [...]

Below is an entirely new patch.  Not only that the cyg64 prefix got
dropped, but only With these changes rebase builds fine on
x86_64-pc-cygwin.  There are a few problems related to datatype
conversion, most of them can be fixed by simply casting another
part of the expression.

I uploaded a binary x86_64-pc-cygwin version of rebase, based on the
below patch, here:

  ftp://cygwin.com/pub/cygwin/64bit/rebase-4.4.0-1.x86_64.tar.xz


Ok to apply?


Thanks,
Corinna


	* peflags.c (main): Drop unused variable.
	(do_mark): Add unambiguous casts to arguments of printf statement.
	* rebase-db.c: Ditto, throughout.
	* rebase-dump.c: Ditto, throughout.
  	* rebase.c: Ditto.
	(main): Fix computation of 32 bit Cygwin DLL dead zone.  Handle x86_64
	Cygwin as well.
	(rebase): Remove unused variable.
  	* rebaseall.in: Take x86_64 Cygwin into account.

    imagehelper:

    	Throughout, tweak pointer expressions to use unambiguous cast
	on all supported platforms.
	* sections.cc (Exports::dump): Constify argument to avoid compiler
	warning.
	(Imports::dump): Ditto.
	* sections.h (SectionBase::getAdjust): Change type to ptrdiff_t.
	(SectionBase::adjust): Ditto.
	(Exports::dump): Constify argument in declaration to avoid compiler
	warning.
	(Imports::dump): Ditto.


Index: peflags.c
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/peflags.c,v
retrieving revision 1.9
diff -u -p -r1.9 peflags.c
--- peflags.c	11 Aug 2011 07:01:13 -0000	1.9
+++ peflags.c	15 Feb 2013 17:22:38 -0000
@@ -263,7 +263,7 @@ main (int argc, char *argv[])
   /* Operate on files in file list, if specified. */
   if (file_list)
     {
-      int status = 0, ret = 0;
+      int status = 0;
       char filename[MAX_PATH + 2];
       FILE *file = file_list_fopen (file_list);
 
@@ -461,8 +461,8 @@ do_mark (const char *pathname)
 		      printed_characteristic ? (int) strlen (pathname) + 2
 					     : 0, "",
 		      sizeof_vals[i].name,
-		      sizeof_vals[i].value,
-		      sizeof_vals[i].value,
+		      (uint64_t) sizeof_vals[i].value,
+		      (uint64_t) sizeof_vals[i].value,
 		      sizeof_vals[i].unit);
 	      printed_characteristic = TRUE;
 	    }
Index: rebase-db.c
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebase-db.c,v
retrieving revision 1.2
diff -u -p -r1.2 rebase-db.c
--- rebase-db.c	3 Aug 2011 13:40:16 -0000	1.2
+++ rebase-db.c	15 Feb 2013 17:22:38 -0000
@@ -62,9 +62,9 @@ dump_rebasedb_header (FILE *f, img_info_
       "  machine: %s\n"
       "  version: %d\n"
       "  base   : 0x%0*" PRIx64 "\n"
-      "  offset : 0x%08lx\n"
+      "  offset : 0x%08x\n"
       "  downflg: %s\n"
-      "  count  : %ld\n",
+      "  count  : %d\n",
       h->magic[0], h->magic[1], h->magic[2], h->magic[3],
       (h->machine == IMAGE_FILE_MACHINE_I386
       ? "i386"
@@ -73,10 +73,10 @@ dump_rebasedb_header (FILE *f, img_info_
         : "unknown")),
       h->version,
       (h->machine == IMAGE_FILE_MACHINE_I386 ? 8 : 12),
-      h->base,
-      h->offset,
+      (uint64_t) h->base,
+      (uint32_t) h->offset,
       (h->down_flag ? "true" : "false"),
-      h->count);
+      (uint32_t) h->count);
 }
 
 void
@@ -95,13 +95,13 @@ dump_rebasedb_entry (FILE *f,
       return;
     }
   fprintf (f,
-      "%-*s base 0x%0*" PRIx64 " size 0x%08lx slot 0x%08lx %c\n",
+      "%-*s base 0x%0*" PRIx64 " size 0x%08x slot 0x%08x %c\n",
       h->machine == IMAGE_FILE_MACHINE_I386 ? 45 : 41,
       entry->name,
       h->machine == IMAGE_FILE_MACHINE_I386 ? 8 : 12,
-      entry->base,
-      entry->size,
-      entry->slot_size,
+      (uint64_t) entry->base,
+      (uint32_t) entry->size,
+      (uint32_t) entry->slot_size,
       entry->flag.needs_rebasing ? '*' : ' ');
 }
 
Index: rebase-dump.c
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebase-dump.c,v
retrieving revision 1.3
diff -u -p -r1.3 rebase-dump.c
--- rebase-dump.c	13 Jul 2012 20:13:35 -0000	1.3
+++ rebase-dump.c	15 Feb 2013 17:22:38 -0000
@@ -125,7 +125,7 @@ load_image_info ()
     }
   if (verbose)
     printf ("== read %" PRIu64 " (0x%08" PRIx64 ") bytes (database header)\n",
-	    (unsigned long long) sizeof hdr, (unsigned long long) sizeof hdr);
+	    (uint64_t) sizeof hdr, (uint64_t) sizeof hdr);
 
   /* Check the header. */
   if (memcmp (hdr.magic, IMG_INFO_MAGIC, 4) != 0)
@@ -150,8 +150,8 @@ load_image_info ()
   if (hdr.version != IMG_INFO_VERSION)
     {
       fprintf (stderr, "%s: \"%s\" is a version %u rebase database.\n"
-		       "I can only handle versions up to %lu.\n",
-	       progname, db_file, hdr.version, IMG_INFO_VERSION);
+		       "I can only handle versions up to %u.\n",
+	       progname, db_file, hdr.version, (uint32_t) IMG_INFO_VERSION);
       close (fd);
       return -1;
     }
@@ -179,8 +179,8 @@ load_image_info ()
   if (ret == 0 && verbose)
     {
       printf ("== read %" PRIu64 " (0x%08" PRIx64 ") bytes (database w/o strings)\n",
-              (unsigned long long) img_info_size * sizeof (img_info_t),
-              (unsigned long long) img_info_size * sizeof (img_info_t));
+              (uint64_t) img_info_size * sizeof (img_info_t),
+              (uint64_t) img_info_size * sizeof (img_info_t));
     }
   /* Make sure all pointers are NULL (also dump db as read) */
   if (ret == 0)
@@ -192,13 +192,13 @@ load_image_info ()
         {
           img_info_list[i].name = NULL;
 	  if (verbose)
-            printf ("%03d: base 0x%0*" PRIx64 " size 0x%08lx slot 0x%08lx namesize %4ld %c\n",
+            printf ("%03d: base 0x%0*" PRIx64 " size 0x%08x slot 0x%08x namesize %4d %c\n",
 	            i,
 	            hdr.machine == IMAGE_FILE_MACHINE_I386 ? 8 : 12,
-	            img_info_list[i].base,
-	            img_info_list[i].size,
-	            img_info_list[i].slot_size,
-	            img_info_list[i].name_size,
+	            (uint64_t) img_info_list[i].base,
+	            (uint32_t) img_info_list[i].size,
+	            (uint32_t) img_info_list[i].slot_size,
+	            (uint32_t) img_info_list[i].name_size,
 	            img_info_list[i].flag.needs_rebasing ? '*' : ' ');
         }
     }
@@ -229,9 +229,9 @@ load_image_info ()
 	    }
 	  else if (verbose)
 	    {
-              printf ("%03d: namesize %4ld (0x%04lx) %s\n", i,
-		      img_info_list[i].name_size,
-		      img_info_list[i].name_size,
+              printf ("%03d: namesize %4d (0x%04x) %s\n", i,
+		      (uint32_t) img_info_list[i].name_size,
+		      (uint32_t) img_info_list[i].name_size,
 		      img_info_list[i].name);
 	    }
 	}
Index: rebase.c
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebase.c,v
retrieving revision 1.17
diff -u -p -r1.17 rebase.c
--- rebase.c	16 Jan 2013 16:15:40 -0000	1.17
+++ rebase.c	15 Feb 2013 17:22:39 -0000
@@ -163,15 +163,23 @@ main (int argc, char *argv[])
 	 into the memory area taken by the Cygwin DLL. */
       GetImageInfos64 ("/bin/cygwin1.dll", NULL,
 		       &cygwin_dll_image_base, &cygwin_dll_image_size);
-      /* Take the three shared memory areas preceeding the DLL into account. */
-      cygwin_dll_image_base -= 3 * ALLOCATION_SLOT;
+      /* Take the up to four shared memory areas preceeding the DLL into
+      	 account. */
+      cygwin_dll_image_base -= 4 * ALLOCATION_SLOT;
       /* Add a slack of 8 * 64K at the end of the Cygwin DLL.  This leave a
 	 bit of room to install newer, bigger Cygwin DLLs, as well as room to
 	 install non-optimized DLLs for debugging purposes.  Otherwise the
 	 slightest change might break fork again :-P */
-      cygwin_dll_image_size += 3 * ALLOCATION_SLOT + 8 * ALLOCATION_SLOT;
+      cygwin_dll_image_size += 4 * ALLOCATION_SLOT + 8 * ALLOCATION_SLOT;
     }
-#endif
+  else
+    {
+      /* On x86_64 Cygwin, we want to keep free the whole 2 Gigs area in which
+	 the Cygwin DLL resides, no matter what. */
+      cygwin_dll_image_base = 0x180000000L;
+      cygwin_dll_image_size = 0x080000000L;
+    }
+#endif /* __CYGWIN__ */
 
   /* Collect file list, if specified. */
   if (file_list)
@@ -449,8 +457,8 @@ load_image_info ()
   if (hdr.version != IMG_INFO_VERSION)
     {
       fprintf (stderr, "%s: \"%s\" is a version %u rebase database.\n"
-		       "I can only handle versions up to %lu.\n",
-	       progname, db_file, hdr.version, IMG_INFO_VERSION);
+		       "I can only handle versions up to %u.\n",
+	       progname, db_file, hdr.version, (uint32_t) IMG_INFO_VERSION);
       close (fd);
       return -1;
     }
@@ -966,12 +974,12 @@ print_image_info ()
 	  img_info_list[i].flag.needs_rebasing = 1;
 	  img_info_list[tst].flag.needs_rebasing = 1;
 	}
-      printf ("%-*s base 0x%0*" PRIx64 " size 0x%08lx %c\n",
+      printf ("%-*s base 0x%0*" PRIx64 " size 0x%08x %c\n",
 	      name_width,
 	      img_info_list[i].name,
 	      machine == IMAGE_FILE_MACHINE_I386 ? 8 : 12,
-	      img_info_list[i].base,
-	      img_info_list[i].size,
+	      (uint64_t) img_info_list[i].base,
+	      (uint32_t) img_info_list[i].size,
 	      img_info_list[i].flag.needs_rebasing ? '*' : ' ');
     }
 }
@@ -981,7 +989,7 @@ rebase (const char *pathname, ULONG64 *n
 {
   ULONG64 old_image_base, prev_new_image_base;
   ULONG old_image_size, new_image_size;
-  BOOL status, status2;
+  BOOL status;
 
   /* Skip if not writable. */
   if (access (pathname, W_OK) == -1)
@@ -1001,56 +1009,56 @@ retry:
 
   /* Rebase the image. */
   prev_new_image_base = *new_image_base;
-  status = ReBaseImage64 ((char*) pathname,	/* CurrentImageName */
-			  "",			/* SymbolPath */
-			  TRUE,			/* fReBase */
-			  FALSE,		/* fRebaseSysfileOk */
-			  down_flag,		/* fGoingDown */
-			  0,			/* CheckImageSize */
-			  &old_image_size,	/* OldImageSize */
-			  &old_image_base,	/* OldImageBase */
-			  &new_image_size,	/* NewImageSize */
-			  new_image_base,	/* NewImageBase */
-			  time (0));		/* TimeStamp */
+  ReBaseImage64 ((char*) pathname,	/* CurrentImageName */
+		 "",			/* SymbolPath */
+		 TRUE,			/* fReBase */
+		 FALSE,		/* fRebaseSysfileOk */
+		 down_flag,		/* fGoingDown */
+		 0,			/* CheckImageSize */
+		 &old_image_size,	/* OldImageSize */
+		 &old_image_base,	/* OldImageBase */
+		 &new_image_size,	/* NewImageSize */
+		 new_image_base,	/* NewImageBase */
+		 time (0));		/* TimeStamp */
 
   /* MS's ReBaseImage seems to never return false! */
-  status2 = GetLastError ();
+  status = GetLastError ();
 
   /* If necessary, attempt to fix bad relocations. */
-  if (status2 == ERROR_INVALID_DATA)
+  if (status == ERROR_INVALID_DATA)
     {
       if (verbose)
 	fprintf (stderr, "%s: fixing bad relocations\n", pathname);
       BOOL status3 = FixImage ((char*) pathname);
       if (!status3)
 	{
-	  fprintf (stderr, "FixImage (%s) failed with last error = %lu\n",
-		   pathname, GetLastError ());
+	  fprintf (stderr, "FixImage (%s) failed with last error = %u\n",
+		   pathname, (uint32_t) GetLastError ());
 	  return FALSE;
 	}
 
       /* Retry rebase.*/
-      status = ReBaseImage64 ((char*) pathname,	/* CurrentImageName */
-			      "",		/* SymbolPath */
-			      TRUE,		/* fReBase */
-			      FALSE,		/* fRebaseSysfileOk */
-			      down_flag,	/* fGoingDown */
-			      0,		/* CheckImageSize */
-			      &old_image_size,	/* OldImageSize */
-			      &old_image_base,	/* OldImageBase */
-			      &new_image_size,	/* NewImageSize */
-			      new_image_base,	/* NewImageBase */
-			      time (0));	/* TimeStamp */
+      ReBaseImage64 ((char*) pathname,	/* CurrentImageName */
+		     "",		/* SymbolPath */
+		     TRUE,		/* fReBase */
+		     FALSE,		/* fRebaseSysfileOk */
+		     down_flag,	/* fGoingDown */
+		     0,		/* CheckImageSize */
+		     &old_image_size,	/* OldImageSize */
+		     &old_image_base,	/* OldImageBase */
+		     &new_image_size,	/* NewImageSize */
+		     new_image_base,	/* NewImageBase */
+		     time (0));	/* TimeStamp */
 
       /* MS's ReBaseImage seems to never return false! */
-      status2 = GetLastError ();
+      status = GetLastError ();
     }
 
   /* Check status of rebase. */
-  if (status2 != 0)
+  if (status != 0)
     {
-      fprintf (stderr, "ReBaseImage (%s) failed with last error = %lu\n",
-	       pathname, GetLastError ());
+      fprintf (stderr, "ReBaseImage (%s) failed with last error = %u\n",
+	       pathname, (uint32_t) GetLastError ());
       return FALSE;
     }
 
@@ -1070,10 +1078,10 @@ retry:
   /* Display rebase results, if verbose. */
   if (verbose)
     {
-      printf ("%s: new base = %" PRIx64 ", new size = %lx\n",
+      printf ("%s: new base = %" PRIx64 ", new size = %x\n",
 	      pathname,
-	      ((down_flag) ? *new_image_base : prev_new_image_base),
-	      new_image_size + offset);
+	      (uint64_t) ((down_flag) ? *new_image_base : prev_new_image_base),
+	      (uint32_t) new_image_size + offset);
     }
 
   /* Calculate next base address, if rebasing up. */
@@ -1196,7 +1204,7 @@ parse_args (int argc, char *argv[])
     {
       fprintf (stderr,
 	       "%s: Base address 0x%" PRIx64 " too big for 32 bit machines.\n",
-	       progname, image_base);
+	       progname, (uint64_t) image_base);
       exit (1);
     }
 
Index: rebaseall.in
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/rebaseall.in,v
retrieving revision 1.9
diff -u -p -r1.9 rebaseall.in
--- rebaseall.in	7 Jun 2012 18:50:33 -0000	1.9
+++ rebaseall.in	15 Feb 2013 17:22:39 -0000
@@ -88,6 +88,15 @@ case $Platform in
     ;;
 esac
 
+# On x86_64 Cygwin, set DefaultAddressBase to 0x4:00000000
+case $Platform in
+  cygwin )
+    [ `uname -m` = "x86_64" ] && DefaultBaseAddress=0x400000000
+    ;;
+  * )
+    ;;
+esac
+  
 # Parse command line arguments
 while getopts "${ProgramOptions}" Option "$@"
 do
Index: imagehelper/objectfile.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/objectfile.cc,v
retrieving revision 1.8
diff -u -p -r1.8 objectfile.cc
--- imagehelper/objectfile.cc	3 Aug 2011 10:33:11 -0000	1.8
+++ imagehelper/objectfile.cc	15 Feb 2013 17:22:39 -0000
@@ -260,7 +260,7 @@ bool LinkedObjectFile::rebind(ObjectFile
     {
       bool autoImportFlag;
       int *patch_address;
-      char *dllname = (char *)p->Name + idata->getAdjust();
+      char *dllname = (char *)idata->getAdjust() + p->Name;
       //  std::cerr << dllname << std::endl;
 
       if (!(obj = (LinkedObjectFile *)cache.get(dllname) ) )
@@ -408,7 +408,7 @@ bool LinkedObjectFile::PrintDependencies
   while ((p = imports->getNextDescriptor()) != NULL)
     {
       Section *sect = sections->find(p->Name);
-      char *dllname = (char *)p->Name + sect->getAdjust();
+      char *dllname = (char *)sect->getAdjust() + p->Name;
 
       if (!(obj = (LinkedObjectFile *)cache.get(dllname) ) )
         {
Index: imagehelper/sections.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.cc,v
retrieving revision 1.5
diff -u -p -r1.5 sections.cc
--- imagehelper/sections.cc	16 Jan 2013 12:47:26 -0000	1.5
+++ imagehelper/sections.cc	15 Feb 2013 17:22:39 -0000
@@ -151,9 +151,9 @@ uint Exports::getVirtualAddress(char *sy
     return 0;
 
   int n = exports->NumberOfFunctions;
-  uint *p = (unsigned int *)((char *)exports->AddressOfFunctions + adjust);
-  char **s = (char **)((char *)exports->AddressOfNames + adjust);
-  ushort *o = (ushort *)((char *)exports->AddressOfNameOrdinals + adjust);
+  uint *p = (unsigned int *)((char *)adjust + exports->AddressOfFunctions);
+  char **s = (char **)((char *)adjust + exports->AddressOfNames);
+  ushort *o = (ushort *)((char *)adjust + exports->AddressOfNameOrdinals);
   for (int i = 0; i < n; i++,p++,s++)
     {
       if (strcmp(symbol,*s+adjust) == 0)
@@ -178,7 +178,7 @@ char *Exports::getNext(void)
 
   if (iterator < exports->NumberOfNames)
     {
-      char **s = (char **)((char *)exports->AddressOfNames + adjust);
+      char **s = (char **)((char *)adjust + exports->AddressOfNames);
       return (char *)(*(s+iterator++) + adjust);
     }
   else
@@ -186,7 +186,7 @@ char *Exports::getNext(void)
 }
 
 
-void Exports::dump(char *title)
+void Exports::dump(const char *title)
 {
 
   char *p;
@@ -241,7 +241,7 @@ ImportDescriptor *Imports::getNextDescri
     return 0;
 }
 
-void Imports::dump(char *title)
+void Imports::dump(const char *title)
 {
   ImportDescriptor *p;
 
@@ -257,7 +257,7 @@ void Imports::dump(char *title)
       std::cout << std::setw(8) << std::setfill('0') << std::hex << p->OriginalFirstThunk << std::dec << " ";
       std::cout << std::setw(8) << std::setfill('0') << std::hex << p->TimeDateStamp << std::dec << "  ";
       std::cout << std::setw(8) << std::setfill('0') << std::hex << p->ForwarderChain << std::dec << " ";
-      std::cout << std::setw(8) << std::setfill('0') << std::hex << (void *)p->Name << std::dec << "  ";
+      std::cout << std::setw(8) << std::setfill('0') << std::hex << p->Name << std::dec << "  ";
       std::cout << std::setw(8) << std::setfill('0') << std::hex << p->FirstThunk << std::dec << std::endl;
 
     }
Index: imagehelper/sections.h
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.h,v
retrieving revision 1.6
diff -u -p -r1.6 sections.h
--- imagehelper/sections.h	16 Jan 2013 12:47:26 -0000	1.6
+++ imagehelper/sections.h	15 Feb 2013 17:22:39 -0000
@@ -84,13 +84,13 @@ class Base
 class SectionBase : public Base
   {
   public:
-    int getAdjust()
+    ptrdiff_t getAdjust()
     {
       return adjust;
     }
 
   protected:
-    int adjust;
+    ptrdiff_t adjust;
   private:
   };
 
@@ -172,7 +172,7 @@ class Exports : SectionBase
     // return next exported name
     char *getNext(void);
 
-    void dump(char *title = "");
+    void dump(const char *title = "");
 
   private:
     ExportDirectory *exports;
@@ -190,7 +190,7 @@ class Imports : public SectionBase 
     Imports(SectionList &sections, DataDirectory *iddp);
     void reset(void);
     ImportDescriptor *getNextDescriptor(void);
-    void dump(char *title = "");
+    void dump(const char *title = "");
 
   private:
     ImportDescriptor *imports;


  

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 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]