Mercurial > hg > xemacs-beta
diff src/unexec.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children |
line wrap: on
line diff
--- a/src/unexec.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/unexec.c Mon Aug 13 11:20:41 2007 +0200 @@ -136,7 +136,7 @@ program text). HDR's standard fields are already correct, except that this adjustment to the `a_text' field has not yet been made; thus, the amount of offset can depend on the data in the file. - + * A_TEXT_SEEK(HDR) If defined, this macro specifies the number of bytes to seek into the @@ -186,12 +186,19 @@ # undef _POSIX_SOURCE # endif +# if defined(__lucid) && !defined(__STDC_EXTENDED__) +# define __STDC_EXTENDED__ 1 +# endif + # include <stddef.h> # include <stdlib.h> # include <unistd.h> # include <string.h> # include <stddef.h> -# include <errno.h> + +# ifdef __lucid +# include <sysent.h> +# endif #endif @@ -209,7 +216,33 @@ int need_coff_header = 1; #include <coff-encap/a.out.encap.h> /* The location might be a poor assumption */ #else +#ifdef MSDOS +#if __DJGPP__ > 1 +#include <fcntl.h> /* for O_RDONLY, O_RDWR */ +#endif +#include <coff.h> +#define filehdr external_filehdr +#define scnhdr external_scnhdr +#define syment external_syment +#define auxent external_auxent +#define n_numaux e_numaux +#define n_type e_type +struct aouthdr +{ + unsigned short magic; /* type of file */ + unsigned short vstamp; /* version stamp */ + unsigned long tsize; /* text size in bytes, padded to FW bdry*/ + unsigned long dsize; /* initialized data " " */ + unsigned long bsize; /* uninitialized data " " */ + unsigned long entry; /* entry pt. */ + unsigned long text_start;/* base of text used for this file */ + unsigned long data_start;/* base of data used for this file */ +}; + + +#else /* not MSDOS */ #include <a.out.h> +#endif /* not MSDOS */ #endif /* not COFF_ENCAPSULATE */ /* Define getpagesize if the system does not. @@ -340,12 +373,14 @@ #include "lisp.h" static void -report_error (const char *file, int fd) +report_error (file, fd) + CONST char *file; + int fd; { if (fd) close (fd); report_file_error ("Cannot unexec", - Fcons (build_ext_string (file, Qfile_name), Qnil)); + Fcons (build_ext_string (file, FORMAT_FILENAME), Qnil)); } #endif /* emacs */ @@ -356,7 +391,7 @@ static void report_error_1 (fd, msg, a1, a2) int fd; - const char *msg; + CONST char *msg; int a1, a2; { close (fd); @@ -408,7 +443,7 @@ { close (new); /* unlink (new_name); / * Failed, unlink new a.out */ - return -1; + return -1; } close (new); @@ -885,6 +920,14 @@ #else /* COFF, but not USG_SHARED_LIBRARIES */ +#ifdef MSDOS +#if __DJGPP__ >= 2 + /* Dump the original table of exception handlers, not the one + where our exception hooks are registered. */ + __djgpp_exception_toggle (); +#endif +#endif + lseek (new, (long) text_scnptr, 0); ptr = (char *) f_ohdr.text_start; #ifdef HEADER_INCL_IN_TEXT @@ -899,6 +942,13 @@ end = ptr + f_ohdr.dsize; write_segment (new, ptr, end); +#ifdef MSDOS +#if __DJGPP__ >= 2 + /* Restore our exception hooks. */ + __djgpp_exception_toggle (); +#endif +#endif + #endif /* USG_SHARED_LIBRARIES */ #else /* if not COFF */ @@ -948,7 +998,7 @@ char c; int mcount_address, mcount_offset, count; extern char *_execname; - + /* The use of _execname is incompatible with RISCiX 1.1 */ sprintf (command, "nm %s | fgrep mcount", _execname); @@ -968,7 +1018,7 @@ { sprintf (errbuf, "Failed to execute the command '%s'\n", command); PERROR (errbuf); - } + } sscanf(address_text, "%x", &mcount_address); ptr = (char *) unexec_text_start; @@ -1026,6 +1076,7 @@ #if 0 char buf[80]; #endif + extern int errno; /* This is the normal amount to write at once. It is the size of block that NFS uses. */ int writesize = 1 << 13; @@ -1180,7 +1231,11 @@ if (!lnnoptr || !f_hdr.f_symptr) return 0; +#ifdef MSDOS + if ((new = writedesc) < 0) +#else if ((new = open (new_name, O_RDWR)) < 0) +#endif { PERROR (new_name); return -1; @@ -1202,7 +1257,9 @@ } } } +#ifndef MSDOS close (new); +#endif return 0; }