summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2005-03-19 11:51:13 +0000
committerEli Zaretskii <eliz@gnu.org>2005-03-19 11:51:13 +0000
commit055231a7eff917d39040d22b1ec3e29a4d84add4 (patch)
tree0bf03781a080d2072bf5069eaf3dcdd2a774ebc1
parent2bcf13c6f6bdb155121f39fdf53fef0308ac9dbc (diff)
downloademacs-055231a7eff917d39040d22b1ec3e29a4d84add4.tar.gz
(write_segment, unexec): Move these functions to avoid forward
references (which cause errors with "gcc -gcoff").
-rw-r--r--src/unexec.c195
1 files changed, 97 insertions, 98 deletions
diff --git a/src/unexec.c b/src/unexec.c
index dadea560e0c..156cad16f97 100644
--- a/src/unexec.c
+++ b/src/unexec.c
@@ -368,48 +368,6 @@ 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
*
* Make the header in the new a.out from the header in core.
@@ -835,6 +793,61 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
#endif /* not COFF */
}
+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;
- }
-}
/* ****************************************************************
* 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