diff src/unexcw.c @ 647:b39c14581166

[xemacs-hg @ 2001-08-13 04:45:47 by ben] removal of unsigned, size_t, etc.
author ben
date Mon, 13 Aug 2001 04:46:48 +0000
parents 023b83f4e54b
children 943eaba38521
line wrap: on
line diff
--- a/src/unexcw.c	Wed Aug 08 12:15:04 2001 +0000
+++ b/src/unexcw.c	Mon Aug 13 04:46:48 2001 +0000
@@ -38,7 +38,7 @@
 #if !defined (HAVE_A_OUT_H) && !defined (WIN32_NATIVE)
 unexec (char *, char *, void *, void *,	void *)
 {
-  PERROR("cannot unexec() a.out.h not installed");
+  PERROR ("cannot unexec() a.out.h not installed");
 }
 #else
 
@@ -49,9 +49,9 @@
 #endif
 
 #define ALLOC_UNIT 0xFFFF
-#define ALLOC_MASK ~((unsigned long)(ALLOC_UNIT))
+#define ALLOC_MASK ~((unsigned long) (ALLOC_UNIT))
 #define ALIGN_ALLOC(addr) \
-((((unsigned long)addr) + ALLOC_UNIT) & ALLOC_MASK)
+((((unsigned long) addr) + ALLOC_UNIT) & ALLOC_MASK)
 /* Note that all sections must be aligned on a 0x1000 boundary so
    this is the minimum size that our dummy bss can be. */
 #ifndef NO_DEBUG
@@ -67,30 +67,32 @@
 
 static void get_section_info (int a_out, char* a_name);
 static void copy_executable_and_dump_data_section (int a_out, int a_new);
-static void dup_file_area(int a_out, int a_new, long size);
+static void dup_file_area (int a_out, int a_new, long size);
 #if 0
-static void write_int_to_bss(int a_out, int a_new, void* va, void* newval);
+static void write_int_to_bss (int a_out, int a_new, void* va, void* newval);
 #endif
 
 /* Cached info about the .data section in the executable.  */
-void* data_start_va = UNINIT_PTR;
-unsigned long  data_size = UNINIT_LONG;
+void *data_start_va = UNINIT_PTR;
+long data_size = UNINIT_LONG;
 
 /* Cached info about the .bss section in the executable.  */
-void* bss_start = UNINIT_PTR;
-unsigned long  bss_size = UNINIT_LONG;
+void *bss_start = UNINIT_PTR;
+long bss_size = UNINIT_LONG;
 int sections_reversed = 0;
 FILHDR f_hdr;
 PEAOUTHDR f_ohdr;
 SCNHDR f_data, f_bss, f_text, f_nextdata;
 
-#define CHECK_AOUT_POS(a)			\
-if (lseek(a_out, 0, SEEK_CUR) != a)		\
-{						\
-  printf("we are at %lx, should be at %lx\n",	\
-	 lseek(a_out, 0, SEEK_CUR), a);		\
-  exit(-1);					\
-}
+#define CHECK_AOUT_POS(a)				\
+do {							\
+  if (lseek (a_out, 0, SEEK_CUR) != a)			\
+    {							\
+      printf ("we are at %lx, should be at %lx\n",	\
+	      lseek (a_out, 0, SEEK_CUR), a);		\
+      exit (-1);					\
+    }							\
+} while (0)
 
 /* Dump out .data and .bss sections into a new executable.  */
 int
@@ -129,8 +131,8 @@
 
   copy_executable_and_dump_data_section (a_out, a_new);
 
-  close(a_out);
-  close(a_new);
+  close (a_out);
+  close (a_new);
   return 0;
 }
 
@@ -146,11 +148,11 @@
     PERROR (a_name);
 
   if (f_hdr.e_magic != DOSMAGIC) 
-    PERROR("unknown exe header");
+    PERROR ("unknown exe header");
 
   /* Check the NT header signature ...  */
   if (f_hdr.nt_signature != NT_SIGNATURE) 
-    PERROR("invalid nt header");
+    PERROR ("invalid nt header");
 
   /* Flip through the sections for .data and .bss ...  */
   if (f_hdr.f_opthdr > 0)
@@ -172,11 +174,11 @@
     PERROR ("no .bss / .data section");
 
   /* check for reversed .bss and .data */
-  if (!strcmp(f_bss.s_name, ".data"))
+  if (!strcmp (f_bss.s_name, ".data"))
     {
-      printf(".data and .bss reversed\n");
+      printf (".data and .bss reversed\n");
       sections_reversed = 1;
-      memcpy(&f_data, &f_bss, sizeof(f_bss));
+      memcpy (&f_data, &f_bss, sizeof (f_bss));
     }
 
   /* The .data section.  */
@@ -197,7 +199,7 @@
   bss_size = (unsigned long)((char*)&my_ebss-(char*)bss_start);
   
   /* must keep bss data that we want to be blank as blank */
-  printf("found bss - keeping %lx of %lx bytes\n", bss_size, f_ohdr.bsize);
+  printf ("found bss - keeping %lx of %lx bytes\n", bss_size, f_ohdr.bsize);
 
   /* The .data section.  */
   data_start_va = (void *) ((char*)f_ohdr.ImageBase + f_data.s_vaddr);
@@ -207,12 +209,11 @@
      then a dumped Emacs won't run on system versions other
      than the one Emacs was dumped on).  */
   data_size = (unsigned long)my_edata - (unsigned long)data_start_va;
-  printf("found data - keeping %lx of %lx bytes\n", data_size, f_ohdr.dsize);
+  printf ("found data - keeping %lx of %lx bytes\n", data_size, f_ohdr.dsize);
 
   /* The following data section - often .idata */
   if (read (a_out, &f_nextdata, sizeof (f_nextdata)) != sizeof (f_nextdata)
-      &&
-      strcmp (&f_nextdata.s_name[2], "data"))
+      && strcmp (&f_nextdata.s_name[2], "data"))
     PERROR ("no other data section");
 }
 
@@ -221,13 +222,17 @@
 static void
 copy_executable_and_dump_data_section (int a_out, int a_new)
 {
-  long size=0;
-  unsigned long new_data_size, new_bss_size, 
-  bss_padding, file_sz_change, data_padding=0,
-  f_data_s_vaddr = f_data.s_vaddr,
-  f_data_s_scnptr = f_data.s_scnptr,
-  f_bss_s_vaddr = f_bss.s_vaddr, 
-  f_nextdata_s_scnptr = f_nextdata.s_scnptr;
+  long size = 0;
+  /* NOTE: Some of these were previously declared as unsigned long,
+     but the ones changed to long represent file sizes or pointers,
+     which can't reasonably get above 2G. (A 2G executable???)
+     Furthermore, some were even being compared as in if (x < 0) ... */
+  long new_data_size, new_bss_size, bss_padding, file_sz_change;
+  long data_padding = 0;
+  long f_data_s_scnptr = f_data.s_scnptr;
+  long f_nextdata_s_scnptr = f_nextdata.s_scnptr;
+  unsigned long f_data_s_vaddr = f_data.s_vaddr;
+  unsigned long f_bss_s_vaddr = f_bss.s_vaddr;
 
   int i;
   void* empty_space;
@@ -268,15 +273,15 @@
   if ((new_bss_size - bss_size) < BSS_PAD_SIZE)
     PERROR (".bss free space too small");
 
-  file_sz_change=(new_bss_size + data_padding) - BSS_PAD_SIZE;
-  new_data_size=f_ohdr.dsize + file_sz_change;
+  file_sz_change = (new_bss_size + data_padding) - BSS_PAD_SIZE;
+  new_data_size = f_ohdr.dsize + file_sz_change;
 
   if (!sections_reversed)
     f_data.s_vaddr = f_bss.s_vaddr;
   f_data.s_paddr += file_sz_change;
 #if 0 
   if (f_data.s_size + f_nextdata.s_size != f_ohdr.dsize)
-    printf("section size doesn't tally with dsize %lx != %lx\n", 
+    printf ("section size doesn't tally with dsize %lx != %lx\n", 
 	   f_data.s_size + f_nextdata.s_size, f_ohdr.dsize);
 #endif
   f_data.s_size += file_sz_change;
@@ -287,24 +292,24 @@
   f_hdr.f_nscns--;
 #endif
 
-  printf("writing file header\n");
-  if (write(a_new, &f_hdr, sizeof(f_hdr)) != sizeof(f_hdr))
-    PERROR("failed to write file header");
+  printf ("writing file header\n");
+  if (write (a_new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
+    PERROR ("failed to write file header");
   /* write optional header fixing dsize & bsize*/
-  printf("writing optional header\n");
-  printf("new data size is %lx, >= %lx\n", new_data_size,
+  printf ("writing optional header\n");
+  printf ("new data size is %lx, >= %lx\n", new_data_size,
 	 f_ohdr.dsize + f_ohdr.bsize);
-  if (new_data_size < f_ohdr.dsize + f_ohdr.bsize )
-    printf("warning: new data size is < approx\n");
+  if (new_data_size < (long) (f_ohdr.dsize + f_ohdr.bsize))
+    printf ("warning: new data size is < approx\n");
   f_ohdr.dsize=new_data_size;
   f_ohdr.bsize=BSS_PAD_SIZE;
-  if (write(a_new, &f_ohdr, sizeof(f_ohdr)) != sizeof(f_ohdr))
-    PERROR("failed to write optional header");
+  if (write (a_new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
+    PERROR ("failed to write optional header");
   /* write text as is */
-  printf("writing text header (unchanged)\n");
+  printf ("writing text header (unchanged)\n");
 
-  if (write(a_new, &f_text, sizeof(f_text)) != sizeof(f_text))
-    PERROR("failed to write text header");
+  if (write (a_new, &f_text, sizeof (f_text)) != sizeof (f_text))
+    PERROR ("failed to write text header");
 #ifndef NO_DEBUG
   /* Write small bss section. */
   if (!sections_reversed)
@@ -312,15 +317,15 @@
       f_bss.s_size = BSS_PAD_SIZE;
       f_bss.s_paddr = BSS_PAD_SIZE;
       f_bss.s_vaddr = f_data.s_vaddr - BSS_PAD_SIZE;
-      if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss))
-	PERROR("failed to write bss header");
+      if (write (a_new, &f_bss, sizeof (f_bss)) != sizeof (f_bss))
+	PERROR ("failed to write bss header");
     }
 #endif
   /* write new data header */
-  printf("writing .data header\n");
+  printf ("writing .data header\n");
 
-  if (write(a_new, &f_data, sizeof(f_data)) != sizeof(f_data))
-    PERROR("failed to write data header");
+  if (write (a_new, &f_data, sizeof (f_data)) != sizeof (f_data))
+    PERROR ("failed to write data header");
 #ifndef NO_DEBUG
   /* Write small bss section. */
   if (sections_reversed)
@@ -328,16 +333,16 @@
       f_bss.s_size = BSS_PAD_SIZE;
       f_bss.s_paddr = BSS_PAD_SIZE;
       f_bss.s_vaddr = f_nextdata.s_vaddr - BSS_PAD_SIZE;
-      if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss))
-	PERROR("failed to write bss header");
+      if (write (a_new, &f_bss, sizeof (f_bss)) != sizeof (f_bss))
+	PERROR ("failed to write bss header");
     }
 #endif
-  printf("writing following data header\n");
+  printf ("writing following data header\n");
   f_nextdata.s_scnptr += file_sz_change;
   if (f_nextdata.s_lnnoptr != 0) f_nextdata.s_lnnoptr += file_sz_change;
   if (f_nextdata.s_relptr != 0) f_nextdata.s_relptr += file_sz_change;
-  if (write(a_new, &f_nextdata, sizeof(f_nextdata)) != sizeof(f_nextdata))
-    PERROR("failed to write nextdata header");
+  if (write (a_new, &f_nextdata, sizeof (f_nextdata)) != sizeof (f_nextdata))
+    PERROR ("failed to write nextdata header");
 
   /* copy other section headers adjusting the file offset */
   for (i=0; i<(f_hdr.f_nscns-3); i++)
@@ -349,140 +354,142 @@
       if (section.s_lnnoptr != 0) section.s_lnnoptr += file_sz_change;
       if (section.s_relptr != 0) section.s_relptr += file_sz_change;
 
-      if (write(a_new, &section, sizeof(section)) != sizeof(section))
-	PERROR("failed to write data header");
+      if (write (a_new, &section, sizeof (section)) != sizeof (section))
+	PERROR ("failed to write data header");
     }
 #ifdef NO_DEBUG
   /* dump bss to maintain offsets */
-  memset(&f_bss, 0, sizeof(f_bss));
-  if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss))
-    PERROR("failed to write bss header");
+  memset (&f_bss, 0, sizeof (f_bss));
+  if (write (a_new, &f_bss, sizeof (f_bss)) != sizeof (f_bss))
+    PERROR ("failed to write bss header");
 #endif
-  size=lseek(a_new, 0, SEEK_CUR);
-  CHECK_AOUT_POS(size);
+  size = lseek (a_new, 0, SEEK_CUR);
+  CHECK_AOUT_POS (size);
 
   /* copy eveything else until start of data */
   size = f_data_s_scnptr - lseek (a_out, 0, SEEK_CUR);
 
   printf ("copying executable up to data section ... %lx bytes\n", 
 	  size);
-  dup_file_area(a_out, a_new, size);
+  dup_file_area (a_out, a_new, size);
 
-  CHECK_AOUT_POS(f_data_s_scnptr);
+  CHECK_AOUT_POS (f_data_s_scnptr);
 
   if (!sections_reversed)
     {
       /* dump bss + padding between sections, sans small bss pad */
       printf ("dumping .bss into executable... %lx bytes\n", bss_size);
-      if (write(a_new, bss_start, bss_size) != (int)bss_size)
+      if (write (a_new, bss_start, bss_size) != bss_size)
 	{
-	  PERROR("failed to write bss section");
+	  PERROR ("failed to write bss section");
 	}
       
       /* pad, needs to be zero */
       bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE;
       if (bss_padding < 0)
-	PERROR("padded .bss too small");
+	PERROR ("padded .bss too small");
       printf ("padding .bss ... %lx bytes\n", bss_padding);
-      empty_space = malloc(bss_padding);
-      memset(empty_space, 0, bss_padding);
-      if (write(a_new, empty_space, bss_padding) != (int)bss_padding)
-	PERROR("failed to write bss section");
-      free(empty_space);
+      empty_space = malloc (bss_padding);
+      memset (empty_space, 0, bss_padding);
+      if (write (a_new, empty_space, bss_padding) != bss_padding)
+	PERROR ("failed to write bss section");
+      free (empty_space);
     }
 
   /* tell dumped version not to free pure heap */
   static_heap_dumped = 1;
   /* Get a pointer to the raw data in our address space.  */
   printf ("dumping .data section... %lx bytes\n", data_size);
-  if (write(a_new, data_start_va, data_size) != (int)data_size)
-    PERROR("failed to write data section");
+  if (write (a_new, data_start_va, data_size) != data_size)
+    PERROR ("failed to write data section");
   /* were going to use free again ... */
   static_heap_dumped = 0;
   
-  size = lseek(a_out, f_data_s_scnptr + data_size, SEEK_SET);
+  size = lseek (a_out, f_data_s_scnptr + data_size, SEEK_SET);
 
   if (!sections_reversed)
     {
       size = f_nextdata_s_scnptr - size;
-      dup_file_area(a_out, a_new, size);
+      dup_file_area (a_out, a_new, size);
     }
   else
     {
       /* need to pad to bss with data in file */
       printf ("padding .data ... %lx bytes\n", data_padding);
       size = (f_bss_s_vaddr - f_data_s_vaddr) - data_size;
-      dup_file_area(a_out, a_new, size);
+      dup_file_area (a_out, a_new, size);
 
       /* dump bss + padding between sections */
       printf ("dumping .bss into executable... %lx bytes\n", bss_size);
-      if (write(a_new, bss_start, bss_size) != (int)bss_size)
-	PERROR("failed to write bss section");
+      if (write (a_new, bss_start, bss_size) != bss_size)
+	PERROR ("failed to write bss section");
       
       /* pad, needs to be zero */
       bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE;
       if (bss_padding < 0)
-	PERROR("padded .bss too small");
+	PERROR ("padded .bss too small");
       printf ("padding .bss ... %lx bytes\n", bss_padding);
-      empty_space = malloc(bss_padding);
-      memset(empty_space, 0, bss_padding);
-      if (write(a_new, empty_space, bss_padding) != (int)bss_padding)
-	PERROR("failed to write bss section");
-      free(empty_space);
-      if (lseek(a_new, 0, SEEK_CUR) != f_nextdata.s_scnptr)
+      empty_space = malloc (bss_padding);
+      memset (empty_space, 0, bss_padding);
+      if (write (a_new, empty_space, bss_padding) != bss_padding)
+	PERROR ("failed to write bss section");
+      free (empty_space);
+      if (lseek (a_new, 0, SEEK_CUR) != (long) f_nextdata.s_scnptr)
 	{
-	  printf("at %lx should be at %lx\n", 
-		 lseek(a_new, 0, SEEK_CUR),
+	  printf ("at %lx should be at %lx\n", 
+		 lseek (a_new, 0, SEEK_CUR),
 		 f_nextdata.s_scnptr);
-	  PERROR("file positioning error\n");
+	  PERROR ("file positioning error\n");
 	}
-      lseek(a_out, f_nextdata_s_scnptr, SEEK_SET);
+      lseek (a_out, f_nextdata_s_scnptr, SEEK_SET);
     }
 
-  CHECK_AOUT_POS(f_nextdata_s_scnptr);
+  CHECK_AOUT_POS (f_nextdata_s_scnptr);
 
   /* now dump - nextdata don't need to do this cygwin ds is in .data! */
   printf ("dumping following data section... %lx bytes\n", f_nextdata.s_size);
 
-  dup_file_area(a_out,a_new,f_nextdata.s_size);
+  dup_file_area (a_out,a_new,f_nextdata.s_size);
 
   /* write rest of file */
   printf ("writing rest of file\n");
-  size = lseek(a_out, 0, SEEK_END);
+  size = lseek (a_out, 0, SEEK_END);
   size = size - (f_nextdata_s_scnptr + f_nextdata.s_size); /* length remaining in a_out */
-  lseek(a_out, f_nextdata_s_scnptr + f_nextdata.s_size, SEEK_SET);
+  lseek (a_out, f_nextdata_s_scnptr + f_nextdata.s_size, SEEK_SET);
 
-  dup_file_area(a_out, a_new, size);
+  dup_file_area (a_out, a_new, size);
 }
 
 /*
  * copy from aout to anew
  */
-static void dup_file_area(int a_out, int a_new, long size)
+static void
+dup_file_area (int a_out, int a_new, long size)
 {
   char page[BUFSIZ];
   long n;
   for (; size > 0; size -= sizeof (page))
     {
-      n = size > sizeof (page) ? sizeof (page) : size;
+      n = size > (long) sizeof (page) ? sizeof (page) : size;
       if (read (a_out, page, n) != n || write (a_new, page, n) != n)
 	PERROR ("dump_out()");
     }
 }
 
 #if 0
-static void write_int_to_bss(int a_out, int a_new, void* va, void* newval)
+static void
+write_int_to_bss (int a_out, int a_new, void* va, void* newval)
 {
   int cpos;
 
-  cpos = lseek(a_new, 0, SEEK_CUR);
+  cpos = lseek (a_new, 0, SEEK_CUR);
   if (va < bss_start || va > bss_start + f_data.s_size)
-    PERROR("address not in data space\n");
-  lseek(a_new, f_data.s_scnptr + ((unsigned long)va - 
+    PERROR ("address not in data space\n");
+  lseek (a_new, f_data.s_scnptr + ((unsigned long)va - 
 				  (unsigned long)bss_start), SEEK_SET);
-  if (write(a_new, newval, sizeof(int)) != (int)sizeof(int))
-    PERROR("failed to write int value");
-  lseek(a_new, cpos, SEEK_SET);
+  if (write (a_new, newval, sizeof (int)) != (int) sizeof (int))
+    PERROR ("failed to write int value");
+  lseek (a_new, cpos, SEEK_SET);
 }
 #endif