mirror of https://github.com/Nonannet/copapy.git
4-Byte-Alignment error on ARM thumb fixed by using section size instead of function size to include nop padding
This commit is contained in:
parent
bc0ccd90b7
commit
a81236a3fc
|
|
@ -80,11 +80,20 @@ def get_return_function_type(symbol: pelfy.elf_symbol) -> str:
|
||||||
|
|
||||||
def get_stencil_position(func: pelfy.elf_symbol) -> tuple[int, int]:
|
def get_stencil_position(func: pelfy.elf_symbol) -> tuple[int, int]:
|
||||||
start_index = 0 # There must be no prolog
|
start_index = 0 # There must be no prolog
|
||||||
|
|
||||||
# Find last relocation in function
|
# Find last relocation in function
|
||||||
last_instr = get_last_call_in_function(func)
|
last_instr = get_last_call_in_function(func)
|
||||||
function_size = func.fields['st_size']
|
|
||||||
if last_instr + 5 >= function_size: # Check if jump is last instruction
|
assert func.section, f"No code section specified for symbol {func.name}"
|
||||||
end_index = last_instr # Jump can be striped
|
|
||||||
|
# func.section.fields['sh_size'] is equivalent to func.fields['st_size']
|
||||||
|
# expect for ARM thumb, here nop padding at the end for 4-byte alignment
|
||||||
|
# is not included in st_size
|
||||||
|
function_size = func.section.fields['sh_size']
|
||||||
|
|
||||||
|
# Check if jump is the last instruction and can be striped
|
||||||
|
if last_instr + 5 >= function_size:
|
||||||
|
end_index = last_instr
|
||||||
else:
|
else:
|
||||||
end_index = function_size
|
end_index = function_size
|
||||||
|
|
||||||
|
|
@ -98,7 +107,8 @@ def get_last_call_in_function(func: pelfy.elf_symbol) -> int:
|
||||||
if reloc.symbol.name.startswith('dummy_'):
|
if reloc.symbol.name.startswith('dummy_'):
|
||||||
return -0xFFFF # Last relocation is not a jump
|
return -0xFFFF # Last relocation is not a jump
|
||||||
else:
|
else:
|
||||||
# Assume the call instruction is 4 bytes long for relocations with less than 32 bit and 5 bytes otherwise
|
# Assume the jump/call instruction is 4 bytes long for relocations
|
||||||
|
# with less than 32 bit and 5 bytes otherwise
|
||||||
instruction_lengths = 4 if reloc.bits < 32 else 5
|
instruction_lengths = 4 if reloc.bits < 32 else 5
|
||||||
address_field_length = 4
|
address_field_length = 4
|
||||||
#print(f"-> {[r.fields['r_offset'] - func.fields['st_value'] for r in func.relocations]}")
|
#print(f"-> {[r.fields['r_offset'] - func.fields['st_value'] for r in func.relocations]}")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue