From 9cc8ca414caf93490595cf2c8f6df988aa1f6a7c Mon Sep 17 00:00:00 2001 From: angie Date: Fri, 28 Jul 2023 12:58:13 -0400 Subject: [PATCH 1/3] Fix map parsing ignoring some `*fill*` entries --- pyproject.toml | 2 +- src/mapfile_parser/__init__.py | 4 +-- src/mapfile_parser/mapfile.py | 46 ++++++++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 53e0ac0..9bbb2a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ [project] name = "mapfile_parser" -version = "1.1.4" +version = "1.1.5.dev0" description = "Map file parser library focusing decompilation projects" readme = "README.md" requires-python = ">=3.7" diff --git a/src/mapfile_parser/__init__.py b/src/mapfile_parser/__init__.py index 996d282..6c6ac26 100644 --- a/src/mapfile_parser/__init__.py +++ b/src/mapfile_parser/__init__.py @@ -5,8 +5,8 @@ from __future__ import annotations -__version_info__ = (1, 1, 4) -__version__ = ".".join(map(str, __version_info__)) +__version_info__ = (1, 1, 5) +__version__ = ".".join(map(str, __version_info__)) + ".dev0" __author__ = "Decompollaborate" from . import utils diff --git a/src/mapfile_parser/mapfile.py b/src/mapfile_parser/mapfile.py index 58f6ff6..84d2599 100644 --- a/src/mapfile_parser/mapfile.py +++ b/src/mapfile_parser/mapfile.py @@ -18,6 +18,13 @@ regex_functionEntry = re.compile(r"^\s+(?P0x[^\s]+)\s+(?P[^\s]+)$") regex_label = re.compile(r"^(?P\.?L[0-9A-F]{8})$") regex_fill = re.compile(r"^\s+(?P\*[^\s\*]+\*)\s+(?P0x[^\s]+)\s+(?P0x[^\s]+)\s*$") +regex_loadAddress = re.compile(r"\s+(?P0x[^\s]+)\s+(?P0x[^\s]+)\s+(?Pload address)\s+(?P0x[^\s]+)$") + +@dataclasses.dataclass +class LoadAddressData: + vram: int + size: int + vrom: int @dataclasses.dataclass class Symbol: @@ -157,6 +164,7 @@ def __init__(self): def readMapFile(self, mapPath: Path): tempFilesList: list[File] = list() + loadAddressData: LoadAddressData|None = None with mapPath.open("r") as f: mapData = f.read() @@ -194,9 +202,11 @@ def readMapFile(self, mapPath: Path): else: inFile = False - else: + + if not inFile: fillMatch = regex_fill.search(line) entryMatch = regex_fileDataEntry.search(line) + loadAddressMatch = regex_loadAddress.search(line) if fillMatch is not None: # Add *fill* size to last file @@ -211,18 +221,33 @@ def readMapFile(self, mapPath: Path): if size > 0: inFile = True - tempFilesList.append(File(filepath, vram, size, segmentType)) + tempFile = File(filepath, vram, size, segmentType) + if loadAddressData is not None and loadAddressData.vram == vram: + tempFile.vrom = loadAddressData.vrom + tempFilesList.append(tempFile) + + elif loadAddressMatch is not None: + vram = int(loadAddressMatch["vram"], 0) + size = int(loadAddressMatch["size"], 0) + vrom = int(loadAddressMatch["vrom"], 0) + + loadAddressData = LoadAddressData(vram, size, vrom) vromOffset = 0 for file in tempFilesList: acummulatedSize = 0 symbolsCount = len(file.symbols) + if file.vrom is not None: + vromOffset = file.vrom + isNoloadSegment = file.isNoloadSegment if not isNoloadSegment: file.vrom = vromOffset if symbolsCount > 0: + symVrom = vromOffset + # Calculate size of each symbol for index in range(symbolsCount-1): func = file.symbols[index] @@ -235,20 +260,21 @@ def readMapFile(self, mapPath: Path): if not isNoloadSegment: # Only set vrom of non bss variables - file.symbols[index].vrom = vromOffset - vromOffset += size + file.symbols[index].vrom = symVrom + symVrom += size # Calculate size of last symbol of the file func = file.symbols[symbolsCount-1] size = file.size - acummulatedSize file.symbols[symbolsCount-1] = Symbol(func.name, func.vram, size) if not isNoloadSegment: - file.symbols[symbolsCount-1].vrom = vromOffset - vromOffset += size - else: - if not isNoloadSegment: - # Only increment vrom offset for non bss segments - vromOffset += file.size + file.symbols[symbolsCount-1].vrom = symVrom + symVrom += size + + if not isNoloadSegment: + # Only increment vrom offset for non bss segments + vromOffset += file.size + self.filesList.append(file) return From e10c1b32561000617e28c47d3e1808b03da06a00 Mon Sep 17 00:00:00 2001 From: angie Date: Fri, 28 Jul 2023 12:59:28 -0400 Subject: [PATCH 2/3] Improve symbol info output a bit --- src/mapfile_parser/mapfile.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/mapfile_parser/mapfile.py b/src/mapfile_parser/mapfile.py index 84d2599..f79ae80 100644 --- a/src/mapfile_parser/mapfile.py +++ b/src/mapfile_parser/mapfile.py @@ -41,6 +41,11 @@ def getVromStr(self) -> str: return "None" return f"0x{self.vrom:06X}" + def getSizeStr(self) -> str: + if self.size < 0: + return "None" + return f"0x{self.size:X}" + @staticmethod def printCsvHeader(): @@ -148,11 +153,15 @@ class FoundSymbolInfo: offset: int = 0 def getAsStr(self) -> str: - return f"'{self.symbol.name}' (VRAM: {self.symbol.getVramStr()}, VROM: {self.symbol.getVromStr()}, {self.file.filepath})" + return f"'{self.symbol.name}' (VRAM: {self.symbol.getVramStr()}, VROM: {self.symbol.getVromStr()}, SIZE: {self.symbol.getSizeStr()}, {self.file.filepath})" def getAsStrPlusOffset(self, symName: str|None=None) -> str: if self.offset != 0: - message = f"{symName or self.symbol.name} is at 0x{self.offset:X} bytes inside" + if symName is not None: + message = symName + else: + message = f"0x{self.symbol.vram + self.offset:X}" + message += f" is at 0x{self.offset:X} bytes inside" else: message = "Symbol" return f"{message} {self.getAsStr()}" From 6294787ac22f3e43fae11a04b323eba66a696b67 Mon Sep 17 00:00:00 2001 From: angie Date: Fri, 28 Jul 2023 12:59:43 -0400 Subject: [PATCH 3/3] version bump --- pyproject.toml | 2 +- src/mapfile_parser/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9bbb2a5..ae6212f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ [project] name = "mapfile_parser" -version = "1.1.5.dev0" +version = "1.1.5" description = "Map file parser library focusing decompilation projects" readme = "README.md" requires-python = ">=3.7" diff --git a/src/mapfile_parser/__init__.py b/src/mapfile_parser/__init__.py index 6c6ac26..f67d555 100644 --- a/src/mapfile_parser/__init__.py +++ b/src/mapfile_parser/__init__.py @@ -6,7 +6,7 @@ from __future__ import annotations __version_info__ = (1, 1, 5) -__version__ = ".".join(map(str, __version_info__)) + ".dev0" +__version__ = ".".join(map(str, __version_info__)) __author__ = "Decompollaborate" from . import utils