]> code.delx.au - gnu-emacs/blobdiff - src/unexmips.c
*** empty log message ***
[gnu-emacs] / src / unexmips.c
index b39adfc9c39a8d20723933c90d14696af13060c6..86129e052cf84af975c450d4418c1b2c2e2c1f94 100644 (file)
@@ -6,13 +6,14 @@
    we don't plan to think about it, or about whether other Emacs
    maintenance might break it.
 
    we don't plan to think about it, or about whether other Emacs
    maintenance might break it.
 
-   Copyright (C) 1988 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1994, 2002, 2003, 2004,
+                 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -22,7 +23,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 \f
 #include <config.h>
 
 \f
 #include <config.h>
@@ -31,11 +33,52 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/stat.h>
 #include <stdio.h>
 #include <varargs.h>
 #include <sys/stat.h>
 #include <stdio.h>
 #include <varargs.h>
+
+#ifdef MACH
+
+#include <a.out.h>
+
+/* I don't know why this isn't defined.  */
+#ifndef STYP_INIT
+#define STYP_INIT  0x80000000
+#endif
+
+/* I don't know why this isn't defined.  */
+#ifndef _RDATA
+#define        _RDATA  ".rdata"
+#define STYP_RDATA 0x00000100
+#endif
+
+/* Small ("near") data section.  */
+#ifndef _SDATA
+#define        _SDATA  ".sdata"
+#define STYP_SDATA 0x00000200
+#endif
+
+/* Small ("near") bss section.  */
+#ifndef _SBSS
+#define _SBSS ".sbss"
+#define STYP_SBSS 0x00000400
+#endif
+
+/* We don't seem to have a sym.h or syms.h anywhere, so we'll do it the
+   hard way.  This stinks.  */
+typedef struct {
+  short   magic;
+  short   vstamp;
+  long    ilineMax;
+  struct { long foo, offset; } offsets[11];
+} HDRR, *pHDRR;
+
+#else /* not MACH */
+
 #include <filehdr.h>
 #include <aouthdr.h>
 #include <scnhdr.h>
 #include <sym.h>
 
 #include <filehdr.h>
 #include <aouthdr.h>
 #include <scnhdr.h>
 #include <sym.h>
 
+#endif /* not MACH */
+
 #if defined (IRIS_4D) || defined (sony)
 #include "getpagesize.h"
 #include <fcntl.h>
 #if defined (IRIS_4D) || defined (sony)
 #include "getpagesize.h"
 #include <fcntl.h>
@@ -59,8 +102,7 @@ static void mark_x ();
          fatal_unexec (_error_message, _error_arg);
 
 extern int errno;
          fatal_unexec (_error_message, _error_arg);
 
 extern int errno;
-extern int sys_nerr;
-extern char *sys_errlist[];
+extern char *strerror ();
 #define EEOF -1
 
 static struct scnhdr *text_section;
 #define EEOF -1
 
 static struct scnhdr *text_section;
@@ -174,7 +216,8 @@ unexec (new_name, a_name, data_start, bss_start, entry_address)
   text_section->s_scnptr = 0;
 
   pagesize = getpagesize ();
   text_section->s_scnptr = 0;
 
   pagesize = getpagesize ();
-  brk = (sbrk (0) + pagesize - 1) & (-pagesize);
+  /* Casting to int avoids compiler error on NEWS-OS 5.0.2.  */
+  brk = (((int) (sbrk (0))) + pagesize - 1) & (-pagesize);
   hdr.aout.dsize = brk - DATA_START;
   hdr.aout.bsize = 0;
   if (entry_address == 0)
   hdr.aout.dsize = brk - DATA_START;
   hdr.aout.bsize = 0;
   if (entry_address == 0)
@@ -235,19 +278,23 @@ unexec (new_name, a_name, data_start, bss_start, entry_address)
       bss_section->s_scnptr = scnptr;
     }
 
       bss_section->s_scnptr = scnptr;
     }
 
-  WRITE (new, TEXT_START, hdr.aout.tsize,
-        "writing text section to %s", new_name);
-  WRITE (new, DATA_START, hdr.aout.dsize,
+  WRITE (new, (char *)TEXT_START, hdr.aout.tsize,
         "writing text section to %s", new_name);
         "writing text section to %s", new_name);
+  WRITE (new, (char *)DATA_START, hdr.aout.dsize,
+        "writing data section to %s", new_name);
 
   SEEK (old, hdr.fhdr.f_symptr, "seeking to start of symbols in %s", a_name);
   errno = EEOF;
   nread = read (old, buffer, BUFSIZE);
   if (nread < sizeof (HDRR)) fatal_unexec ("reading symbols from %s", a_name);
 
   SEEK (old, hdr.fhdr.f_symptr, "seeking to start of symbols in %s", a_name);
   errno = EEOF;
   nread = read (old, buffer, BUFSIZE);
   if (nread < sizeof (HDRR)) fatal_unexec ("reading symbols from %s", a_name);
-#define symhdr ((pHDRR)buffer)
   newsyms = hdr.aout.tsize + hdr.aout.dsize;
   symrel = newsyms - hdr.fhdr.f_symptr;
   hdr.fhdr.f_symptr = newsyms;
   newsyms = hdr.aout.tsize + hdr.aout.dsize;
   symrel = newsyms - hdr.fhdr.f_symptr;
   hdr.fhdr.f_symptr = newsyms;
+#define symhdr ((pHDRR)buffer)
+#ifdef MACH
+  for (i = 0; i < 11; i++)
+    symhdr->offsets[i].offset += symrel;
+#else
   symhdr->cbLineOffset += symrel;
   symhdr->cbDnOffset += symrel;
   symhdr->cbPdOffset += symrel;
   symhdr->cbLineOffset += symrel;
   symhdr->cbDnOffset += symrel;
   symhdr->cbPdOffset += symrel;
@@ -259,6 +306,7 @@ unexec (new_name, a_name, data_start, bss_start, entry_address)
   symhdr->cbFdOffset += symrel;
   symhdr->cbRfdOffset += symrel;
   symhdr->cbExtOffset += symrel;
   symhdr->cbFdOffset += symrel;
   symhdr->cbRfdOffset += symrel;
   symhdr->cbExtOffset += symrel;
+#endif
 #undef symhdr
   do
     {
 #undef symhdr
   do
     {
@@ -300,17 +348,18 @@ mark_x (name)
 
 static void
 fatal_unexec (s, va_alist)
 
 static void
 fatal_unexec (s, va_alist)
-     va_dcl
+    va_dcl
 {
   va_list ap;
   if (errno == EEOF)
     fputs ("unexec: unexpected end of file, ", stderr);
 {
   va_list ap;
   if (errno == EEOF)
     fputs ("unexec: unexpected end of file, ", stderr);
-  else if (errno < sys_nerr)
-    fprintf (stderr, "unexec: %s, ", sys_errlist[errno]);
   else
   else
-    fprintf (stderr, "unexec: error code %d, ", errno);
+    fprintf (stderr, "unexec: %s, ", strerror (errno));
   va_start (ap);
   _doprnt (s, ap, stderr);
   fputs (".\n", stderr);
   exit (1);
 }
   va_start (ap);
   _doprnt (s, ap, stderr);
   fputs (".\n", stderr);
   exit (1);
 }
+
+/* arch-tag: ebdd2058-3bbc-4de4-b5c7-5760379ab153
+   (do not change this comment) */