-
-
Notifications
You must be signed in to change notification settings - Fork 676
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build(core): export Rust functions' stack sizes #4555
Conversation
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to make Cargo install the stack-sizes
binary as part of dev-dependencies
? Unfortunately it doesn't seem to be available in nixpkgs.
Good question, not sure if it's possible :( |
Perhaps it would make sense to add this functionality to https://github.com/trezor/binsize but leave it up to you if you want to do it. |
It is useful to find the top-most stack consuming functions: ``` $ make build_firmware $ arm-none-eabi-size -A build/firmware/firmware.elf | grep .stack_sizes .stack_sizes 7523 0 $ cargo install [email protected] $ stack-sizes build/firmware/firmware.elf | grep trezor_lib | sort -k2 -n | tail -n10 0x081c1721 3536 trezor_lib::ui::api::firmware_micropython::new_confirm_properties::h2ab0feebaf154486 0x081c0e7d 3560 trezor_lib::ui::api::firmware_micropython::new_confirm_modify_output::h04465b97d57fafb6 0x081c6161 3688 trezor_lib::ui::api::firmware_micropython::new_show_checklist::he16b109bc4dff398 0x081c4089 4240 trezor_lib::ui::api::firmware_micropython::new_request_pin::h3280c5eff8900a22 0x081be3e1 4960 trezor_lib::ui::api::firmware_micropython::new_confirm_action::h860f874d714ace74 0x081bf545 5096 trezor_lib::ui::api::firmware_micropython::new_confirm_emphasized::h9ade56f5c88001c0 0x081c1ded 5736 trezor_lib::ui::api::firmware_micropython::new_confirm_summary::he2e1274bbc07703e 0x081c7ee9 6760 trezor_lib::ui::api::firmware_micropython::new_show_remaining_shares::h1f67cbfdfeb4c683 0x081c127d 6768 trezor_lib::ui::api::firmware_micropython::new_confirm_more::h107a4be9b5431bb4 0x081c5441 8312 trezor_lib::ui::api::firmware_micropython::new_show_address_details::h352e0b87c58914ce ``` [no changelog]
b508b8a
to
5da93c0
Compare
Thanks - I'll prepare a pyelftools-based proof-of-concept and consult with @grdddj. |
FTR, it's possible to parse the Rust stack sizes from from elftools.construct import Struct, ULInt32, GreedyRange
from elftools.common.construct_utils import ULEB128
from elftools.elf.elffile import ELFFile
import subprocess
from pathlib import Path
SYMBOL_TYPES = ('t', 'w') # text, weak
FIRMWARE_ELF = Path('core/build/firmware/firmware.elf')
elf = ELFFile(FIRMWARE_ELF.open('rb'))
def load_address_map():
out = subprocess.check_output(args=['arm-none-eabi-nm', '--radix=d', '--demangle', FIRMWARE_ELF])
symbols = (line.decode().split(maxsplit=2) for line in out.splitlines())
return {
int(addr): name
for addr, type, name in symbols
if type.lower() in SYMBOL_TYPES
}
def load_stack_sizes():
stack_sizes = elf.get_section_by_name('.stack_sizes')
Entries = GreedyRange(Struct("Entry",
ULInt32("symbol_addr"),
ULEB128("stack_size"),
))
return Entries.parse(stack_sizes.data())
def main():
address_map = load_address_map()
for e in load_stack_sizes():
symbol_name = address_map[e.symbol_addr]
print(f'{e.stack_size}\t{symbol_name}')
if __name__ == '__main__':
main() Tested on 85bbc89:
|
It is useful to find the top-most stack consuming functions:
[no changelog]