summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1999-06-11 14:11:38 +0200
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:41:25 +0200
commit3d4957c86ff239b24b43933924ec72a3fd288518 (patch)
treeda8225a4d7bb2d9123e10d558cdc3eebae6254c8 /ld
parente62b35169cdcd13632ae353b1e5ffde7dec44201 (diff)
downloaddev86-3d4957c86ff239b24b43933924ec72a3fd288518.tar.gz
Import Dev86src-0.14.8.tar.gzv0.14.8
Diffstat (limited to 'ld')
-rw-r--r--ld/bindef.h4
-rw-r--r--ld/objdump86.c4
-rw-r--r--ld/writebin.c33
3 files changed, 38 insertions, 3 deletions
diff --git a/ld/bindef.h b/ld/bindef.h
index dbacfcd..0ccbdf9 100644
--- a/ld/bindef.h
+++ b/ld/bindef.h
@@ -26,12 +26,12 @@
#ifndef STANDARD_GNU_A_OUT
# ifndef C_EXT
- #define BSD_A_OUT
+# define BSD_A_OUT
# endif
/* Not sure about this one ... it works here ... */
# if defined(BSD_A_OUT) && defined(N_MAGIC)
- #define STANDARD_GNU_A_OUT
+# define STANDARD_GNU_A_OUT
# endif
#endif
diff --git a/ld/objdump86.c b/ld/objdump86.c
index 58a935f..f9f32a3 100644
--- a/ld/objdump86.c
+++ b/ld/objdump86.c
@@ -16,7 +16,7 @@
#include <malloc.h>
#include <string.h>
-FILE * ifd = stdin;
+FILE * ifd;
char * ifname;
#ifdef __STDC__
@@ -63,6 +63,8 @@ char ** argv;
int ar;
char * p;
+ ifd = stdin; /* In Libc6 stdin is weird */
+
p = strrchr(argv[0], '/');
if(p) p++; else p=argv[0];
diff --git a/ld/writebin.c b/ld/writebin.c
index 6945eee..ef1cb7f 100644
--- a/ld/writebin.c
+++ b/ld/writebin.c
@@ -157,7 +157,11 @@ bool_pt arguzp;
if (uzp)
{
if (btextoffset == 0)
+#ifdef QMAGIC
+ btextoffset = page_size()+HEADERLEN;
+#else
btextoffset = page_size();
+#endif
if (bdataoffset == 0 && sepid)
bdataoffset = page_size();
}
@@ -284,6 +288,14 @@ bool_pt arguzp;
etextpadoff = ld_roundup(etextoffset, 0x10, bin_off_t);
segadj[1] += etextpadoff - bdataoffset;
}
+#ifdef QMAGIC
+ else if (uzp && bdataoffset == 0)
+ {
+ bdataoffset = ld_roundup(etextoffset, page_size(), bin_off_t);
+ etextpadoff = ld_roundup(etextoffset, page_size(), bin_off_t);
+ segadj[1] += etextpadoff - bdataoffset;
+ }
+#endif
else if (bdataoffset == 0)
bdataoffset = etextpadoff;
segpos[1] = segbase[1] = edataoffset = bdataoffset;
@@ -318,6 +330,15 @@ bool_pt arguzp;
& ~(bin_off_t) 0xFF;
}
#endif
+
+#ifdef QMAGIC
+ if(seg==3 && uzp && !stripflag) /* XXX Stripped last seek needed */
+ {
+ bin_off_t val;
+ val = ld_roundup(segbase[seg]+segsz[seg], page_size(), bin_off_t);
+ segsz[seg] = val - segbase[seg];
+ }
+#endif
combase[seg] = segbase[seg] + segsz[seg];
segadj[seg] = segadj[seg - 1];
}
@@ -944,6 +965,11 @@ PRIVATE void writeheader()
memset(&header, 0, sizeof header);
#ifdef STANDARD_GNU_A_OUT
#ifdef N_SET_MAGIC
+#ifdef QMAGIC
+ if(uzp)
+ N_SET_MAGIC(header, QMAGIC);
+ else
+#endif
N_SET_MAGIC(header, OMAGIC);
#else
*(unsigned short *) &header.a_magic = OMAGIC; /* XXX - works for 386BSD */
@@ -984,12 +1010,19 @@ PRIVATE void writeheader()
#ifndef STANDARD_GNU_A_OUT
header.a_hdrlen = FILEHEADERLENGTH;
#endif
+#ifdef QMAGIC
+ if (uzp)
+ offtocn((char *) &header.a_text, etextpadoff - btextoffset+HEADERLEN,
+ sizeof header.a_text);
+ else
+#endif
offtocn((char *) &header.a_text, etextpadoff - btextoffset,
sizeof header.a_text);
offtocn((char *) &header.a_data, edataoffset - bdataoffset,
sizeof header.a_data);
offtocn((char *) &header.a_bss, endoffset - edataoffset,
sizeof header.a_bss);
+
#ifdef REL_OUTPUT
if (!reloc_output)
#endif