X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/eb8c3be94e12644f506b8857e49ffef88046bb0b..cb94103f1744a17f140a94ba322a87e612d39d51:/src/unexmips.c diff --git a/src/unexmips.c b/src/unexmips.c index 292f0210c5..fe3f6676f7 100644 --- a/src/unexmips.c +++ b/src/unexmips.c @@ -6,13 +6,14 @@ 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, 2001, 2002, 2003, 2004, + 2005, 2006, 2007 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 -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -22,20 +23,62 @@ 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 -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. */ -#include "config.h" +#include #include #include #include #include #include + +#ifdef MACH + +#include + +/* 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 #include #include #include +#endif /* not MACH */ + #if defined (IRIS_4D) || defined (sony) #include "getpagesize.h" #include @@ -59,8 +102,7 @@ static void mark_x (); 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; @@ -174,7 +216,8 @@ unexec (new_name, a_name, data_start, bss_start, entry_address) 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) @@ -235,19 +278,23 @@ unexec (new_name, a_name, data_start, bss_start, entry_address) 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); + 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); -#define symhdr ((pHDRR)buffer) 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; @@ -259,6 +306,7 @@ unexec (new_name, a_name, data_start, bss_start, entry_address) symhdr->cbFdOffset += symrel; symhdr->cbRfdOffset += symrel; symhdr->cbExtOffset += symrel; +#endif #undef symhdr do { @@ -300,17 +348,18 @@ mark_x (name) static void fatal_unexec (s, va_alist) - va_dcl + va_dcl { 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 - 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); } + +/* arch-tag: ebdd2058-3bbc-4de4-b5c7-5760379ab153 + (do not change this comment) */