import os
os.environ
import subprocess
print(subprocess.check_output('arm-none-eabi-objcopy -h', shell=True).decode())
# 使用 subprocess 执行命令
from elftools.elf.elffile import ELFFile
from elftools.elf.sections import SymbolTableSection
with open('out/stm32_blink_led.elf', 'rb') as stm32_elf_file:
stm32_elf = ELFFile(stm32_elf_file)
for section in stm32_elf.iter_sections():
print(section.name, section.header.sh_type)
for segment in stm32_elf.iter_segments():
print(segment.header)
# find
for section in stm32_elf.iter_sections():
if isinstance(section, SymbolTableSection):
for symbol in section.iter_symbols():
if symbol.name == '__data_init_start':
print(symbol.name, '%#x'%symbol['st_value'])
SHT_NULL
.text SHT_PROGBITS
.data SHT_PROGBITS
.bss SHT_NOBITS
.stack SHT_NOBITS
.debug_aranges SHT_PROGBITS
.debug_info SHT_PROGBITS
.debug_abbrev SHT_PROGBITS
.debug_line SHT_PROGBITS
.debug_frame SHT_PROGBITS
.debug_str SHT_PROGBITS
.debug_loc SHT_PROGBITS
.ARM.attributes SHT_ARM_ATTRIBUTES
.debug_ranges SHT_PROGBITS
.debug_macro SHT_PROGBITS
.comment SHT_PROGBITS
.symtab SHT_SYMTAB
.strtab SHT_STRTAB
.shstrtab SHT_STRTAB
Container({'p_type': 'PT_LOAD', 'p_offset': 65536, 'p_vaddr': 134217728, 'p_paddr': 134217728, 'p_filesz': 752, 'p_memsz': 752, 'p_flags': 5, 'p_align': 65536})
Container({'p_type': 'PT_LOAD', 'p_offset': 131072, 'p_vaddr': 536870912, 'p_paddr': 134218480, 'p_filesz': 68, 'p_memsz': 68, 'p_flags': 6, 'p_align': 65536})
Container({'p_type': 'PT_LOAD', 'p_offset': 68, 'p_vaddr': 536870980, 'p_paddr': 536870980, 'p_filesz': 0, 'p_memsz': 1028, 'p_flags': 6, 'p_align': 65536})
__data_init_start 134218480
from elftools.elf.elffile import ELFFile
with open('out/stm32_blink_led.elf', 'rb') as stm32_elf_file:
stm32_elf = ELFFile(stm32_elf_file)
for section in stm32_elf.iter_sections():
print(section.header)
只要是 VMA 不等于 LMA 就可以认为是需要 load 的,可以通过 ld 脚本中的符号来确定是否需要压缩。先不考虑一个 segment 中含有多个 sections 的情况,这种情况下可以统一 load,但是存在的问题是,由于包含的内容不同,所以其对于不同压缩算法的适应性是不同的,为了更好的压缩效果是需要将多个 sections 分开的。一般在开启MMU后,代码和相关的数组会放在一起,所以会有两个sections的相连?
readelf -s 可以获取elf的符号表 符号表中的符号会被优化掉吗,
arm-none-eabi-objdump -x --syms 可以进行memory dump
arm-none-eabi-objdump -S 可以将源码和汇编显示到一起
import struct
import os
with open('stm32.bin', 'rb') as binfile:
print(type(binfile.read(1)))
print(len(binfile.read(10)))
<class 'bytes'> 10