#!/usr/bin/env python3 # # Copyright (c) 2024 STMicroelectronics # SPDX-License-Identifier: Apache-2.0 """ This file implements the Symbol Link Identifer (SLID) generation code, for use by the LLEXT subsystem. SLID-based linking is enabled by the Kconfig option 'CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID'. When executed as a script, this file can be used as an interactive prompt to calculate the SLID of arbitrary symbols, which can be useful for debugging purposes. IMPLEMENTATION NOTES: Currently, SLIDs are generated by taking the first [pointer size] bytes of the symbol name's SHA-256 hash, taken in big-endian order. This ordering provides one advantage: the 32-bit SLID for an export is present in the top 32 bits of the 64-bit SLID for the same export. """ from hashlib import sha256 def generate_slid(symbol_name: str, slid_size: int) -> int: """ Generates the Symbol Link Identifier (SLID) for a symbol. symbol_name: Name of the symbol for which to generate a SLID slid_side: Size of the SLID in bytes (4/8) """ if slid_size not in (4, 8): raise AssertionError(f"Invalid SLID size {slid_size}") m = sha256() m.update(symbol_name.encode("utf-8")) hash = m.digest() return int.from_bytes(hash[0:slid_size], byteorder='big', signed=False) def format_slid(slid: int, slid_size: int) -> str: if slid_size == 4: fmt = f"0x{slid:08X}" elif slid_size == 8: fmt = f"0x{slid:016X}" return fmt def repl(): while True: sym_name = input("Symbol name? ") slid32 = generate_slid(sym_name, 4) slid64 = generate_slid(sym_name, 8) print(f" 32-bit SLID for '{sym_name}': {format_slid(slid32, 4)}") print(f" 64-bit SLID for '{sym_name}': {format_slid(slid64, 8)}") print() if __name__ == "__main__": print("LLEXT SLID calculation REPL") print("Press ^C to exit.") try: repl() except KeyboardInterrupt: print()