X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c17a2102aa6bb5895fe0236f7dcaa9e54aaec13b..a3b10252a6f892598638bec3c3ecb5537411c188:/src/unexec.c diff --git a/src/unexec.c b/src/unexec.c index f7ff9ca6b0..fb00c27e54 100644 --- a/src/unexec.c +++ b/src/unexec.c @@ -171,17 +171,14 @@ pointer looks like an int) but not on all machines. #ifndef CANNOT_DUMP /* all rest of file! */ -#ifdef COFF_ENCAPSULATE -int need_coff_header = 1; -#include /* The location might be a poor assumption */ -#else +#ifdef COFF +#include #ifdef MSDOS #if __DJGPP__ > 1 #include /* for O_RDONLY, O_RDWR */ #include /* for _crt0_startup_flags and its bits */ static int save_djgpp_startup_flags; -#endif -#include +#endif /* __DJGPP__ > 1 */ #define filehdr external_filehdr #define scnhdr external_scnhdr #define syment external_syment @@ -199,12 +196,15 @@ struct aouthdr 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 #endif /* not MSDOS */ -#endif +#else /* not COFF */ +#ifdef COFF_ENCAPSULATE +int need_coff_header = 1; +#include /* The location might be a poor assumption */ +#else /* not COFF_ENCAPSULATE */ +#include +#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. */ @@ -245,6 +245,8 @@ long lnnoptr; /* Pointer to line-number info within file */ static long text_scnptr; static long data_scnptr; +static long coff_offset; + #else /* not COFF */ #ifdef HPUX @@ -476,9 +478,32 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) } #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); @@ -493,7 +518,7 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_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)) { @@ -1042,7 +1067,9 @@ write_segment (new, 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; @@ -1113,10 +1140,12 @@ copy_sym (new, a_out, a_name, new_name) #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) {