changeset 252:4dc2a10997a6 2.x

Fixed LWEX binary output when BSS size > 0
author lost
date Sat, 28 Nov 2009 04:46:09 +0000
parents f6af5791472c
children c537a3a723fc
files ChangeLog lwlink/output.c
diffstat 2 files changed, 15 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Nov 27 22:04:05 2009 +0000
+++ b/ChangeLog	Sat Nov 28 04:46:09 2009 +0000
@@ -30,6 +30,7 @@
     [LWASM]
 [b] Fixed default linkscript for LWEX0 format to include the .ctors, .dtors,
     and related section [LWLINK]
+[!] Fixed problem outputting LWEX0 binaries with non-zero BSS size [LWLINK]
 
 Version 2.5
 
--- a/lwlink/output.c	Fri Nov 27 22:04:05 2009 +0000
+++ b/lwlink/output.c	Sat Nov 28 04:46:09 2009 +0000
@@ -162,11 +162,14 @@
 	int nskips = 0;		// used to output blanks for BSS inline
 	int sn;
 	int codedatasize = 0;
+	int coffs;
 	unsigned char buf[32];
-	
+	int fsize = 0;
+		
 	// calculate items for the file header
 	for (sn = 0; sn < nsects; sn++)
 	{
+//		fprintf(stderr, "Counting: %s (%s) at %04X (%04X bytes), calc total = %04X\n", sectlist[sn].ptr -> name, sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> loadaddress, sectlist[sn].ptr -> codesize, codedatasize);
 		if (sectlist[sn].ptr -> flags & SECTION_BSS)
 		{
 			// no output for a BSS section
@@ -194,16 +197,23 @@
 	buf[12] = linkscript.execaddr / 256;
 	buf[13] = linkscript.execaddr & 0xff;
 	memset(buf + 14, 0, 18);
+
+//	fprintf(stderr, "Exec addr %04X, stacksize %04X, codesize %04X, bss size %04X\n", linkscript.execaddr, linkscript.stacksize, codedatasize, nskips);
 	
 	writebytes(buf, 1, 32, of);
+	fsize = 32;
+	coffs = 0x100;
+	nskips = 0;
 	// output the data
 	// NOTE: disjoint load addresses will not work correctly!!!!!
 	for (sn = 0; sn < nsects; sn++)
 	{
+//		fprintf(stderr, "Outputting: %s (%s) at %04X (%04X bytes), calc offset = %04X, file offset = %04X\n", sectlist[sn].ptr -> name, sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> loadaddress, sectlist[sn].ptr -> codesize, coffs, fsize);
 		if (sectlist[sn].ptr -> flags & SECTION_BSS)
 		{
 			// no output for a BSS section
 			nskips += sectlist[sn].ptr -> codesize;
+			coffs += sectlist[sn].ptr -> codesize;
 			continue;
 		}
 		while (nskips > 0)
@@ -211,7 +221,10 @@
 			// the "" is not an error - it turns into a single NUL byte!
 			writebytes("", 1, 1, of);
 			nskips--;
+			fsize += 1;
 		}
 		writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of);
+		coffs += sectlist[sn].ptr -> codesize;
+		fsize += sectlist[sn].ptr -> codesize;
 	}
 }