mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-11 16:24:25 +00:00
This commit introduces support for an alternate linking method in the LLEXT subsystem, called "SLID" (short for Symbol Link Identifier), enabled by the CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID Kconfig option. SLID-based linking uses a unique identifier (integer) to identify exported symbols, instead of using the symbol name as done currently. This approach provides several benefits: * linking is faster because the comparison operation to determine whether we found the correct symbol in the export table is now an integer compare, instead of a string compare * binary size is reduced as symbol names can be dropped from the binary * confidentiality is improved as a side-effect, as symbol names are no longer present in the binary Signed-off-by: Mathieu Choplain <mathieu.choplain@st.com>
66 lines
1.9 KiB
Python
Executable File
66 lines
1.9 KiB
Python
Executable File
#!/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()
|