diff --git a/include/link/mylink.h b/include/link/mylink.h index 88e52549..36be7ae2 100644 --- a/include/link/mylink.h +++ b/include/link/mylink.h @@ -89,6 +89,7 @@ struct sSymbol { 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. */ }; diff --git a/include/link/symbol.h b/include/link/symbol.h index 29fdfdcf..806b12da 100644 --- 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); diff --git a/src/link/assign.c b/src/link/assign.c index 61481265..35f8759f 100644 --- a/src/link/assign.c +++ b/src/link/assign.c @@ -566,16 +566,21 @@ CreateSymbolTable(void) ((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; diff --git a/src/link/object.c b/src/link/object.c index 1e40eb83..770f6604 100644 --- a/src/link/object.c +++ b/src/link/object.c @@ -116,7 +116,7 @@ AllocSection(void) */ struct sSymbol * -obj_ReadSymbol(FILE * f) +obj_ReadSymbol(FILE * f, char *tzObjectfile) { struct sSymbol *pSym; @@ -128,6 +128,8 @@ obj_ReadSymbol(FILE * f) 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 @@ obj_ReadRGBSection(FILE * f) } void -obj_ReadRGB(FILE * pObjfile) +obj_ReadRGB(FILE * pObjfile, char *tzObjectfile) { struct sSection *pFirstSection; SLONG nNumberOfSymbols, nNumberOfSections, i; @@ -285,7 +287,7 @@ obj_ReadRGB(FILE * pObjfile) } 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 @@ obj_ReadOpenFile(FILE * pObjfile, char *tzObjectfile) 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); diff --git a/src/link/symbol.c b/src/link/symbol.c index b53cbb67..2053eab5 100644 --- 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 @@ sym_GetBank(char *tzName) } 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 @@ sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank) (*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; } } }