mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 14:38:30 -04:00
Tools: scripts: Add PIE support in firmware_version_decoder
Calculate pointer offset for PIE (Position Independent Executables) binaries. Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
This commit is contained in:
parent
bcfb07b39f
commit
47d2021780
@ -6,6 +6,7 @@ import sys
|
||||
import struct
|
||||
from argparse import ArgumentParser
|
||||
from dataclasses import dataclass
|
||||
from elftools.elf.elffile import ELFFile
|
||||
from typing import Any
|
||||
|
||||
|
||||
@ -137,6 +138,7 @@ class Decoder:
|
||||
self.fwversion = FWVersion()
|
||||
self.byteorder = ""
|
||||
self.pointer_size = 0
|
||||
self.elffile = None
|
||||
|
||||
def unpack(self, struct_format: str) -> Any:
|
||||
struct_format = f"{self.byteorder}{struct_format}"
|
||||
@ -151,6 +153,9 @@ class Decoder:
|
||||
if address == 0:
|
||||
return ""
|
||||
|
||||
# Calculate address offset for PIE (Position Independent Executables) binaries
|
||||
address = next(self.elffile.address_offsets(address))
|
||||
|
||||
current_address = self.bytesio.seek(0, io.SEEK_CUR)
|
||||
self.bytesio.seek(address)
|
||||
string = []
|
||||
@ -193,8 +198,10 @@ class Decoder:
|
||||
self.fwversion.os_hash_string = self.unpack_string_from_pointer()
|
||||
|
||||
def process(self, filename) -> None:
|
||||
with open(filename, "rb") as file:
|
||||
# We need the file open for ELFFile
|
||||
file = open(filename, "rb")
|
||||
data = file.read()
|
||||
self.elffile = ELFFile(file)
|
||||
|
||||
if not data:
|
||||
raise RuntimeError("Failed to find FWVersion.")
|
||||
|
Loading…
Reference in New Issue
Block a user