1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-25 07:28:20 +00:00

[COFF]: New variable coff_offset.

(make_hdr) [MSDOS]: If a_name is a coff-go32-exe executable with a
prepended stub, compute coff_offset.
(make_hdr, copy_sym) [COFF]: Use coff_offset when seeking into temacs.
This commit is contained in:
Richard M. Stallman 1998-06-29 22:54:28 +00:00
parent fedfa856e9
commit c8b14b5fbe

View File

@ -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))
{
@ -1113,10 +1138,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)
{