diff options
author | Robert de Bath <rdebath@poboxes.com> | 1999-01-23 13:29:22 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:40:39 +0200 |
commit | e62b35169cdcd13632ae353b1e5ffde7dec44201 (patch) | |
tree | 2646548ca84edb365354a6e68459f92943532cee /ld | |
parent | 2233d47f9d89c107b6c425626d6eb2669363b055 (diff) | |
download | dev86-e62b35169cdcd13632ae353b1e5ffde7dec44201.tar.gz |
Import Dev86src-0.14.7.tar.gzv0.14.7
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ld.c | 3 | ||||
-rw-r--r-- | ld/objdump86.c | 49 | ||||
-rw-r--r-- | ld/type.h | 2 | ||||
-rw-r--r-- | ld/writex86.c | 22 |
4 files changed, 59 insertions, 17 deletions
@@ -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'); } @@ -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)); |