]> code.delx.au - gnu-emacs/commitdiff
(write_segment, unexec): Move these functions to avoid forward
authorEli Zaretskii <eliz@gnu.org>
Sat, 19 Mar 2005 11:52:25 +0000 (11:52 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sat, 19 Mar 2005 11:52:25 +0000 (11:52 +0000)
references (which cause errors with "gcc -gcoff").

src/ChangeLog
src/unexec.c

index 92be15873c0f38d21298e9b50916958cbe6d35d8..9a9b706ad1d6ec3c9d3b544d92c97b115882e881 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-19  Eli Zaretskii  <eliz@gnu.org>
+
+       * unexec.c (write_segment, unexec): Move these functions to avoid
+       forward references (which cause errors with "gcc -gcoff").
+
 2005-03-18  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * xfns.c (x_create_tip_frame): Removed setting of Vx_resource_name so
index dadea560e0c75ca97008a4f589b6c17be315e12b..156cad16f97755a6958e195fcbe98a1e0ad9edb7 100644 (file)
@@ -367,48 +367,6 @@ static int copy_text_and_data ();
 static int copy_sym ();
 static void mark_x ();
 
-/* ****************************************************************
- * unexec
- *
- * driving logic.
- */
-unexec (new_name, a_name, data_start, bss_start, entry_address)
-     char *new_name, *a_name;
-     unsigned data_start, bss_start, entry_address;
-{
-  int new, a_out = -1;
-
-  if (a_name && (a_out = open (a_name, O_RDONLY)) < 0)
-    {
-      PERROR (a_name);
-    }
-  if ((new = creat (new_name, 0666)) < 0)
-    {
-      PERROR (new_name);
-    }
-
-  if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
-      || copy_text_and_data (new, a_out) < 0
-      || copy_sym (new, a_out, a_name, new_name) < 0
-#ifdef COFF
-#ifndef COFF_BSD_SYMBOLS
-      || adjust_lnnoptrs (new, a_out, new_name) < 0
-#endif
-#endif
-      )
-    {
-      close (new);
-      /* unlink (new_name);            /* Failed, unlink new a.out */
-      return -1;
-    }
-
-  close (new);
-  if (a_out >= 0)
-    close (a_out);
-  mark_x (new_name);
-  return 0;
-}
-
 /* ****************************************************************
  * make_hdr
  *
@@ -835,6 +793,61 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
 #endif /* not COFF */
 }
 \f
+write_segment (new, ptr, end)
+     int new;
+     register char *ptr, *end;
+{
+  register int i, nwrite, ret;
+  char buf[80];
+#ifndef USE_CRT_DLL
+  extern int errno;
+#endif
+  /* This is the normal amount to write at once.
+     It is the size of block that NFS uses.  */
+  int writesize = 1 << 13;
+  int pagesize = getpagesize ();
+  char zeros[1 << 13];
+
+  bzero (zeros, sizeof (zeros));
+
+  for (i = 0; ptr < end;)
+    {
+      /* Distance to next multiple of writesize.  */
+      nwrite = (((int) ptr + writesize) & -writesize) - (int) ptr;
+      /* But not beyond specified end.  */
+      if (nwrite > end - ptr) nwrite = end - ptr;
+      ret = write (new, ptr, nwrite);
+      /* If write gets a page fault, it means we reached
+        a gap between the old text segment and the old data segment.
+        This gap has probably been remapped into part of the text segment.
+        So write zeros for it.  */
+      if (ret == -1
+#ifdef EFAULT
+         && errno == EFAULT
+#endif
+         )
+       {
+         /* Write only a page of zeros at once,
+            so that we we don't overshoot the start
+            of the valid memory in the old data segment.  */
+         if (nwrite > pagesize)
+           nwrite = pagesize;
+         write (new, zeros, nwrite);
+       }
+#if 0 /* Now that we have can ask `write' to write more than a page,
+        it is legit for write do less than the whole amount specified.  */
+      else if (nwrite != ret)
+       {
+         sprintf (buf,
+                  "unexec write failure: addr 0x%x, fileno %d, size 0x%x, wrote 0x%x, errno %d",
+                  ptr, new, nwrite, ret, errno);
+         PERROR (buf);
+       }
+#endif
+      i += nwrite;
+      ptr += nwrite;
+    }
+}
 /* ****************************************************************
  * copy_text_and_data
  *
@@ -1060,62 +1073,6 @@ copy_text_and_data (new, a_out)
 
   return 0;
 }
-
-write_segment (new, ptr, end)
-     int new;
-     register char *ptr, *end;
-{
-  register int i, nwrite, ret;
-  char buf[80];
-#ifndef USE_CRT_DLL
-  extern int errno;
-#endif
-  /* This is the normal amount to write at once.
-     It is the size of block that NFS uses.  */
-  int writesize = 1 << 13;
-  int pagesize = getpagesize ();
-  char zeros[1 << 13];
-
-  bzero (zeros, sizeof (zeros));
-
-  for (i = 0; ptr < end;)
-    {
-      /* Distance to next multiple of writesize.  */
-      nwrite = (((int) ptr + writesize) & -writesize) - (int) ptr;
-      /* But not beyond specified end.  */
-      if (nwrite > end - ptr) nwrite = end - ptr;
-      ret = write (new, ptr, nwrite);
-      /* If write gets a page fault, it means we reached
-        a gap between the old text segment and the old data segment.
-        This gap has probably been remapped into part of the text segment.
-        So write zeros for it.  */
-      if (ret == -1
-#ifdef EFAULT
-         && errno == EFAULT
-#endif
-         )
-       {
-         /* Write only a page of zeros at once,
-            so that we we don't overshoot the start
-            of the valid memory in the old data segment.  */
-         if (nwrite > pagesize)
-           nwrite = pagesize;
-         write (new, zeros, nwrite);
-       }
-#if 0 /* Now that we have can ask `write' to write more than a page,
-        it is legit for write do less than the whole amount specified.  */
-      else if (nwrite != ret)
-       {
-         sprintf (buf,
-                  "unexec write failure: addr 0x%x, fileno %d, size 0x%x, wrote 0x%x, errno %d",
-                  ptr, new, nwrite, ret, errno);
-         PERROR (buf);
-       }
-#endif
-      i += nwrite;
-      ptr += nwrite;
-    }
-}
 \f
 /* ****************************************************************
  * copy_sym
@@ -1264,6 +1221,48 @@ adjust_lnnoptrs (writedesc, readdesc, new_name)
 
 #endif /* COFF */
 
+/* ****************************************************************
+ * unexec
+ *
+ * driving logic.
+ */
+unexec (new_name, a_name, data_start, bss_start, entry_address)
+     char *new_name, *a_name;
+     unsigned data_start, bss_start, entry_address;
+{
+  int new, a_out = -1;
+
+  if (a_name && (a_out = open (a_name, O_RDONLY)) < 0)
+    {
+      PERROR (a_name);
+    }
+  if ((new = creat (new_name, 0666)) < 0)
+    {
+      PERROR (new_name);
+    }
+
+  if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
+      || copy_text_and_data (new, a_out) < 0
+      || copy_sym (new, a_out, a_name, new_name) < 0
+#ifdef COFF
+#ifndef COFF_BSD_SYMBOLS
+      || adjust_lnnoptrs (new, a_out, new_name) < 0
+#endif
+#endif
+      )
+    {
+      close (new);
+      /* unlink (new_name);            /* Failed, unlink new a.out */
+      return -1;
+    }
+
+  close (new);
+  if (a_out >= 0)
+    close (a_out);
+  mark_x (new_name);
+  return 0;
+}
+
 #endif /* not CANNOT_DUMP */
 
 /* arch-tag: 62409b69-e27a-4a7c-9413-0210d6b54e7f