summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1998-07-01 01:00:00 +0200
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:40:31 +0200
commitec5f28e3f1400b5dacb88eda2d9db472a20b4349 (patch)
treeb3215b2306709d0412fd7845c78ca63ccaa2e29b /ld
parent2f828530e36a02c5b4c534e42ab812370c2bf7d9 (diff)
downloaddev86-ec5f28e3f1400b5dacb88eda2d9db472a20b4349.tar.gz
Import Dev86src-0.14.3.tar.gzv0.14.3
Diffstat (limited to 'ld')
-rw-r--r--ld/objdump86.c15
-rw-r--r--ld/readobj.c2
-rw-r--r--ld/writebin.c79
3 files changed, 88 insertions, 8 deletions
diff --git a/ld/objdump86.c b/ld/objdump86.c
index a5dbf44..b1e46bd 100644
--- a/ld/objdump86.c
+++ b/ld/objdump86.c
@@ -311,7 +311,14 @@ read_syms()
case 0x0180: putchar('N'); break;
case 0x0010: putchar('a'); break;
case 0x0090: putchar('A'); break;
- default: putchar('?'); break;
+ default:
+ if((symtype & ~0xF) == 0x40 )
+ putchar('u');
+ else if((symtype & ~0xF) == 0x80 )
+ printf("%c", "T12D456789abcdeU"[symtype&0xF]);
+ else
+ putchar('?');
+ break;
}
printf(" %s\n", symnames[i]);
}
@@ -632,7 +639,10 @@ nm_aout()
if( (n_numaux = getc(ifd)) == EOF ) return;
n_type = get_word();
- printf("%08lx ", n_value);
+ if( n_sclass == 0x10 )
+ printf(" ");
+ else
+ printf("%08lx ", n_value);
switch(n_sclass)
{
case 0x01: printf("a "); break;
@@ -642,6 +652,7 @@ nm_aout()
case 0x1a: printf("t "); break;
case 0x1b: printf("d "); break;
case 0x1c: printf("b "); break;
+ case 0x10: printf("U "); break;
default: if( display_mode )
{
printf("? "); break;
diff --git a/ld/readobj.c b/ld/readobj.c
index 137facc..6cc9a84 100644
--- a/ld/readobj.c
+++ b/ld/readobj.c
@@ -194,7 +194,7 @@ char *archentry;
symptr->flags &= ~(flags_t) SEGM_MASK | (flags & SEGM_MASK);
else if ((flags & SEGM_MASK) == SEGM_MASK)
flags &= ~(flags_t) SEGM_MASK | (symptr->flags & SEGM_MASK);
- if ((flags ^ symptr->flags) & (N_MASK | A_MASK | SEGM_MASK))
+ if ((flags ^ symptr->flags) & (A_MASK | SEGM_MASK))
{
redefined(symname, " with different segment or relocatability",
archentry, symptr->modptr->filename,
diff --git a/ld/writebin.c b/ld/writebin.c
index 3b31649..6945eee 100644
--- a/ld/writebin.c
+++ b/ld/writebin.c
@@ -181,6 +181,14 @@ bool_pt arguzp;
symres(segboundary); /* __segXCL */
segboundary[7] = 'H';
symres(segboundary); /* __segXCH */
+#ifndef DATASEGS
+ if( curseg > 3 )
+ {
+ segboundary[6] = 'S';
+ segboundary[7] = 'O';
+ symres(segboundary); /* __segXSO */
+ }
+#endif
}
#ifdef EDOS
curseg = 0; /* data seg, s.b. variable */
@@ -191,7 +199,7 @@ bool_pt arguzp;
symres("__end");
curseg = 0; /* text seg, s.b. variable */
symres("__etext");
- if( headerless ) symres("__segoff");
+ symres("__segoff");
/* calculate segment and common sizes (sum over loaded modules) */
/* use zero init of segsz[] */
@@ -256,7 +264,13 @@ bool_pt arguzp;
/* calculate seg positions now their sizes are known */
/* temp use fixed order 0D 0C 1D 1C 2D 2C ... */
- /* assume seg 0 is text and rest are data */
+ /*
+#ifdef DATASEGS
+ * Assume seg 0 is text and rest are data
+#else
+ * Assume seg 1..3 are data, Seg 0 is real text, seg 4+ are far text
+#endif
+ */
#ifdef EDOS
if (btextoffset == 0)
btextoffset = binheaderlength(commandname);
@@ -274,9 +288,23 @@ bool_pt arguzp;
bdataoffset = etextpadoff;
segpos[1] = segbase[1] = edataoffset = bdataoffset;
combase[1] = segbase[1] + segsz[1];
+#ifndef DATASEGS
+ for (seg = 4; seg < NSEG; ++seg)
+ {
+ segpos[seg] = segbase[seg] = 0;
+ combase[seg] = segbase[seg] + segsz[seg];
+ segadj[seg] = etextpadoff;
+
+ etextpadoff += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
+ segadj[1] += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t);
+ }
+ for (seg = 2; seg < 4; ++seg)
+#else
for (seg = 2; seg < NSEG; ++seg)
+#endif
{
segpos[seg] = segbase[seg] = combase[seg - 1] + comsz[seg - 1];
+#ifdef MC6809
if (seg == DPSEG)
{
/* temporarily have fixed DP seg */
@@ -289,6 +317,7 @@ bool_pt arguzp;
segpos[seg] = segbase[seg] = (segbase[seg] + 0xFF)
& ~(bin_off_t) 0xFF;
}
+#endif
combase[seg] = segbase[seg] + segsz[seg];
segadj[seg] = segadj[seg - 1];
}
@@ -326,8 +355,12 @@ bool_pt arguzp;
/* adjust special symbols */
for (seg = 0; seg < NSEG; ++seg)
{
+#ifdef DATASEGS
if (segsz[seg] != 0)
/* only count data of nonzero length */
+#else
+ if (segsz[seg] != 0 && seg < 4)
+#endif
edataoffset = segbase[seg] + segsz[seg];
segboundary[5] = hexdigit[seg]; /* to __segX?H */
segboundary[6] = 'D';
@@ -341,11 +374,24 @@ bool_pt arguzp;
segboundary[7] = 'H';
setsym(segboundary, tempoffset + comsz[seg]);
/* __segXCH */
+#ifndef DATASEGS
+ if( seg > 3 )
+ {
+ segboundary[6] = 'S';
+ segboundary[7] = 'O';
+ setsym(segboundary, (bin_off_t)(segadj[seg]-segadj[0])/0x10);
+ /* __segXSO */
+ }
+#endif
}
setsym("__etext", etextoffset);
setsym("__edata", edataoffset);
+#ifdef DATASEGS
setsym("__end", endoffset = combase[NSEG - 1] + comsz[NSEG - 1]);
- if( headerless ) setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10);
+#else
+ setsym("__end", endoffset = combase[3] + comsz[3]);
+#endif
+ setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10);
if( !bits32 )
{
if( etextoffset > 65536L )
@@ -436,11 +482,20 @@ bool_pt arguzp;
(flags & C_MASK)))
switch (flags & (A_MASK | SEGM_MASK))
{
- case 0:
+#ifdef DATASEGS
+ case 0:
+#else
+ default:
+#endif
extsym.n_was_sclass |= N_TEXT;
case A_MASK:
break;
- default:
+#ifdef DATASEGS
+ default:
+#else
+ case 1: case 2: case 3:
+ case A_MASK|1: case A_MASK|2: case A_MASK|3:
+#endif
if (flags & (C_MASK | SA_MASK))
extsym.n_was_sclass |= N_BSS;
else
@@ -642,7 +697,14 @@ struct modstruct *modptr;
case CM_OFFSET_RELOC:
offset = readsize(relocsize);
if (modify & R_MASK)
+ {
+#ifndef DATASEGS
+ int m = (modify & SEGM_MASK);
+ if( curseg != m && m != SEGM_MASK )
+ interseg(modptr->filename, modptr->archentry, (char*)0);
+#endif
offset -= (spos + relocsize);
+ }
offtocn(buf, segbase[modify & SEGM_MASK] + offset, relocsize);
writeout(buf, relocsize);
#ifdef REL_OUTPUT
@@ -686,7 +748,14 @@ struct modstruct *modptr;
(modify & S_MASK ? 2 : 1))];
offset = readconvsize((unsigned) modify & OF_MASK);
if (modify & R_MASK)
+ {
+#ifndef DATASEGS
+ int m = (symptr->flags & SEGM_MASK);
+ if( curseg != m && m != SEGM_MASK )
+ interseg(modptr->filename, modptr->archentry, symptr->name);
+#endif
offset -= (spos + relocsize);
+ }
#ifdef REL_OUTPUT
if (!reloc_output || !(symptr->flags & I_MASK))
#endif