]> git.sur5r.net Git - cc65/blobdiff - src/ld65/bin.c
New module strstack
[cc65] / src / ld65 / bin.c
index 7f4b08551b3eacedfcd3b865b42ad26b79427e0b..d1f8acd9a0019507aa58264294363ff4a0d9332a 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1999-2000 Ullrich von Bassewitz                                       */
+/* (C) 1999-2001 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #include "xmalloc.h"
 
 /* ld65 */
-#include "global.h"
+#include "bin.h"
+#include "config.h"
+#include "exports.h"
+#include "expr.h"
 #include "error.h"
+#include "global.h"
 #include "fileio.h"
+#include "lineinfo.h"
 #include "segments.h"
-#include "exports.h"
-#include "config.h"
-#include "expr.h"
-#include "bin.h"
+#include "spool.h"
 
 
 
@@ -99,7 +101,8 @@ void FreeBinDesc (BinDesc* D)
 
 
 static unsigned BinWriteExpr (ExprNode* E, int Signed, unsigned Size,
-                             unsigned long Offs, void* Data)
+                             unsigned long Offs attribute ((unused)),
+                             void* Data)
 /* Called from SegWrite for an expression. Evaluate the expression, check the
  * range and write the expression value to the file.
  */
@@ -134,7 +137,7 @@ static void BinWriteMem (BinDesc* D, Memory* M)
        SegDesc* S = N->Seg;
 
        /* Keep the user happy */
-               Print (stdout, 1, "    Writing `%s'\n", S->Name);
+               Print (stdout, 1, "    Writing `%s'\n", GetString (S->Name));
 
        /* Writes do only occur in the load area and not for BSS segments */
                DoWrite = (S->Flags & SF_BSS) == 0      &&      /* No BSS segment */
@@ -155,7 +158,7 @@ static void BinWriteMem (BinDesc* D, Memory* M)
             * in the linker.
             */
            Warning ("Segment `%s' in module `%s' requires larger alignment",
-                    S->Name, GetObjFileName (S->Seg->AlignObj));
+                    GetString (S->Name), GetObjFileName (S->Seg->AlignObj));
        }
 
        /* Handle ALIGN and OFFSET/START */
@@ -186,6 +189,7 @@ static void BinWriteMem (BinDesc* D, Memory* M)
         * if the memory area is the load area.
         */
                if (DoWrite) {
+           RelocLineInfo (S->Seg);
            SegWrite (D->F, S->Seg, BinWriteExpr, D);
        } else if (M->Flags & MF_FILL) {
            WriteMult (D->F, M->FillVal, S->Seg->Size);
@@ -214,7 +218,7 @@ static void BinWriteMem (BinDesc* D, Memory* M)
 
 
 
-static int BinUnresolved (const char* Name, void* D)
+static int BinUnresolved (unsigned Name attribute ((unused)), void* D)
 /* Called if an unresolved symbol is encountered */
 {
     /* Unresolved symbols are an error in binary format. Bump the counter
@@ -225,7 +229,7 @@ static int BinUnresolved (const char* Name, void* D)
     return 0;
 }
 
-
+                                   
 
 void BinWriteTarget (BinDesc* D, struct File* F)
 /* Write a binary output file */
@@ -233,7 +237,7 @@ void BinWriteTarget (BinDesc* D, struct File* F)
     Memory* M;
 
     /* Place the filename in the control structure */
-    D->Filename = F->Name;
+    D->Filename = GetString (F->Name);
 
     /* Check for unresolved symbols. The function BinUnresolved is called
      * if we get an unresolved symbol.
@@ -246,25 +250,25 @@ void BinWriteTarget (BinDesc* D, struct File* F)
     }
 
     /* Open the file */
-    D->F = fopen (F->Name, "wb");
+    D->F = fopen (D->Filename, "wb");
     if (D->F == 0) {
-       Error ("Cannot open `%s': %s", F->Name, strerror (errno));
+       Error ("Cannot open `%s': %s", D->Filename, strerror (errno));
     }
 
     /* Keep the user happy */
-    Print (stdout, 1, "Opened `%s'...\n", F->Name);
+    Print (stdout, 1, "Opened `%s'...\n", D->Filename);
 
     /* Dump all memory areas */
     M = F->MemList;
     while (M) {
-       Print (stdout, 1, "  Dumping `%s'\n", M->Name);
+       Print (stdout, 1, "  Dumping `%s'\n", GetString (M->Name));
        BinWriteMem (D, M);
        M = M->FNext;
     }
 
     /* Close the file */
     if (fclose (D->F) != 0) {
-       Error ("Cannot write to `%s': %s", F->Name, strerror (errno));
+       Error ("Cannot write to `%s': %s", D->Filename, strerror (errno));
     }
 
     /* Reset the file and filename */
@@ -274,3 +278,4 @@ void BinWriteTarget (BinDesc* D, struct File* F)
 
 
 
+