ref: 92449a4fe4f13a8e45f0589985351b80a45fa941
parent: 4e2a035838630e736111af8235370e12e51a6170
author: Antonio Niño Díaz <[email protected]>
date: Sat Jul 22 11:16:38 EDT 2017
Save object file name of each symbol in linker This is useful to generate error messages when there is a symbol that appears in more than one object file. Signed-off-by: Antonio Niño Díaz <[email protected]>
--- a/include/link/mylink.h
+++ b/include/link/mylink.h
@@ -89,6 +89,7 @@
SLONG nSectionID; /* internal to object.c */
struct sSection *pSection;
SLONG nOffset;
+ char *pzObjFileName; /* Object file where the symbol is located. */
char *pzFileName; /* Source file where the symbol was defined. */
ULONG nFileLine; /* Line where the symbol was defined. */
};
--- a/include/link/symbol.h
+++ b/include/link/symbol.h
@@ -4,7 +4,8 @@
#include "types.h"
void sym_Init(void);
-void sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank);
+void sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank,
+ char *tzObjFileName, char *tzFileName, ULONG nFileLine);
SLONG sym_GetValue(char *tzName);
SLONG sym_GetBank(char *tzName);
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -566,16 +566,21 @@
((pSect->tSymbols[i]->pSection == pSect) ||
(pSect->tSymbols[i]->pSection == NULL))) {
if (pSect->tSymbols[i]->pSection == NULL)
- sym_CreateSymbol(pSect->tSymbols[i]->
- pzName,
- pSect->tSymbols[i]->
- nOffset, -1);
+ sym_CreateSymbol(
+ pSect->tSymbols[i]->pzName,
+ pSect->tSymbols[i]->nOffset,
+ -1,
+ pSect->tSymbols[i]->pzObjFileName,
+ pSect->tSymbols[i]->pzFileName,
+ pSect->tSymbols[i]->nFileLine);
else
- sym_CreateSymbol(pSect->tSymbols[i]->
- pzName,
- pSect->nOrg +
- pSect->tSymbols[i]->
- nOffset, pSect->nBank);
+ sym_CreateSymbol(
+ pSect->tSymbols[i]->pzName,
+ pSect->nOrg + pSect->tSymbols[i]->nOffset,
+ pSect->nBank,
+ pSect->tSymbols[i]->pzObjFileName,
+ pSect->tSymbols[i]->pzFileName,
+ pSect->tSymbols[i]->nFileLine);
}
}
pSect = pSect->pNext;
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -116,7 +116,7 @@
*/
struct sSymbol *
-obj_ReadSymbol(FILE * f)
+obj_ReadSymbol(FILE * f, char *tzObjectfile)
{
struct sSymbol *pSym;
@@ -128,6 +128,8 @@
readasciiz(&pSym->pzName, f);
pSym->Type = (enum eSymbolType)fgetc(f);
+ pSym->pzObjFileName = tzObjectfile;
+
if (pSym->Type != SYM_IMPORT) {
readasciiz(&pSym->pzFileName, f);
pSym->nFileLine = readlong(f);
@@ -268,7 +270,7 @@
}
void
-obj_ReadRGB(FILE * pObjfile)
+obj_ReadRGB(FILE * pObjfile, char *tzObjectfile)
{
struct sSection *pFirstSection;
SLONG nNumberOfSymbols, nNumberOfSections, i;
@@ -285,7 +287,7 @@
}
for (i = 0; i < nNumberOfSymbols; i += 1)
- tSymbols[i] = obj_ReadSymbol(pObjfile);
+ tSymbols[i] = obj_ReadSymbol(pObjfile, tzObjectfile);
} else
tSymbols = (struct sSymbol **) & dummymem;
@@ -337,7 +339,7 @@
if (strncmp(tzHeader, "RGB", 3) == 0) {
switch (tzHeader[3]) {
case '5':
- obj_ReadRGB(pObjfile);
+ obj_ReadRGB(pObjfile, tzObjectfile);
break;
default:
errx(1, "'%s' uses an unsupported object file version (%s). Please reassemble it.", tzObjectfile, tzHeader);
--- a/src/link/symbol.c
+++ b/src/link/symbol.c
@@ -12,8 +12,10 @@
struct ISymbol {
char *pzName;
SLONG nValue;
- SLONG nBank;
- //-1 = const
+ SLONG nBank; /* -1 = constant */
+ char tzObjFileName[_MAX_PATH + 1]; /* Object file where the symbol was defined. */
+ char tzFileName[_MAX_PATH + 1]; /* Source file where the symbol was defined. */
+ ULONG nFileLine; /* Line where the symbol was defined. */
struct ISymbol *pNext;
};
@@ -76,7 +78,8 @@
}
void
-sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank)
+sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank, char *tzObjFileName,
+ char *tzFileName, ULONG nFileLine)
{
if (strcmp(tzName, "@") == 0)
return;
@@ -102,6 +105,11 @@
(*ppSym)->nValue = nValue;
(*ppSym)->nBank = nBank;
(*ppSym)->pNext = NULL;
+ strncpy((*ppSym)->tzObjFileName, tzObjFileName,
+ sizeof((*ppSym)->tzObjFileName));
+ strncpy((*ppSym)->tzFileName, tzFileName,
+ sizeof((*ppSym)->tzFileName));
+ (*ppSym)->nFileLine = nFileLine;
}
}
}