#ifndef CANNOT_DUMP /* all rest of file! */
-#ifdef COFF_ENCAPSULATE
-int need_coff_header = 1;
-#include <coff-encap/a.out.encap.h> /* The location might be a poor assumption */
-#else
-#ifdef MSDOS
+#ifdef COFF
#include <coff.h>
+#ifdef MSDOS
+#if __DJGPP__ > 1
+#include <fcntl.h> /* for O_RDONLY, O_RDWR */
+#include <crt0.h> /* for _crt0_startup_flags and its bits */
+static int save_djgpp_startup_flags;
+#endif /* __DJGPP__ > 1 */
#define filehdr external_filehdr
#define scnhdr external_scnhdr
#define syment external_syment
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
+#else /* not COFF */
+#ifdef COFF_ENCAPSULATE
+int need_coff_header = 1;
+#include <coff-encap/a.out.encap.h> /* The location might be a poor assumption */
+#else /* not COFF_ENCAPSULATE */
+#include <a.out.h>
+#endif /* not COFF_ENCAPSULATE */
+#endif /* not COFF */
/* Define getpagesize if the system does not.
Note that this may depend on symbols defined in a.out.h. */
static long text_scnptr;
static long data_scnptr;
+static long coff_offset;
+
#else /* not COFF */
#ifdef HPUX
}
#ifdef COFF
+ coff_offset = 0L; /* stays zero, except in DJGPP */
+
/* Salvage as much info from the existing file as possible */
if (a_out >= 0)
{
+#ifdef MSDOS
+#if __DJGPP__ > 1
+ /* Support the coff-go32-exe format with a prepended stub, since
+ this is what GCC 2.8.0 and later generates by default in DJGPP. */
+ unsigned short mz_header[3];
+
+ if (read (a_out, &mz_header, sizeof (mz_header)) != sizeof (mz_header))
+ {
+ PERROR (a_name);
+ }
+ if (mz_header[0] == 0x5a4d || mz_header[0] == 0x4d5a) /* "MZ" or "ZM" */
+ {
+ coff_offset = (long)mz_header[2] * 512L;
+ if (mz_header[1])
+ coff_offset += (long)mz_header[1] - 512L;
+ lseek (a_out, coff_offset, 0);
+ }
+ else
+ lseek (a_out, 0L, 0);
+#endif /* __DJGPP__ > 1 */
+#endif /* MSDOS */
if (read (a_out, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
{
PERROR (a_name);
block_copy_start += sizeof (f_ohdr);
}
/* Loop through section headers, copying them in */
- lseek (a_out, sizeof (f_hdr) + f_hdr.f_opthdr, 0);
+ lseek (a_out, coff_offset + sizeof (f_hdr) + f_hdr.f_opthdr, 0);
for (scns = f_hdr.f_nscns; scns > 0; scns--) {
if (read (a_out, &scntemp, sizeof (scntemp)) != sizeof (scntemp))
{
#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 ();
+
+ /* Switch off startup flags that might have been set at runtime
+ and which might change the way that dumped Emacs works. */
+ save_djgpp_startup_flags = _crt0_startup_flags;
+ _crt0_startup_flags &= ~(_CRT0_FLAG_NO_LFN | _CRT0_FLAG_NEARPTR);
+#endif
+#endif
+
lseek (new, (long) text_scnptr, 0);
ptr = (char *) f_ohdr.text_start;
#ifdef HEADER_INCL_IN_TEXT
end = ptr + f_ohdr.dsize;
write_segment (new, ptr, end);
+#ifdef MSDOS
+#if __DJGPP__ >= 2
+ /* Restore our exception hooks. */
+ __djgpp_exception_toggle ();
+
+ /* Restore the startup flags. */
+ _crt0_startup_flags = save_djgpp_startup_flags;
+#endif
+#endif
+
#endif /* USG_SHARED_LIBRARIES */
#else /* if not COFF */
{
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;
#ifdef COFF
if (lnnoptr) /* if there is line number info */
- lseek (a_out, lnnoptr, 0); /* start copying from there */
+ lseek (a_out, coff_offset + lnnoptr, 0); /* start copying from there */
else
-#endif /* COFF */
- lseek (a_out, SYMS_START, 0); /* Position a.out to symtab. */
+ lseek (a_out, coff_offset + SYMS_START, 0); /* Position a.out to symtab. */
+#else /* not COFF */
+ lseek (a_out, SYMS_START, 0); /* Position a.out to symtab. */
+#endif /* not COFF */
while ((n = read (a_out, page, sizeof page)) > 0)
{