77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
import sys
|
|
from makeelf.elf import ELF, EM, ELFDATA, ELFCLASS
|
|
|
|
|
|
def create_elf(output_path, segments, entry_point):
|
|
elf = ELF(
|
|
e_machine=EM.EM_XTENSA, e_data=ELFDATA.ELFDATA2LSB, e_class=ELFCLASS.ELFCLASS32
|
|
)
|
|
elf.Elf.Ehdr.e_entry = entry_point
|
|
|
|
for name, addr, data_path in segments:
|
|
with open(data_path, "rb") as f:
|
|
data = f.read()
|
|
elf.append_section(name, data, addr)
|
|
|
|
print(f"Writing ELF to {output_path}...")
|
|
with open(output_path, "wb") as f:
|
|
f.write(bytes(elf))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ultra_segments = [
|
|
(
|
|
".flash.rodata",
|
|
0x3C0E0020,
|
|
"/home/sapient/esp32-analysis/extracted/seg0_DROM.bin",
|
|
),
|
|
(
|
|
".dram0.data",
|
|
0x3FC96440,
|
|
"/home/sapient/esp32-analysis/extracted/seg1_DRAM.bin",
|
|
),
|
|
(
|
|
".iram0.text",
|
|
0x40374000,
|
|
"/home/sapient/esp32-analysis/extracted/seg2_IRAM.bin",
|
|
),
|
|
(
|
|
".flash.text",
|
|
0x42000020,
|
|
"/home/sapient/esp32-analysis/extracted/seg3_IROM.bin",
|
|
),
|
|
]
|
|
create_elf(
|
|
"/home/sapient/esp32-analysis/output_dumps/Ultra-TDeck-v9.2.elf",
|
|
ultra_segments,
|
|
0x4037736C,
|
|
)
|
|
|
|
meshos_segments = [
|
|
(
|
|
".flash.rodata",
|
|
0x3C190020,
|
|
"/home/sapient/esp32-analysis/MeshOS_1.1.8/extracted/seg0_DROM.bin",
|
|
),
|
|
(
|
|
".dram0.data",
|
|
0x3FC98F50,
|
|
"/home/sapient/esp32-analysis/MeshOS_1.1.8/extracted/seg1_DRAM.bin",
|
|
),
|
|
(
|
|
".iram0.text",
|
|
0x40374000,
|
|
"/home/sapient/esp32-analysis/MeshOS_1.1.8/extracted/seg2_IRAM.bin",
|
|
),
|
|
(
|
|
".flash.text",
|
|
0x42000020,
|
|
"/home/sapient/esp32-analysis/MeshOS_1.1.8/extracted/seg3_IROM.bin",
|
|
),
|
|
]
|
|
create_elf(
|
|
"/home/sapient/esp32-analysis/output_dumps/MeshOS-TDeck-1.1.8.elf",
|
|
meshos_segments,
|
|
0x40377A10,
|
|
)
|