All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.10.0 - 2025-09-01
- Support for partially linked objects (a.k.a.
plf).- This is done by calling a function with a user provided callback that
converts a given object path into the corresponding mapfile for that
plf. - Rust:
MapFile::resolve_partially_linked_files(). - Python:
MapFile::resolvePartiallyLinkedFiles().
- This is done by calling a function with a user provided callback that
converts a given object path into the corresponding mapfile for that
- All the CLI utilities include basic support for
plfs.- Pass the flag
-x .extensionor--plf-ext .extensionto specify the extension of the partially linked objects files that should be replaced with a.mapextension. - The frontends API allow to further customize this behavior by passing a
callback like the one used by
MapFile::resolvePartiallyLinkedFiles.
- Pass the flag
2.9.4 - 2025-06-02
- Implement parsing for
mwld2.7+ generated mapfiles. - Handle
*fill*s inmwld.
2.9.3 - 2025-06-01
- Try to infer the rom address of sections and segments even when the mapfile does not have it explictly on GNU mapfiles.
2.9.2 - 2025-05-28
objdiff_report:- Simplify emitted entries by avoiding using quotes as much as possible when
using the
--emit-categoriesflag. - Avoid printing the summary table when using the
--emit-categories. - Allow customizing the output of the summary table a little bit via the Python API.
- Simplify emitted entries by avoiding using quotes as much as possible when
using the
2.9.1 - 2025-05-27
- Add
--emit-categoriesflag toobjdiff_report.- Prints to stdout automatically-generated categories from the mapfile.
Categories will use the
decomp.yamlformat. - Intended to facilitate to integrate this progress reporting method.
- The generated categories are expected to be modified by the user and not used as is.
- Prints to stdout automatically-generated categories from the mapfile.
Categories will use the
- Print a summary from the generated progress report in
objdiff_report.- Printed to stdout by default.
- This will be printed as a summary step if the script detects it is being run in a Github Action.
- Metroweks ld: Parse alignment column.
- GNU maps:
- Fix parsing the segment's metadata (name, address, etc) when the segment does not have a rom address.
- Properly drop empty segments from the parsed output.
- Fix parsing if the mapfile contains Carriage Returns characters (
\r).
2.9.0 - 2025-05-25
- Support emitting progress reports using
objdiff's format.- Relies mainly on
.NON_MATCHING-suffixed marker symbols being present on the mapfile for each non-matched symbol. - Rust:
- Disabled by default, it is gated by the
objdiff_reportfeature. - Use
MapFile::get_objdiff_report()to generate the report. - It is recommended to mix with the
serdefeature to make serialization of the report easier.
- Disabled by default, it is gated by the
- Python:
- Use
MapFile::writeObjdiffReportToFile()to write an objdiff report as ajsonfile.
- Use
- Relies mainly on
- Add
objdiff_reportas a new CLI utility to the Python library.- Generate a simple
objdiffprogress report from your terminal! - This utility supports the
decomp.yamlformat. This format is the preferred way of invoking the tool, given the long list of arguments needed for the tool to properly work.
- Generate a simple
- Add support for Metrowerks ld mapfiles.
- Existing catch-all functions will try to guess if the given mapfile correspond to this kind of map by default.
- New functions:
MapFile::new_from_mw_map_str()(Rust) andMapFile::newFromMwMapStr()(Python): Parses specifically a Metrowerks ld mapfile without guessing.
- Update
decomp_settingsto version 0.0.9. - Bump MSRV from
1.65.0to1.74.0.
2.8.1 - 2025-05-22
- Fix broken CLI utilities when a decomp.yaml file is not detected.
2.8.0 - 2025-05-20
File::symbol_match_state_iter()function. Returns an iterator overSymbolDecompState, which allows to know if a symbol is considered decompiled or not decompiled yet.Section::is_fill.trueif the section is a*fill*entry.MapFile::get_every_section_except_section_type. Provides the same functionallity as the oldMapFile::get_every_file_except_section_typefunction.Segment::get_every_section_except_section_type. Provides the same functionallity as the oldSegment::get_every_file_except_section_typefunction.MapFile::new_from_map_file,MapFile::new_from_map_str,MapFile::new_from_gnu_map_strandMapFile::new_from_lld_map_str.Symbol::nonmatching_sym_exists. This will be set totrueif a symbol with the same name but with a.NON_MATCHINGsuffix is found on the same section.- The other suffixed symbol (
.NON_MATCHING) is still retained in the section. - The suffixed symbol will have this member set to
false.
- The other suffixed symbol (
- Add support for the
decomp.yamlspecification from thedecomp_settingsproject on all the provided CLI utilities.- If a
decomp.yamlfile is detected, then every CLI argument that can be inferred from that file will be be considered optional instead. - Most CLI utilites will also add a new optional "version" argument to allow
picking the version to process from the
decomp.yamlfile. It defaults to the first listed version.
- If a
- Change
Symbol.sizetou64fromOption<u64>. - Rename
FiletoSection.Fileis still available as an alias toSection, but it is recommended to use the new name instead.
- Detect
.NON_MATCHINGsymbols and fix the size of both the real symbol and the.NON_MATCHINGone during parsing.
File. UseSectioninstead.MapFile::get_every_file_except_section_type. UseMapFile::get_every_section_except_section_typeinstead.Segment::get_every_file_except_section_type. UseSegment::get_every_section_except_section_typeinstead.MapFile::new. Use eitherMapFile::new_from_map_fileorMapFile::new_from_map_strinstead.MapFile::read_map_file. Use eitherMapFile::new_from_map_fileinstead.MapFile::parse_map_contents. Use eitherMapFile::new_from_map_strinstead.MapFile::parse_map_contents_gnu. Use eitherMapFile::new_from_gnu_map_strinstead.MapFile::parse_map_contents_lld. Use eitherMapFile::new_from_lld_map_strinstead.- Deprecate
MapFile::fixup_non_matching_symbolsand family. This functionality is perform automatically during parsing now.- Calling this function is effectively a no-op now.
- Avoid pointless internal copy during the parsing of GNU mapfiles.
2.7.5 - 2025-05-08
- Fix Rust release.
2.7.4 - 2025-03-19
- Fix size calculation for the last symbol of a section not properly accounting
if the first symbol of said section is a
staticsymbol (meaning it is missing from the mapfile).- This fix only applies to GNU mapfiles.
2.7.3 - 2025-02-09
- Fix symbol's VROM calculation not properly accounting for the first symbol of
the section being a
staticsymbol (missing from the mapfile).- This fix only applies to GNU mapfiles.
2.7.2 - 2024-12-15
- Prebuilt binaries for Python 3.13.
- Python 3.9 or later is now required.
- Bump from Python 3.8 to 3.9.
- Older versions can't be checked on CI anymore, so I prefer to not claim to support something that may have broken without anybody noticing.
- Nothing really changed. Just the CI tools I was using are refusing to use any Python version older than this. Sorry if you were affected by this.
- Use newer pyo3 version.
- From 0.20 to 0.23.
- Updated to avoid warnings with newer Rust versions.
- Fix issues introduced by updating pyo3.
2.7.1 - 2024-09-25
- Add
--jsonflag toprogressfrontend.- Prints the output as json instead of using a human readable format.
- Improve lifetime usage and avoid unnecessary clones on Rust side.
2.7.0 - 2024-09-24
MapFile.findSymbolByVramandMapFile.findSymbolByVrommethods.- Allow to search a symbol given a given address. The address will be treated as either a vram address or a vrom address respectively.
- Add
--vram,--vromand--namearguments tosym_infofrontend.- Allow to tell to
sym_infoexactly how to treat the argument instead of trying to guess how to use it.
- Allow to tell to
sym_infocan now detect that an address may belong to a file even when the symbol itself may not exist on the mapfile.- This can happen for local symbols, for example for rodata literals.
MapFile.findSymbolByVramOrVrom.- Use
MapFile.findSymbolByVramandMapFile.findSymbolByVrominstead.
- Use
- Fix typo that prevented using
jsonify.
2.6.0 - 2024-08-26
- Add new parameters to
bss_check.printSymbolComparison.printGoods: Allows toggling printing the GOOD symbols.printingStyle: The style to use to print the symbols, either"csv"or"listing".- TODO: port to Rust.
- New
MapFile.fixupNonMatchingSymbolsmethod.- Allows to fixup size calculation of symbols messed up by symbols with the
same name suffixed with
.NON_MATCHING.
- Allows to fixup size calculation of symbols messed up by symbols with the
same name suffixed with
- Add support for
.NON_MATCHINGsuffix on symbols on progress calculation.- If a symbol exists and has a
.NON_MATCHING-suffixed counterpart then consider it not mateched yet.
- If a symbol exists and has a
- Minor cleanups.
2.5.1 - 2024-08-09
- Fix Github Action file.
2.5.0 - 2024-08-09
- Add Minimal Supported Rust Version (MSRV) to Cargo.toml.
- Add
MapFile::new_from_map_filefunction to simplifyMapFilecreation. - Add
serdefeature to the Rust crate.- Allows serializing and deserializing a
MapFileobject using serde.
- Allows serializing and deserializing a
- Tweak symbol comparison logic a bit.
- Symbol shifting (due to different sizes or extra/missing symbols) should not affect comparing non shifted files.
Cargo.lockfile is now committed to the repo.- Change Rust functions to properly take references instead of consuming the argument.
- Fix
MapFile::find_lowest_differing_symbolnot returning a previous symbol from a previous file if the symbol found is the first symbol from the file.
2.4.0 - 2024-03-25
- Add
endianargument todoFirstDiff. - Add
--endianoption tofirst_diffscript.
- Dropped Python 3.7 support.
- Python 3.8 is the minimum supported version now.
2.3.7 - 2024-02-27
- Fix not recognizing file entries which are splited in two lines because its section name was too long to fit.
2.3.6 - 2024-02-23
- Add issue templates for bug reports and feature suggestions.
- Fix not recognizing sections that don't start with dots (
.).
2.3.5 - 2024-02-04
- Fix
MapFile.compareFilesAndSymbolsreporting the wrong address as the expected address.
2.3.4 - 2024-01-26
- Frontend scripts now give a better error if the mapfile does not exist.
2.3.2 - 2024-01-17
- Add optional
categoryColumnSizeparameter toProgressStats.getHeaderAsStrandProgressStats.getEntryAsStr.- Allows to set the size of the first column.
- Fix Rust's implementation of
Filenot returning apathlib.Pathobject for thefilepathmember.
2.3.1 - 2023-12-23
- Add a few utility methods to
ProgressStats.
pyo3is no longer needed to use this crate as Rust-only library.- Updated Rust dependencies.
2.3.0 - 2023-11-05
- Support for parsing clang lld's map fles.
- New functions:
MapFile.parseMapContents/MapFile::parse_map_contents- Parses the map contents passed as the argument, without requiring the map being on an actual file.
- The map format will be guessed on the contents. Currently both the GNU ld and clang ld.lld map formats are recognized.
MapFile.parseMapContentsGNU/MapFile::parse_map_contents_gnu- Parses the map contents passed as the argument, without requiring the map being on an actual file.
- This function only parses the GNU ld map format.
MapFile.parseMapContentsLLD/MapFile::parse_map_contents_lld- Parses the map contents passed as the argument, without requiring the map being on an actual file.
- This function only parses the clang ld.lld map format.
- New members:
Symbol.align/Symbol::align,File.align/File::alignandSegment.align/Segment::align: The alignment the given type. This member will be filled by the parser only if the mapfile provides this information.
MapFile.readMapFile/MapFile::read_map_filecan now guess the map format between any of the known formats.- Some known symbol names will be automatically filtered out during the parsing
step.
- Currently only
gcc2_compiled.is filtered out.
- Currently only
- Fix parser not detecting
*fill*lines on GNU ld maps if they specified the value that was used for filling/padding. .sbss,COMMONand.scommonsections are now properly considered noload sections.
2.2.1 - 2023-10-08
- Fix Rust crate size being too big
- crates.io was rejecting the package because of the size
- Cargo was packaging all the map files and test cases, making the package be 15 MiB. Now it is around 16.3 KiB
2.2.0 - 2023-10-08
- Add new Rust re-implementation (#15)
- Allows using this library in native Rust projects
- It does not replace the Python implementation due to restrictions on how Rust bindings work.
- Python bindings for the Rust implementation exists, but they are not used or exposed to the user
- Now this library has a Rust crate.
- Check it at https://crates.io/crates/mapfile_parser
- Speed-up the actual parsing of a mapfile by using the native Rust implementation
- Up to 10 times faster parsing has been registered
- Change build system from
hatchlingtomaturin
2.1.5 - 2023-10-02
- Add
CHANGELOG.md - Add markdown linter to CI
- Cleanup the
README.mda bit - Update Github Action's dependencies
- Deprecate
File.getName- The method itself doesn't make sense, instead operate on
File.filepathdirectly
- The method itself doesn't make sense, instead operate on
- Deprecate
MapFile.debugging - Deprecate
progressfrontend's--debuggingflag
2.1.4 - 2023-09-11
- Fix vrom calculation if the first symbol of a file is not available in the map file
1.3.2 - 2023-09-11
- Add version info to the cli
- Add small testing suite
- Add machine-friendly/non-human-readable option for json generation.
- Numbers are outputted as real numbers instead of prettified strings
- Allow csv conversion to be written to a file instead of only printing to stdout
- Output
noneinstead of"None"for symbols with no vrom when generating json output.
- Fix vrom calculation if the first symbol of a file is not available in the map file
2.1.3 - 2023-08-30
- Fix version number
- pypi thought previous version was a prerelease instead of a full release
2.1.2 - 2023-08-30
- Add machine-friendly/non-human-readable option for json generation.
- Numbers are outputted as real numbers instead of prettified strings
- Add some CI tests
- Output
noneinstead of"None"for symbols with no vrom when generating json output. - Make dummy files for
*fill*lines instead of adding them to the previous file. - Don't drop the dummy segment if it actually has data on it
2.1.1 - 2023-08-15
- Fix off-by-one issue which was throwing away tons of data
2.1.0 - 2023-08-14
- Add
bss_checkfrontend- Allows to search for reordered bss variables by comparing two map files.
- Don't skip important lines in some kinds of map files.
- This may produce map parsing to be a bit slower but it should work properly with more kinds of mapfiles
- Try to prevent crashes if a file is found before the first segment is found
2.0.1 - 2023-08-07
- Makes
Symbol,FileandSegmenthashable
1.3.1 - 2023-08-06
- Make
SymbolandFiletypes hashable
2.0.0 - 2023-08-01
toJsonmethod which allow serializing map files into the json format.jsonifyfrontend which allows converting a mapfile into a json format from the CLI.
- Change logic of
MapFileso it can parse and organize each file in proper segments.- This breaks old ways of iterating the
MapFileclass. Now iterating it yields aSegment, iterating that yields aFile.
- This breaks old ways of iterating the
- Rename
segmentTypetosectionTypeandfilterBySegmentTypetofilterBySectionType.
1.3.0 - 2023-08-01
- Add function
toJsonto export map file as a json. It returns adict. - New
jsonifyfrontend, which allows converting a map file in the cli.
1.2.1 - 2023-07-28
- Fix missing
:colon even when passingaddColons=Trueto thefirst_difffrontend
1.2.0 - 2023-07-28
first_difffrontend:- Allow an optional bytes converter callback. It can be useful to perform analysis or instruction decoding on the caller side.
- Parameter to toggle colons (
:) in bytes difference output
1.1.5 - 2023-07-28
- Fix map parsing ignoring some
*fill*entries - Improve symbol info output a bit
1.1.4 - 2023-04-03
- Add missing
requestrequirement
1.1.3 - 2023-02-22
- Add flag to enable debug prints
- Add flag to specify the path index
- Properly handle files with multiple extensions
1.1.2 - 2022-12-14
- Modularize
upload_frogressfrontend
1.1.1 - 2022-12-14
- Add examples to README
1.1.0 - 2022-12-14
- Compute vrom addresses of symbols and files
- Provide various front-ends clis (see README for more info):
first_diffpj64_symsprogresssym_infosymbol_sizes_csvupload_frogress
1.0.0 - 2022-12-13
- Initial release