[comp.os.minix] s2asm --- dos2out bug

cechew@bruce.OZ (Earl Chew) (11/20/89)

There is a minor problem with dos2out. Large .exe headers will confuse it.

Earl

-------------------------------------------------------------------------------
*** a:dos2out.c	Mon May 08 23:23:42 1989
--- dos2out.c	Sat Nov 18 22:56:54 1989
***************
*** 96,103 ****
  #define A_BLR(cputype)	((cputype&0x01)!=0)  /* TRUE if bytes left-to-right */
  #define A_WLR(cputype)	((cputype&0x02)!=0)  /* TRUE if words left-to-right */
  
! 
  #include <stdio.h>
  #include <fcntl.h>
  #include <io.h>
  #include <sys/stat.h>
--- 96,104 ----
  #define A_BLR(cputype)	((cputype&0x01)!=0)  /* TRUE if bytes left-to-right */
  #define A_WLR(cputype)	((cputype&0x02)!=0)  /* TRUE if words left-to-right */
  
! #include <stdlib.h>
  #include <stdio.h>
+ #include <string.h>
  #include <fcntl.h>
  #include <io.h>
  #include <sys/stat.h>
***************
*** 133,138 ****
--- 134,140 ----
    unsigned int
  	sym,			/* data-relocation symbol offset */
  	sym_blk, sym_off;	/* load-module block & offset in blk */
+   long exehdr;			/* length of exe header */
    long	d_size,			/* size of data-segment */
  	t_size,			/* size of text-segment */
  	load_size;		/* size of load-module in bytes */
***************
*** 221,226 ****
--- 223,231 ----
  
  /*========================= PROCESS FILE =============================*/
  
+     /* remember the length of the header */
+     exehdr = d_ptr->hdr_size * 16;
+ 
      /* get reloc symbol's position in load-module */
      sym  = (unsigned int) inbuf[d_ptr->reloc_table+3] << 12;
      sym += (unsigned int) inbuf[d_ptr->reloc_table+2] << 4;
***************
*** 238,252 ****
      /* get symbol and calculate sizes */
      sepid  = inbuf2[sym_off+1] | inbuf2[sym_off+0];
      t_size = (sym+2 + 0xf) & ~0xf;
!     load_size  = (long) (d_ptr->nr_of_pages - 1 - (d_ptr->last_page_size!=0))
! 			* PH_SECTSIZE + d_ptr->last_page_size;
      if ((d_size = load_size - t_size) < 0)
        d_size = 0;
  
!     /* reposition file */
!     close (inf);
!     inf=open(in_name,O_RDONLY);
!     in_cnt=read(inf,inbuf2,PH_SECTSIZE);
  
      /* make a.out header */
      a_ptr->a_magic[0] = MAGIC0;
--- 243,258 ----
      /* get symbol and calculate sizes */
      sepid  = inbuf2[sym_off+1] | inbuf2[sym_off+0];
      t_size = (sym+2 + 0xf) & ~0xf;
!     load_size  = (long) (d_ptr->nr_of_pages - (d_ptr->last_page_size!=0))
! 			* PH_SECTSIZE + d_ptr->last_page_size - exehdr;
      if ((d_size = load_size - t_size) < 0)
        d_size = 0;
  
!     /* reposition file at start of code */
!     if (lseek(inf, exehdr, SEEK_SET) == -1) {
!       fprintf(stderr, "Cannot seek to start of code\n");
!       exit(1);
!     }
  
      /* make a.out header */
      a_ptr->a_magic[0] = MAGIC0;
-------------------------------------------------------------------------------
-- 
Earl Chew, Dept of Computer Science, Monash University, Australia 3168
ARPA: cechew%bruce.cs.monash.oz.au@uunet.uu.net  ACS : cechew@bruce.oz
----------------------------------------------------------------------