Configuration

elf_diffs configuration is stored in a tree structure.

Document

document
├── build_info = '' <str> [Information about the build]
├── configuration [Boolean flags that configure what is supposed to be displayed and how]
│   ├── debug_info_available = 'None' <NoneType> [True if Dwarf debugging information was found in both binaries]
│   ├── display_appeared_symbols_overview = 'True' <bool> [True if an overview about appeared symbols is supposed to be displayed]
│   ├── display_binary_details = 'False' <bool> [True if details about binaries are supposed to be displayed]
│   ├── display_build_info = 'False' <bool> [True if build information is supposed to be displayed]
│   ├── display_details = 'True' <bool> [True if symbol detail information is supposed to be displayed]
│   ├── display_disappeared_symbols_overview = 'True' <bool> [True if an overview about disappeared symbols is supposed to be displayed]
│   ├── display_migrated_symbols = 'True' <bool> [True if migrated symbols are supposed to be displayed]
│   ├── display_migrated_symbols_overview = 'True' <bool> [True if an overview about migrated symbols is supposed to be displayed]
│   ├── display_new_binary_info = 'False' <bool> [True if new binary info is supposed to be displayed]
│   ├── display_old_binary_info = 'False' <bool> [True if old binary info is supposed to be displayed]
│   ├── display_persisting_symbols_overview = 'True' <bool> [True if an overview about persisting symbols is supposed to be displayed]
│   ├── display_similar_symbols = 'True' <bool> [True if similar symbols are supposed to be displayed]
│   ├── display_similar_symbols_overview = 'True' <bool> [True if an overview about similar symbols is supposed to be displayed]
│   └── instructions_available = 'True' <bool> [True if instructions could be read from both binary files]
├── files [Information about relevant files]
│   └── input [Information about relevant input files]
│       ├── new [Information about relevant input files]
│       │   ├── binary_path = '../../tests/x86_64/libelf_diff_test2_debug_new.a' <str> [The path to the binary file]
│       │   ├── debug_info_available = 'True' <bool> [True if Dwarf debug info avaiable in the elf binary]
│       │   └── source_files [Source file by file id (dict values of type SourceFile)]
│       └── old [Information about relevant input files]
│           ├── binary_path = '../../tests/x86_64/libelf_diff_test2_debug_old.a' <str> [The path to the binary file]
│           ├── debug_info_available = 'True' <bool> [True if Dwarf debug info avaiable in the elf binary]
│           └── source_files [Source file by file id (dict values of type SourceFile)]
├── general [General information about the document]
│   ├── doc_title = 'ELF Binary Comparison' <str> [Document title]
│   ├── document_version = '1' <int> [The document version of this document]
│   ├── elf_diff_repo_root = '/home/runner/work/elf_diff/elf_diff/src/elf_diff' <str> [Path to the root of the elf_diff git repo]
│   ├── elf_diff_version = '8acf089b323694cba18698d94c1bdaa1ffa98329' <str> [The elf_diff version that generated the page]
│   ├── generation_date = '2025-08-31 12:54:47' <str> [The document generation date]
│   └── page_title = 'ELF Binary Comparison - (c) 2021 by noseglasses' <str> [The title of the document page]
├── new_binary_info = '' <str> [Info about the new binary]
├── old_binary_info = '' <str> [Info about the old binary]
├── statistics
│   ├── overall [Overall statistics]
│   │   ├── delta
│   │   │   └── resource_consumption [Information about resource consumption]
│   │   │       ├── bss = '0' <int> [bss section memory consumption]
│   │   │       ├── code = '11' <int> [Memory required to store code]
│   │   │       ├── data = '0' <int> [data section memory consumption]
│   │   │       ├── static_ram = '0' <int> [Static RAM consumption]
│   │   │       └── text = '11' <int> [text section memory consumption]
│   │   ├── new
│   │   │   └── resource_consumption [Information about resource consumption]
│   │   │       ├── bss = '0' <int> [bss section memory consumption]
│   │   │       ├── code = '450' <int> [Memory required to store code]
│   │   │       ├── data = '36' <int> [data section memory consumption]
│   │   │       ├── static_ram = '36' <int> [Static RAM consumption]
│   │   │       └── text = '414' <int> [text section memory consumption]
│   │   └── old
│   │       └── resource_consumption [Information about resource consumption]
│   │           ├── bss = '0' <int> [bss section memory consumption]
│   │           ├── code = '439' <int> [Memory required to store code]
│   │           ├── data = '36' <int> [data section memory consumption]
│   │           ├── static_ram = '36' <int> [Static RAM consumption]
│   │           └── text = '403' <int> [text section memory consumption]
│   └── symbols [Statistics of symbols]
│       ├── appeared
│       │   └── count = '6' <int> [Number of symbols]
│       ├── disappeared
│       │   └── count = '6' <int> [Number of symbols]
│       ├── new [Overall statistics about symbols considered]
│       │   ├── count [Number of symbols]
│       │   │   ├── dropped = '0' <int> [Number of symbols dropped]
│       │   │   ├── selected = '17' <int> [Number of symbols selected]
│       │   │   └── total = '17' <int> [Number of total symbols in binary]
│       │   └── regex [Overall statistics about symbols considered]
│       │       ├── exclusion = '' <str> [Regular expression used to exclude symbols found in binary]
│       │       └── selection = '.*' <str> [Regular expression used to select symbols found in binary]
│       ├── old [Overall statistics about symbols considered]
│       │   ├── count [Number of symbols]
│       │   │   ├── dropped = '0' <int> [Number of symbols dropped]
│       │   │   ├── selected = '17' <int> [Number of symbols selected]
│       │   │   └── total = '17' <int> [Number of total symbols in binary]
│       │   └── regex [Overall statistics about symbols considered]
│       │       ├── exclusion = '' <str> [Regular expression used to exclude symbols found in binary]
│       │       └── selection = '.*' <str> [Regular expression used to select symbols found in binary]
│       ├── persisting
│       │   ├── assembly_differs_count = '1' <int> [Number of persisting symbols with assembly differences]
│       │   ├── count = '11' <int> [Number of symbols]
│       │   └── resource_consumption [Total resource consumption of considered symbols of given class]
│       │       ├── delta = '8' <int> [Change to number of bytes consumed (only for persisting and similar)]
│       │       ├── new = '179' <int> [Overall number of bytes consumed in the old version]
│       │       └── old = '171' <int> [Overall number of bytes consumed in the old version]
│       └── similar
│           └── count = '16' <int> [Number of symbols]
└── symbols [Symbols by id/table id ]
    ├── appeared [Dict of appeared symbols by symbol id (dict values of type AppearedSymbol)]
    ├── disappeared [Disappeared symbols by symbol id (dict values of type DisappearedSymbol)]
    ├── migrated [Migrated symbols by symbol id (dict values of type MigratedSymbol)]
    ├── new [Dict of selected symbols of the new binary by symbol id (dict values of type Symbol)]
    ├── old [Dict of selected symbols of the old binary by symbol id (dict values of type Symbol)]
    ├── persisting [Persisting symbols by symbol id (dict values of type PersistingSymbol)]
    └── similar [Similar symbols by symbol id (dict values of type SimilarSymbols)]

Dynamic Tree Node Types

Some branches of the document tree are dynamically generated based on the content of the compared elf binaries. Dynamically generated node types are listed below.

Please note: The actual node representations are not listed due to space constraints.

SourceFile

source_file
├── id <int> [The id of the source file]
├── path <str> [The full path of the source file as reported by binutils/nm]
└── path_wo_prefix <str> [The name of the source file with user defined prefix stripped]

Symbol

symbol
├── id <int> [Unique symbol identifier]
├── instructions <str> [Code instructions (assembly with possibly high level language code intermixed)]
├── is_demangled <bool> [True if the symbol name is demangled]
├── is_stored_in_program_memory <bool> [True if the symbol is stored in program memory]
├── name <str> [The symbol name (demangled if supported)]
├── name_mangled <str> [The mangled symbol name]
├── size <int> [Number of bytes occupied by the symbol]
├── source
│   ├── file_id <int> [The id of the source file]
│   └── line <int> [The line number in the source file where the symbol is defined]
└── type <str> [Type character matching the characters used by the nm binutils tool]

PersistingSymbol

persisting_symbol
├── display_info [Information that configures how things are displayed]
│   ├── anchor_id <str> [Unique string identifier token that can be used to generate a HTML anchor for cross references]
│   ├── display_symbol_details <bool> [True if symbol details are supposed to be displayed]
│   └── symbol_class <str> [The class of symbol old/new/appeared/disappeared/persisting/similar]
└── related_symbols [A relation between two symbols]
    ├── new <Symbol> [The new symbol]
    ├── old <Symbol> [The old symbol]
    └── size_delta <int> [Difference in bytes between the resource occupation of the two symbols]

AppearedSymbol

appeared_symbol
├── actual <Symbol> [The actual symbol]
└── display_info [Information that configures how things are displayed]
    ├── anchor_id <str> [Unique string identifier token that can be used to generate a HTML anchor for cross references]
    ├── display_symbol_details <bool> [True if symbol details are supposed to be displayed]
    └── symbol_class <str> [The class of symbol old/new/appeared/disappeared/persisting/similar]

DisappearedSymbol

disappeared_symbol
├── actual <Symbol> [The actual symbol]
└── display_info [Information that configures how things are displayed]
    ├── anchor_id <str> [Unique string identifier token that can be used to generate a HTML anchor for cross references]
    ├── display_symbol_details <bool> [True if symbol details are supposed to be displayed]
    └── symbol_class <str> [The class of symbol old/new/appeared/disappeared/persisting/similar]

SimilarSymbols

similar_symbols
├── display_info [Information that configures how things are displayed]
│   ├── anchor_id <str> [Unique string identifier token that can be used to generate a HTML anchor for cross references]
│   ├── display_symbol_details <bool> [True if symbol details are supposed to be displayed]
│   └── symbol_class <str> [The class of symbol old/new/appeared/disappeared/persisting/similar]
├── id <int> [The id of the symbol pair]
├── new
│   └── signature_tagged <str> [A tagged version of the symbol signature. Taggs '...HIGHLIGHT_START...' and '...HIGHLIGHT_END...' must be replaced accordingly, e.g. for highlighting.]
├── old
│   └── signature_tagged <str> [A tagged version of the symbol signature. Taggs '...HIGHLIGHT_START...' and '...HIGHLIGHT_END...' must be replaced accordingly, e.g. for highlighting.]
├── related_symbols [A relation between two symbols]
│   ├── new <Symbol> [The new symbol]
│   ├── old <Symbol> [The old symbol]
│   └── size_delta <int> [Difference in bytes between the resource occupation of the two symbols]
└── similarities [Symbol similarity ratios]
    ├── instruction <float> [The percentage of symbol instruction similarity]
    └── signature <float> [The percentage of symbol signature similarity]

MigratedSymbol

migrated_symbol
├── display_info [Information that configures how things are displayed]
│   ├── anchor_id <str> [Unique string identifier token that can be used to generate a HTML anchor for cross references]
│   ├── display_symbol_details <bool> [True if symbol details are supposed to be displayed]
│   └── symbol_class <str> [The class of symbol old/new/appeared/disappeared/persisting/similar]
└── related_symbols [A relation between two symbols]
    ├── new <Symbol> [The new symbol]
    ├── old <Symbol> [The old symbol]
    └── size_delta <int> [Difference in bytes between the resource occupation of the two symbols]

Jinja2 Template Variables

The following exported variables may be used to configure Jinja2 Template files.
document.build_info = ''
document.configuration.debug_info_available = 'None'
document.configuration.display_appeared_symbols_overview = 'True'
document.configuration.display_binary_details = 'False'
document.configuration.display_build_info = 'False'
document.configuration.display_details = 'True'
document.configuration.display_disappeared_symbols_overview = 'True'
document.configuration.display_migrated_symbols = 'True'
document.configuration.display_migrated_symbols_overview = 'True'
document.configuration.display_new_binary_info = 'False'
document.configuration.display_old_binary_info = 'False'
document.configuration.display_persisting_symbols_overview = 'True'
document.configuration.display_similar_symbols = 'True'
document.configuration.display_similar_symbols_overview = 'True'
document.configuration.instructions_available = 'True'
document.files.input.new.binary_path = '../../tests/x86_64/libelf_diff_test2_debug_new.a'
document.files.input.new.debug_info_available = 'True'
document.files.input.new.source_files = '{17: <elf_diff.value_tree.Node object at 0x7f88b5ca1ab0>, 18: <elf_diff.value_tree.Node object at 0x7f88b5ca1ae0>, 19: <elf_diff.value_tree.Node object at 0x7f88b5ca1b70>, 20: <elf_diff.value_tree.Node object at 0x7f88b5ca1ba0>, 21: <elf_diff.value_tree.Node object at 0x7f88b5ca1b40>, 22: <elf_diff.value_tree.Node object at 0x7f88b5ca19f0>, 23: <elf_diff.value_tree.Node object at 0x7f88b5ca1a50>, 24: <elf_diff.value_tree.Node object at 0x7f88b5ca1a80>, 25: <elf_diff.value_tree.Node object at 0x7f88b5ca1a20>, 26: <elf_diff.value_tree.Node object at 0x7f88b5cadbd0>, 27: <elf_diff.value_tree.Node object at 0x7f88b5cadc00>, 28: <elf_diff.value_tree.Node object at 0x7f88b5cadc30>, 29: <elf_diff.value_tree.Node object at 0x7f88b5cadc60>, 30: <elf_diff.value_tree.Node object at 0x7f88b5cadc90>, 31: <elf_diff.value_tree.Node object at 0x7f88b5cadcc0>, 32: <elf_diff.value_tree.Node object at 0x7f88b5cadcf0>, 33: <elf_diff.value_tree.Node object at 0x7f88b5cadd20>}'
document.files.input.old.binary_path = '../../tests/x86_64/libelf_diff_test2_debug_old.a'
document.files.input.old.debug_info_available = 'True'
document.files.input.old.source_files = '{0: <elf_diff.value_tree.Node object at 0x7f88b5cad300>, 1: <elf_diff.value_tree.Node object at 0x7f88b5cad330>, 2: <elf_diff.value_tree.Node object at 0x7f88b5cad360>, 3: <elf_diff.value_tree.Node object at 0x7f88b5cad390>, 4: <elf_diff.value_tree.Node object at 0x7f88b5cad3f0>, 5: <elf_diff.value_tree.Node object at 0x7f88b5cad420>, 6: <elf_diff.value_tree.Node object at 0x7f88b5cad450>, 7: <elf_diff.value_tree.Node object at 0x7f88b5cad480>, 8: <elf_diff.value_tree.Node object at 0x7f88b5cad4b0>, 9: <elf_diff.value_tree.Node object at 0x7f88b5cad4e0>, 10: <elf_diff.value_tree.Node object at 0x7f88b5cad510>, 11: <elf_diff.value_tree.Node object at 0x7f88b5cad540>, 12: <elf_diff.value_tree.Node object at 0x7f88b5cad570>, 13: <elf_diff.value_tree.Node object at 0x7f88b5cad5a0>, 14: <elf_diff.value_tree.Node object at 0x7f88b5cad5d0>, 15: <elf_diff.value_tree.Node object at 0x7f88b5cad600>, 16: <elf_diff.value_tree.Node object at 0x7f88b5cad630>}'
document.general.doc_title = 'ELF Binary Comparison'
document.general.document_version = '1'
document.general.elf_diff_repo_root = '/home/runner/work/elf_diff/elf_diff/src/elf_diff'
document.general.elf_diff_version = '8acf089b323694cba18698d94c1bdaa1ffa98329'
document.general.generation_date = '2025-08-31 12:54:47'
document.general.page_title = 'ELF Binary Comparison - (c) 2021 by noseglasses'
document.new_binary_info = ''
document.old_binary_info = ''
document.statistics.overall.delta.resource_consumption.bss = '0'
document.statistics.overall.delta.resource_consumption.code = '11'
document.statistics.overall.delta.resource_consumption.data = '0'
document.statistics.overall.delta.resource_consumption.static_ram = '0'
document.statistics.overall.delta.resource_consumption.text = '11'
document.statistics.overall.new.resource_consumption.bss = '0'
document.statistics.overall.new.resource_consumption.code = '450'
document.statistics.overall.new.resource_consumption.data = '36'
document.statistics.overall.new.resource_consumption.static_ram = '36'
document.statistics.overall.new.resource_consumption.text = '414'
document.statistics.overall.old.resource_consumption.bss = '0'
document.statistics.overall.old.resource_consumption.code = '439'
document.statistics.overall.old.resource_consumption.data = '36'
document.statistics.overall.old.resource_consumption.static_ram = '36'
document.statistics.overall.old.resource_consumption.text = '403'
document.statistics.symbols.appeared.count = '6'
document.statistics.symbols.disappeared.count = '6'
document.statistics.symbols.new.count.dropped = '0'
document.statistics.symbols.new.count.selected = '17'
document.statistics.symbols.new.count.total = '17'
document.statistics.symbols.new.regex.exclusion = ''
document.statistics.symbols.new.regex.selection = '.*'
document.statistics.symbols.old.count.dropped = '0'
document.statistics.symbols.old.count.selected = '17'
document.statistics.symbols.old.count.total = '17'
document.statistics.symbols.old.regex.exclusion = ''
document.statistics.symbols.old.regex.selection = '.*'
document.statistics.symbols.persisting.assembly_differs_count = '1'
document.statistics.symbols.persisting.count = '11'
document.statistics.symbols.persisting.resource_consumption.delta = '8'
document.statistics.symbols.persisting.resource_consumption.new = '179'
document.statistics.symbols.persisting.resource_consumption.old = '171'
document.statistics.symbols.similar.count = '16'
document.symbols.appeared = '{17: <elf_diff.value_tree.Node object at 0x7f88b5c83ac0>, 21: <elf_diff.value_tree.Node object at 0x7f88b5c83af0>, 24: <elf_diff.value_tree.Node object at 0x7f88b5c83b50>, 27: <elf_diff.value_tree.Node object at 0x7f88b5c83be0>, 30: <elf_diff.value_tree.Node object at 0x7f88b5c83c40>, 31: <elf_diff.value_tree.Node object at 0x7f88b5c83ca0>}'
document.symbols.disappeared = '{0: <elf_diff.value_tree.Node object at 0x7f88b5ca05b0>, 4: <elf_diff.value_tree.Node object at 0x7f88b5ca05e0>, 7: <elf_diff.value_tree.Node object at 0x7f88b5ca0640>, 8: <elf_diff.value_tree.Node object at 0x7f88b5ca06d0>, 11: <elf_diff.value_tree.Node object at 0x7f88b5ca0730>, 14: <elf_diff.value_tree.Node object at 0x7f88b5ca0790>}'
document.symbols.migrated = '{1: <elf_diff.value_tree.Node object at 0x7f88b5cac730>, 2: <elf_diff.value_tree.Node object at 0x7f88b5cac760>, 3: <elf_diff.value_tree.Node object at 0x7f88b5cac820>, 5: <elf_diff.value_tree.Node object at 0x7f88b5cac8b0>, 6: <elf_diff.value_tree.Node object at 0x7f88b5cac940>, 9: <elf_diff.value_tree.Node object at 0x7f88b5cac9d0>, 10: <elf_diff.value_tree.Node object at 0x7f88b5caca60>, 12: <elf_diff.value_tree.Node object at 0x7f88b5cacaf0>, 13: <elf_diff.value_tree.Node object at 0x7f88b5cacb80>, 15: <elf_diff.value_tree.Node object at 0x7f88b5cacc10>, 16: <elf_diff.value_tree.Node object at 0x7f88b5cacca0>}'
document.symbols.new = '{22: <elf_diff.value_tree.Node object at 0x7f88b5c82bf0>, 23: <elf_diff.value_tree.Node object at 0x7f88b5c82c20>, 24: <elf_diff.value_tree.Node object at 0x7f88b5c82c80>, 25: <elf_diff.value_tree.Node object at 0x7f88b5c82d10>, 26: <elf_diff.value_tree.Node object at 0x7f88b5c82d70>, 27: <elf_diff.value_tree.Node object at 0x7f88b5c82dd0>, 28: <elf_diff.value_tree.Node object at 0x7f88b5c82e30>, 29: <elf_diff.value_tree.Node object at 0x7f88b5c82e90>, 30: <elf_diff.value_tree.Node object at 0x7f88b5c82ef0>, 31: <elf_diff.value_tree.Node object at 0x7f88b5c82f50>, 32: <elf_diff.value_tree.Node object at 0x7f88b5c82fb0>, 33: <elf_diff.value_tree.Node object at 0x7f88b5c83010>, 18: <elf_diff.value_tree.Node object at 0x7f88b5c83070>, 17: <elf_diff.value_tree.Node object at 0x7f88b5c830d0>, 21: <elf_diff.value_tree.Node object at 0x7f88b5c83130>, 20: <elf_diff.value_tree.Node object at 0x7f88b5c83190>, 19: <elf_diff.value_tree.Node object at 0x7f88b5c831f0>}'
document.symbols.old = '{5: <elf_diff.value_tree.Node object at 0x7f88b5c814b0>, 6: <elf_diff.value_tree.Node object at 0x7f88b5c814e0>, 7: <elf_diff.value_tree.Node object at 0x7f88b5c81540>, 8: <elf_diff.value_tree.Node object at 0x7f88b5c815d0>, 9: <elf_diff.value_tree.Node object at 0x7f88b5c81630>, 10: <elf_diff.value_tree.Node object at 0x7f88b5c81690>, 11: <elf_diff.value_tree.Node object at 0x7f88b5c816f0>, 12: <elf_diff.value_tree.Node object at 0x7f88b5c81750>, 13: <elf_diff.value_tree.Node object at 0x7f88b5c817b0>, 14: <elf_diff.value_tree.Node object at 0x7f88b5c81810>, 15: <elf_diff.value_tree.Node object at 0x7f88b5c81870>, 16: <elf_diff.value_tree.Node object at 0x7f88b5c818d0>, 1: <elf_diff.value_tree.Node object at 0x7f88b5c81930>, 4: <elf_diff.value_tree.Node object at 0x7f88b5c81990>, 0: <elf_diff.value_tree.Node object at 0x7f88b5c819f0>, 3: <elf_diff.value_tree.Node object at 0x7f88b5c81a50>, 2: <elf_diff.value_tree.Node object at 0x7f88b5c81ab0>}'
document.symbols.persisting = '{1: <elf_diff.value_tree.Node object at 0x7f88b5c5e470>, 2: <elf_diff.value_tree.Node object at 0x7f88b5c5e320>, 3: <elf_diff.value_tree.Node object at 0x7f88b5c5e2f0>, 5: <elf_diff.value_tree.Node object at 0x7f88b5c5db10>, 6: <elf_diff.value_tree.Node object at 0x7f88b5c5c880>, 9: <elf_diff.value_tree.Node object at 0x7f88b5c5c8e0>, 10: <elf_diff.value_tree.Node object at 0x7f88b5c5bbe0>, 12: <elf_diff.value_tree.Node object at 0x7f88b5c5bb20>, 13: <elf_diff.value_tree.Node object at 0x7f88b5ca0d00>, 15: <elf_diff.value_tree.Node object at 0x7f88b5ca0d90>, 16: <elf_diff.value_tree.Node object at 0x7f88b5ca0e20>}'
document.symbols.similar = '{0: <elf_diff.value_tree.Node object at 0x7f88b5ca2800>, 1: <elf_diff.value_tree.Node object at 0x7f88b5ca2860>, 2: <elf_diff.value_tree.Node object at 0x7f88b5ca29b0>, 3: <elf_diff.value_tree.Node object at 0x7f88b5ca2ad0>, 4: <elf_diff.value_tree.Node object at 0x7f88b5ca2bf0>, 5: <elf_diff.value_tree.Node object at 0x7f88b5ca2d10>, 6: <elf_diff.value_tree.Node object at 0x7f88b5ca2e30>, 7: <elf_diff.value_tree.Node object at 0x7f88b5ca2f50>, 8: <elf_diff.value_tree.Node object at 0x7f88b5ca3070>, 9: <elf_diff.value_tree.Node object at 0x7f88b5ca3190>, 10: <elf_diff.value_tree.Node object at 0x7f88b5ca32b0>, 11: <elf_diff.value_tree.Node object at 0x7f88b5ca33d0>, 12: <elf_diff.value_tree.Node object at 0x7f88b5ca34f0>, 13: <elf_diff.value_tree.Node object at 0x7f88b5ca3610>, 14: <elf_diff.value_tree.Node object at 0x7f88b5ca3730>, 15: <elf_diff.value_tree.Node object at 0x7f88b5ca3850>}'