Remove code depending on !COFF and USG, the file is
not used for such systems.
This commit is contained in:
parent
268b24eec6
commit
f914a6bfad
2 changed files with 7 additions and 166 deletions
|
@ -1,5 +1,8 @@
|
|||
2008-07-23 Dan Nicolaescu <dann@ics.uci.edu>
|
||||
|
||||
* unexec.c: Remove code depending on !COFF and USG, the file is
|
||||
not used for such systems.
|
||||
|
||||
* s/netbsd.h (A_TEXT_OFFSET, A_TEXT_SEEK):
|
||||
* s/freebsd.h (A_TEXT_OFFSET, A_TEXT_SEEK): Remove, unused.
|
||||
(LD_SWITCH_SYSTEM_1): Remove, update users.
|
||||
|
|
170
src/unexec.c
170
src/unexec.c
|
@ -112,25 +112,6 @@ boundary is sufficient. That is the default. When a larger
|
|||
boundary is needed, define SEGMENT_MASK to a mask of
|
||||
the bits that must be zero on such a boundary.
|
||||
|
||||
* A_TEXT_OFFSET(HDR)
|
||||
|
||||
Some machines count the a.out header as part of the size of the text
|
||||
segment (a_text); they may actually load the header into core as the
|
||||
first data in the text segment. Some have additional padding between
|
||||
the header and the real text of the program that is counted in a_text.
|
||||
|
||||
For these machines, define A_TEXT_OFFSET(HDR) to examine the header
|
||||
structure HDR and return the number of bytes to add to `a_text'
|
||||
before writing it (above and beyond the number of bytes of actual
|
||||
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
|
||||
a.out file before starting to write the text segment.
|
||||
|
||||
* ADJUST_EXEC_HEADER
|
||||
|
||||
This macro can be used to generate statements to adjust or
|
||||
|
@ -156,7 +137,7 @@ pointer looks like an int) but not on all machines.
|
|||
|
||||
#ifndef CANNOT_DUMP /* all rest of file! */
|
||||
|
||||
#if defined(COFF) && defined(HAVE_COFF_H)
|
||||
#ifdef HAVE_COFF_H
|
||||
#include <coff.h>
|
||||
#ifdef MSDOS
|
||||
#if __DJGPP__ > 1
|
||||
|
@ -182,9 +163,9 @@ struct aouthdr
|
|||
unsigned long data_start;/* base of data used for this file */
|
||||
};
|
||||
#endif /* not MSDOS */
|
||||
#else /* not COFF */
|
||||
#else /* not HAVE_COFF_H */
|
||||
#include <a.out.h>
|
||||
#endif /* not COFF */
|
||||
#endif /* not HAVE_COFF_H */
|
||||
|
||||
/* Define getpagesize if the system does not.
|
||||
Note that this may depend on symbols defined in a.out.h. */
|
||||
|
@ -197,11 +178,7 @@ struct aouthdr
|
|||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/file.h> /* Must be after sys/types.h for USG*/
|
||||
|
||||
#ifdef USG5
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#include <sys/file.h>
|
||||
|
||||
#ifndef O_RDONLY
|
||||
#define O_RDONLY 0
|
||||
|
@ -214,7 +191,6 @@ struct aouthdr
|
|||
extern char *start_of_text (); /* Start of text */
|
||||
extern char *start_of_data (); /* Start of initialized data */
|
||||
|
||||
#ifdef COFF
|
||||
static long block_copy_start; /* Old executable start point */
|
||||
static struct filehdr f_hdr; /* File header */
|
||||
static struct aouthdr f_ohdr; /* Optional file header (a.out) */
|
||||
|
@ -227,36 +203,6 @@ static long data_scnptr;
|
|||
|
||||
static long coff_offset;
|
||||
|
||||
#else /* not COFF */
|
||||
|
||||
extern char *sbrk ();
|
||||
|
||||
#define SYMS_START ((long) N_SYMOFF (ohdr))
|
||||
|
||||
#if defined (USG)
|
||||
static struct bhdr hdr, ohdr;
|
||||
#define a_magic fmagic
|
||||
#define a_text tsize
|
||||
#define a_data dsize
|
||||
#define a_bss bsize
|
||||
#define a_syms ssize
|
||||
#define a_trsize rtsize
|
||||
#define a_drsize rdsize
|
||||
#define a_entry entry
|
||||
#define N_BADMAG(x) \
|
||||
(((x).fmagic)!=OMAGIC && ((x).fmagic)!=NMAGIC &&\
|
||||
((x).fmagic)!=FMAGIC && ((x).fmagic)!=IMAGIC)
|
||||
#define NEWMAGIC FMAGIC
|
||||
#else /* not USG */
|
||||
static struct exec hdr, ohdr;
|
||||
#define NEWMAGIC ZMAGIC
|
||||
#endif /* not USG */
|
||||
|
||||
static int unexec_text_start;
|
||||
static int unexec_data_start;
|
||||
|
||||
#endif /* not COFF */
|
||||
|
||||
static int pagemask;
|
||||
|
||||
/* Correct an int which is the bit pattern of a pointer to a byte
|
||||
|
@ -320,13 +266,11 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
|
|||
char *new_name;
|
||||
{
|
||||
int tem;
|
||||
#ifdef COFF
|
||||
auto struct scnhdr f_thdr; /* Text section header */
|
||||
auto struct scnhdr f_dhdr; /* Data section header */
|
||||
auto struct scnhdr f_bhdr; /* Bss section header */
|
||||
auto struct scnhdr scntemp; /* Temporary section header */
|
||||
register int scns;
|
||||
#endif /* COFF */
|
||||
unsigned int bss_end;
|
||||
|
||||
pagemask = getpagesize () - 1;
|
||||
|
@ -370,7 +314,6 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
|
|||
data_start, bss_start);
|
||||
}
|
||||
|
||||
#ifdef COFF
|
||||
coff_offset = 0L; /* stays zero, except in DJGPP */
|
||||
|
||||
/* Salvage as much info from the existing file as possible */
|
||||
|
@ -529,69 +472,6 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
|
|||
|
||||
return (0);
|
||||
|
||||
#else /* if not COFF */
|
||||
|
||||
/* Get symbol table info from header of a.out file if given one. */
|
||||
if (a_out >= 0)
|
||||
{
|
||||
if (read (a_out, &ohdr, sizeof hdr) != sizeof hdr)
|
||||
{
|
||||
PERROR (a_name);
|
||||
}
|
||||
|
||||
if (N_BADMAG (ohdr))
|
||||
{
|
||||
ERROR1 ("invalid magic number in %s", a_name);
|
||||
}
|
||||
hdr = ohdr;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
|
||||
bzero ((void *)&hdr, sizeof hdr);
|
||||
#else
|
||||
bzero (&hdr, sizeof hdr);
|
||||
#endif
|
||||
}
|
||||
|
||||
unexec_text_start = (long) start_of_text ();
|
||||
unexec_data_start = data_start;
|
||||
|
||||
/* Machine-dependent fixup for header, or maybe for unexec_text_start */
|
||||
#ifdef ADJUST_EXEC_HEADER
|
||||
ADJUST_EXEC_HEADER;
|
||||
#endif /* ADJUST_EXEC_HEADER */
|
||||
|
||||
hdr.a_trsize = 0;
|
||||
hdr.a_drsize = 0;
|
||||
if (entry_address != 0)
|
||||
hdr.a_entry = entry_address;
|
||||
|
||||
hdr.a_bss = bss_end - bss_start;
|
||||
hdr.a_data = bss_start - data_start;
|
||||
#ifdef NO_REMAP
|
||||
hdr.a_text = ohdr.a_text;
|
||||
#else /* not NO_REMAP */
|
||||
hdr.a_text = data_start - unexec_text_start;
|
||||
|
||||
#ifdef A_TEXT_OFFSET
|
||||
hdr.a_text += A_TEXT_OFFSET (ohdr);
|
||||
#endif
|
||||
|
||||
#endif /* not NO_REMAP */
|
||||
|
||||
if (write (new, &hdr, sizeof hdr) != sizeof hdr)
|
||||
{
|
||||
PERROR (new_name);
|
||||
}
|
||||
|
||||
#ifdef A_TEXT_OFFSET
|
||||
hdr.a_text -= A_TEXT_OFFSET (ohdr);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
#endif /* not COFF */
|
||||
}
|
||||
|
||||
write_segment (new, ptr, end)
|
||||
|
@ -661,8 +541,6 @@ copy_text_and_data (new, a_out)
|
|||
register char *end;
|
||||
register char *ptr;
|
||||
|
||||
#ifdef COFF
|
||||
|
||||
#ifdef MSDOS
|
||||
#if __DJGPP__ >= 2
|
||||
/* Dump the original table of exception handlers, not the one
|
||||
|
@ -696,35 +574,6 @@ copy_text_and_data (new, a_out)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#else /* if not COFF */
|
||||
|
||||
/* Some machines count the header as part of the text segment.
|
||||
That is to say, the header appears in core
|
||||
just before the address that start_of_text returns.
|
||||
For them, N_TXTOFF is the place where the header goes.
|
||||
We must adjust the seek to the place after the header.
|
||||
Note that at this point hdr.a_text does *not* count
|
||||
the extra A_TEXT_OFFSET bytes, only the actual bytes of code. */
|
||||
|
||||
#ifdef A_TEXT_SEEK
|
||||
lseek (new, (long) A_TEXT_SEEK (hdr), 0);
|
||||
#else
|
||||
lseek (new, (long) N_TXTOFF (hdr), 0);
|
||||
#endif /* no A_TEXT_SEEK */
|
||||
|
||||
ptr = (char *) unexec_text_start;
|
||||
end = ptr + hdr.a_text;
|
||||
write_segment (new, ptr, end);
|
||||
|
||||
ptr = (char *) unexec_data_start;
|
||||
end = ptr + hdr.a_data;
|
||||
/* This lseek is certainly incorrect when A_TEXT_OFFSET
|
||||
and I believe it is a no-op otherwise.
|
||||
Let's see if its absence ever fails. */
|
||||
/* lseek (new, (long) N_TXTOFF (hdr) + hdr.a_text, 0); */
|
||||
write_segment (new, ptr, end);
|
||||
|
||||
#endif /* not COFF */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -745,19 +594,13 @@ copy_sym (new, a_out, a_name, new_name)
|
|||
if (a_out < 0)
|
||||
return 0;
|
||||
|
||||
#ifdef COFF
|
||||
if (SYMS_START == 0L)
|
||||
return 0;
|
||||
#endif /* COFF */
|
||||
|
||||
#ifdef COFF
|
||||
if (lnnoptr) /* if there is line number info */
|
||||
lseek (a_out, coff_offset + lnnoptr, 0); /* start copying from there */
|
||||
else
|
||||
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)
|
||||
{
|
||||
|
@ -797,7 +640,6 @@ mark_x (name)
|
|||
PERROR (name);
|
||||
}
|
||||
|
||||
#ifdef COFF
|
||||
#ifndef COFF_BSD_SYMBOLS
|
||||
|
||||
/*
|
||||
|
@ -869,8 +711,6 @@ adjust_lnnoptrs (writedesc, readdesc, new_name)
|
|||
|
||||
#endif /* COFF_BSD_SYMBOLS */
|
||||
|
||||
#endif /* COFF */
|
||||
|
||||
/* ****************************************************************
|
||||
* unexec
|
||||
*
|
||||
|
@ -894,10 +734,8 @@ unexec (new_name, a_name, data_start, bss_start, entry_address)
|
|||
if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
|
||||
|| copy_text_and_data (new, a_out) < 0
|
||||
|| copy_sym (new, a_out, a_name, new_name) < 0
|
||||
#ifdef COFF
|
||||
#ifndef COFF_BSD_SYMBOLS
|
||||
|| adjust_lnnoptrs (new, a_out, new_name) < 0
|
||||
#endif
|
||||
#endif
|
||||
)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue