summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1999-01-23 13:29:22 +0100
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:40:39 +0200
commite62b35169cdcd13632ae353b1e5ffde7dec44201 (patch)
tree2646548ca84edb365354a6e68459f92943532cee /ld
parent2233d47f9d89c107b6c425626d6eb2669363b055 (diff)
downloaddev86-e62b35169cdcd13632ae353b1e5ffde7dec44201.tar.gz
Import Dev86src-0.14.7.tar.gzv0.14.7
Diffstat (limited to 'ld')
-rw-r--r--ld/ld.c3
-rw-r--r--ld/objdump86.c49
-rw-r--r--ld/type.h2
-rw-r--r--ld/writex86.c22
4 files changed, 59 insertions, 17 deletions
diff --git a/ld/ld.c b/ld/ld.c
index 2a3999f..9b9883b 100644
--- a/ld/ld.c
+++ b/ld/ld.c
@@ -121,6 +121,7 @@ char **argv;
case 'z': /* unmapped zero page */
case 'N': /* Native format a.out */
case 'd': /* Make a headerless outfile */
+ case 'y': /* Use a newer symbol table */
if (arg[2] == 0)
flag[(int) arg[1]] = TRUE;
else if (arg[2] == '-' && arg[3] == 0)
@@ -250,7 +251,7 @@ char **argv;
else
#endif
write_elks(outfilename, flag['i'], flag['3'], flag['s'],
- flag['z'] & flag['3']);
+ flag['z'], flag['y']);
if (flag['m'])
dumpmods();
if (flag['M'])
diff --git a/ld/objdump86.c b/ld/objdump86.c
index b1e46bd..58a935f 100644
--- a/ld/objdump86.c
+++ b/ld/objdump86.c
@@ -69,15 +69,29 @@ char ** argv;
if( p[0] == 's' ) display_mode = 1;
if( p[0] == 'n' ) display_mode = 2;
+ multiple_files = 0;
+ for(ar=1; ar<argc; ar++)
+ {
+ if( argv[ar][0] == '-' ) switch(argv[ar][1])
+ {
+ case 's': display_mode = 1; break;
+ case 'n': display_mode = 2; break;
+ }
+ else
+ multiple_files++;
+ }
+
+ if( !multiple_files ) exit(1);
+
+ multiple_files = (multiple_files>1);
+
if( display_mode == 1 )
printf("text\tdata\tbss\tdec\thex\tfilename\n");
- multiple_files = (argc>2);
-
- for(ar=1; ar<argc; ar++)
+ for(ar=1; ar<argc; ar++) if(argv[ar][0] != '-')
do_file(argv[ar]);
- return (argc<=1);
+ return 0;
}
void
@@ -149,6 +163,7 @@ char * fname;
case 1: /* ELKS executable */
fseek(ifd, 0L, 0);
+ fetch_aout_hdr();
switch(display_mode)
{
@@ -529,8 +544,6 @@ static char * byteord[] = { "LITTLE_ENDIAN", "(2143)","(3412)","BIG_ENDIAN" };
int i;
long l;
- if( display_mode == 0 ) fetch_aout_hdr();
-
if( h_cpu > 0x17 ) h_cpu &= 3;
printf("HLEN %d\n", h_len);
@@ -597,8 +610,6 @@ static char * byteord[] = { "LITTLE_ENDIAN", "(2143)","(3412)","BIG_ENDIAN" };
void
size_aout()
{
- if( display_mode == 1 ) fetch_aout_hdr();
-
if( display_mode == 0 )
printf("text\tdata\tbss\tdec\thex\tfilename\n");
@@ -616,8 +627,7 @@ nm_aout()
long n_value;
int n_sclass, n_numaux, n_type;
long bytes_left;
-
- if( display_mode == 2 ) fetch_aout_hdr();
+ int pending_nl = 0;
fseek(ifd, h_len+header[2]+header[3]+header[8]+header[9], 0);
@@ -632,13 +642,20 @@ nm_aout()
while(bytes_left > 16)
{
- if( fread(n_name, 1, 8, ifd) != 8 ) return;
+ if( fread(n_name, 1, 8, ifd) != 8 ) break;
n_name[8] = 0;
n_value = get_long();
- if( (n_sclass = getc(ifd)) == EOF ) return;
- if( (n_numaux = getc(ifd)) == EOF ) return;
+ if( (n_sclass = getc(ifd)) == EOF ) break;
+ if( (n_numaux = getc(ifd)) == EOF ) break;
n_type = get_word();
+ if( pending_nl && n_sclass == 0 )
+ {
+ printf("%s", n_name);
+ continue;
+ }
+
+ if( pending_nl ) putchar('\n');
if( n_sclass == 0x10 )
printf(" ");
else
@@ -687,6 +704,10 @@ nm_aout()
printf("n_type=%04x ", n_type);
}
- printf("%s\n", n_name);
+ printf("%s", n_name);
+
+ pending_nl=1;
}
+
+ if( pending_nl ) putchar('\n');
}
diff --git a/ld/type.h b/ld/type.h
index a4c16aa..ffe65f0 100644
--- a/ld/type.h
+++ b/ld/type.h
@@ -165,7 +165,7 @@ void write_rel P((char *outfilename, bool_pt argsepid, bool_pt argbits32,
/* write_elks.c */
void write_elks P((char *outfilename, bool_pt argsepid, bool_pt argbits32,
- bool_pt argstripflag, bool_pt arguzp));
+ bool_pt argstripflag, bool_pt arguzp, bool_pt nsym));
/* linksym.c */
void linksyms P((bool_pt argreloc_output));
diff --git a/ld/writex86.c b/ld/writex86.c
index b2bab23..86c3157 100644
--- a/ld/writex86.c
+++ b/ld/writex86.c
@@ -67,6 +67,7 @@ PRIVATE bool_t sepid; /* nonzero for separate I & D */
PRIVATE bool_t stripflag; /* nonzero to strip symbols */
PRIVATE bin_off_t spos; /* position in current seg */
PRIVATE bool_t uzp; /* nonzero for unmapped zero page */
+PRIVATE bool_t xsym; /* extended symbol table */
FORWARD void linkmod P((struct modstruct *modptr));
FORWARD void padmod P((struct modstruct *modptr));
@@ -81,12 +82,13 @@ EXTERN bool_t reloc_output;
/* write binary file */
-PUBLIC void write_elks(outfilename, argsepid, argbits32, argstripflag, arguzp)
+PUBLIC void write_elks(outfilename, argsepid, argbits32, argstripflag, arguzp, argxsym)
char *outfilename;
bool_pt argsepid;
bool_pt argbits32;
bool_pt argstripflag;
bool_pt arguzp;
+bool_pt argxsym;
{
char buf4[4];
char *cptr;
@@ -108,6 +110,7 @@ bool_pt arguzp;
bits32 = argbits32;
stripflag = argstripflag;
uzp = arguzp;
+ xsym = argxsym;
if (uzp)
{
if (btextoffset == 0)
@@ -387,6 +390,23 @@ bool_pt arguzp;
}
writeout((char *) &extsym, sizeof extsym);
++nsym;
+#if !ELF_SYMS
+ if( xsym )
+ {
+ int i;
+ extsym.n_sclass = 0;
+ extsym.n_value = 0;
+
+ for(i=sizeof extsym.n_name; i<strlen(symptr->name);
+ i+=sizeof extsym.n_name)
+ {
+ strncpy((char *) extsym.n_name, symptr->name+i,
+ sizeof extsym.n_name);
+ writeout((char *) &extsym, sizeof extsym);
+ ++nsym;
+ }
+ }
+#endif
}
}
seekout((unsigned long) offsetof(struct exec, a_syms));