summaryrefslogtreecommitdiff
path: root/src/unexec.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@redhat.com>1992-01-13 21:48:08 +0000
committerJim Blandy <jimb@redhat.com>1992-01-13 21:48:08 +0000
commitbd5cd35fd8b585ad3d87f8be98b45a415fea22c0 (patch)
tree5d416f154f32b77026a495de37f12a05269095e5 /src/unexec.c
parent254f294c2e37a22e04bff74fedfdc9b1fcc93b93 (diff)
downloademacs-bd5cd35fd8b585ad3d87f8be98b45a415fea22c0.tar.gz
*** empty log message ***
Diffstat (limited to 'src/unexec.c')
-rw-r--r--src/unexec.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/unexec.c b/src/unexec.c
index ccd67451203..4d4cf20fd55 100644
--- a/src/unexec.c
+++ b/src/unexec.c
@@ -74,6 +74,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
* COFF
Define this if your system uses COFF for executables.
+
+* COFF_ENCAPSULATE
+
+Define this if you are using the GNU coff encapsulated a.out format.
+This is closer to a.out than COFF. You should *not* define COFF if
+you define COFF_ENCAPSULATE
+
Otherwise we assume you use Berkeley format.
* NO_REMAP
@@ -165,7 +172,13 @@ pointer looks like an int) but not on all machines.
#ifndef CANNOT_UNEXEC /* most of 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
#include <a.out.h>
+#endif
+
/* Define getpagesize () if the system does not.
Note that this may depend on symbols defined in a.out.h
*/
@@ -173,7 +186,7 @@ pointer looks like an int) but not on all machines.
#ifndef makedev /* Try to detect types.h already loaded */
#include <sys/types.h>
-#endif
+#endif /* makedev */
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
@@ -218,7 +231,7 @@ static EXEC_HDR_TYPE hdr, ohdr;
#else /* not HPUX */
-#if defined (USG) && !defined (IBMAIX) && !defined (IRIS)
+#if defined (USG) && !defined (IBMAIX) && !defined (IRIS) && !defined (COFF_ENCAPSULATE)
static struct bhdr hdr, ohdr;
#define a_magic fmagic
#define a_text tsize
@@ -241,6 +254,11 @@ static EXEC_HDR_TYPE hdr, ohdr;
static int unexec_text_start;
static int unexec_data_start;
+#ifdef COFF_ENCAPSULATE
+/* coffheader is defined in the GNU a.out.encap.h file. */
+struct coffheader coffheader;
+#endif
+
#endif /* not COFF */
static int pagemask;
@@ -624,6 +642,16 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
/* Get symbol table info from header of a.out file if given one. */
if (a_out >= 0)
{
+#ifdef COFF_ENCAPSULATE
+ if (read (a_out, &coffheader, sizeof coffheader) != sizeof coffheader)
+ {
+ PERROR(a_name);
+ }
+ if (coffheader.f_magic != COFF_MAGIC)
+ {
+ ERROR1("%s doesn't have legal coff magic number\n", a_name);
+ }
+#endif
if (read (a_out, &ohdr, sizeof hdr) != sizeof hdr)
{
PERROR (a_name);
@@ -637,7 +665,14 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
}
else
{
+#ifdef COFF_ENCAPSULATE
+ /* We probably could without too much trouble. The code is in gld
+ * but I don't have that much time or incentive.
+ */
+ ERROR0 ("can't build a COFF file from scratch yet");
+#else
bzero (hdr, sizeof hdr);
+#endif
}
unexec_text_start = (long) start_of_text ();
@@ -666,6 +701,32 @@ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
#endif /* not NO_REMAP */
+#ifdef COFF_ENCAPSULATE
+ /* We are encapsulating BSD format within COFF format. */
+ {
+ struct coffscn *tp, *dp, *bp;
+ tp = &coffheader.scns[0];
+ dp = &coffheader.scns[1];
+ bp = &coffheader.scns[2];
+ tp->s_size = hdr.a_text + sizeof(struct exec);
+ dp->s_paddr = data_start;
+ dp->s_vaddr = data_start;
+ dp->s_size = hdr.a_data;
+ bp->s_paddr = dp->s_vaddr + dp->s_size;
+ bp->s_vaddr = bp->s_paddr;
+ bp->s_size = hdr.a_bss;
+ coffheader.tsize = tp->s_size;
+ coffheader.dsize = dp->s_size;
+ coffheader.bsize = bp->s_size;
+ coffheader.text_start = tp->s_vaddr;
+ coffheader.data_start = dp->s_vaddr;
+ }
+ if (write (new, &coffheader, sizeof coffheader) != sizeof coffheader)
+ {
+ PERROR(new_name);
+ }
+#endif /* COFF_ENCAPSULATE */
+
if (write (new, &hdr, sizeof hdr) != sizeof hdr)
{
PERROR (new_name);