From f53dd5ee51886213b758084c78a3ea7f24c1faa6 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 30 Sep 2025 23:11:14 +0200 Subject: [PATCH] no segfault anymore --- .gitignore | 11 +++--- build_ops_obj.sh => build.sh | 1 - pyproject.toml | 2 +- src/copapy/__init__.py | 18 +++++++--- src/copapy/generate_stencils.py | 18 ++++++++++ src/copapy/obj/stencils_x86_64.o | Bin 8016 -> 8008 bytes src/copapy/obj/stencils_x86_64_O1.o | Bin 7016 -> 7192 bytes src/copapy/obj/stencils_x86_64_O2.o | Bin 7248 -> 7400 bytes src/copapy/obj/stencils_x86_64_O3.o | Bin 7248 -> 7400 bytes src/copapy/stencil_db.py | 51 ++++++++++++++++------------ src/copapy/stencils.c | 10 ++++++ src/runner/runmem2.c | 13 +++---- test.sh | 8 +++++ tests/test_stencil.db.py | 21 ++++++++++-- 14 files changed, 114 insertions(+), 39 deletions(-) rename build_ops_obj.sh => build.sh (93%) create mode 100644 test.sh diff --git a/.gitignore b/.gitignore index c5541f6..781a906 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,16 @@ -backend/index/* +/backend/index/* __pycache__ *.code-workspace *.egg.info /src/*.egg-info/* /dist/* .vscode +.venv .mypy_cache .pytest_cache -tests/autogenerated_*.py +/tests/autogenerated_*.py *test*.o -/src/copapy/obj/ops*.o -test.copapy \ No newline at end of file +test.copapy +token.txt +/src/copapy/obj/*.o +runmem2 diff --git a/build_ops_obj.sh b/build.sh similarity index 93% rename from build_ops_obj.sh rename to build.sh index 3b4c79d..a7ad068 100644 --- a/build_ops_obj.sh +++ b/build.sh @@ -7,4 +7,3 @@ gcc -c src/copapy/stencils.c -o src/copapy/obj/stencils_x86_64.o gcc -c src/copapy/stencils.c -O1 -o src/copapy/obj/stencils_x86_64_O1.o gcc -c src/copapy/stencils.c -O2 -o src/copapy/obj/stencils_x86_64_O2.o gcc -c src/copapy/stencils.c -O3 -o src/copapy/obj/stencils_x86_64_O3.o -ls -l src/copapy/obj/*.o diff --git a/pyproject.toml b/pyproject.toml index da58c50..f8ee4b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ description = "Copy-Patch Compiler" readme = "README.md" requires-python = ">=3.10" -license = "MIT" +license = "GPL-3.0-only" classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", diff --git a/src/copapy/__init__.py b/src/copapy/__init__.py index 924e678..1e283ba 100644 --- a/src/copapy/__init__.py +++ b/src/copapy/__init__.py @@ -338,20 +338,30 @@ def compile_to_instruction_list(end_nodes: Iterable[Node] | Node) -> binw.data_w print('object_addr_lookp: ', object_addr_lookp) + data = sdb.get_func_data('function_start') + data_list.append(data) + offset += len(data) + for result_net, node in extended_output_ops: assert node.name in sdb.function_definitions, f"- Warning: {node.name} prototype not found" data = sdb.get_func_data(node.name) data_list.append(data) - print('*', node.name, ' '.join(f'{d:02X}' for d in data)) + print(f"* {node.name} ({offset}) " + ' '.join(f'{d:02X}' for d in data)) for patch in sdb.get_patch_positions(node.name): assert result_net, f"Relocation found but no net defined for operation {node.name}" object_addr = object_addr_lookp[result_net] - print('patch: ', patch, offset + patch.addr) - patch_list.append((patch.type.value, offset + patch.addr, object_addr)) + patch_value = object_addr + patch.addend - (offset + patch.addr) + print('patch: ', patch, object_addr, patch_value) + patch_list.append((patch.type.value, offset + patch.addr, patch_value)) offset += len(data) + data = sdb.get_func_data('function_end') + data_list.append(data) + offset += len(data) + print('function_end', offset, data) + # allocate program data dw.write_com(binw.Command.ALLOCATE_CODE) dw.write_int(offset) @@ -367,7 +377,7 @@ def compile_to_instruction_list(end_nodes: Iterable[Node] | Node) -> binw.data_w dw.write_com(binw.Command.PATCH_OBJECT) dw.write_int(patch_addr) dw.write_int(patch_type) - dw.write_int(object_addr) + dw.write_int(object_addr, signed=True) # set entry point dw.write_com(binw.Command.SET_ENTR_POINT) diff --git a/src/copapy/generate_stencils.py b/src/copapy/generate_stencils.py index 6d3c237..bfa78fe 100644 --- a/src/copapy/generate_stencils.py +++ b/src/copapy/generate_stencils.py @@ -4,6 +4,22 @@ from typing import Generator op_signs = {'add': '+', 'sub': '-', 'mul': '*', 'div': '/'} +def get_function_start(): + return """ + void function_start(){ + result_int(0); + asm volatile (".long 0xF27ECAFE"); + } + """ + +def get_function_end(): + return """ + void function_end(){ + result_int(0); + asm volatile (".long 0xF17ECAFE"); + } + """ + def get_op_code(op: str, type1: str, type2: str, type_out: str): return f""" void {op}_{type1}_{type2}({type1} arg1, {type2} arg2) {{ @@ -95,5 +111,7 @@ if __name__ == "__main__": for t1 in types: code += get_write_code(t1) + code += get_function_start() + get_function_end() + with open('src/copapy/stencils.c', 'w') as f: f.write(code) diff --git a/src/copapy/obj/stencils_x86_64.o b/src/copapy/obj/stencils_x86_64.o index 0af302feddf01e7697cd8024b07b4d6b6c141023..d328f5c1e1a6cabd2d4fbb00a0a8b30c6d028954 100644 GIT binary patch literal 8008 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 VEK)%|R%MR%M=8N(G!sR){|77VymbHo literal 7016 zcmd6rZHQE56vyxSl3T6LDoT4k&>_d_4VG86?h!la@Xh*&5}NJ^VvC1mZKd;e$Vc=q0Lz%M;;eeUx+ z|8t&m&wZKWzOZcNW5deI92sTKBTiu@)N!gO7S0>o(*|d>Q{m)7Q~zz;bGdx*i``et z1}?FMPXBJ)bEf>X*h1Ck*t|9L*U4O{=4>w1e9B)4)p=5VRa{lvI;+$~Hk6b|F;y;9 z%o;j6=zpa{O0vGBOp2*;p&)DTH7@KM1B1P1OU!0dN!b)rWbKmLG z!XGYuh%L*PELjw;ZfePPWwPPgd69XM=$r*vcR6?W+`34#ZWb`t!x=$GB^|EoswQWc zwkm~xlbfzRTZ_!jV$;P-=X z1aAYM3f=_13*5$k4cx~67~IA`18(F01U`jl%5yFD{RiB}ufPw3jXwk2#(x-m8sax2 z{#tMwKLKvz?*+H<-vSRK{yN0}B!GVjJ_Guvq5l=U3Vc2I^?*3z=^^0}=6|SevhQs0 zncy1`XDPUizafBUz-|0j0`%_(@Xx@fBcG>`&$j{bF9*aKftR5Qail(z!EK&(K6-Zb z8(iWM&ea=!w&6aVNCgSUDek@-#JD}-_t=gH2(Vss?lVV>e_;IdjnFTnnTPu<()=VH ze)@Le9Df_lJltoL<{fk}?`23s_TNM2%s+6c<48V-z%PKyzVCp`J1Oyxf{(*9>b}Fo zJ_UaeT;iVxZw8n6--GW4m-xSf%R4rW);w}_aQ-Jud~P9`{{}AcL*Ny7wj}<2;5GVL zq}cO`kEO3Ke}j3*{3!G*jJ^r{8F2UACch-&xIt8$9_SB1Uj@M-;(qt{UFiGFzQ@5Y z8vZr-6>#@kKzm#UpP=6j;&+ga>$cGFso?9u!^m?1c#qMq27l9Vu8VuWz^5b5UhsZ! ziT^gZ6ut`j_c+9IwD&8I~M93zSJ-nha73{TnyGy;GK7J~4UZZ{U zg;zqpE%{JGx#zBUKCqXxpJj+oeh<%i=;ax%_6V}ns?zFGMQ^$}+9DoqM6bL<_VKgb z?6)J;nTg{DNjV)4inEKo1;2tJyodbS@NxZyH|iC?L-9?Dmn*(Yajkz{aUK7Z;#$wY z4?I|_|E%IV{;P^>eV^hw{*Q`l{SC!+{3-Mu;$icz2j}S? zI;8%Km0s`L9H8GApx>qR_p10WDZS22>}G0`wmR==+pjKW`V5 zUg!Uf((CK}GeDnHdYykIUpx(4{|Vr>{&NHL3j_3PlwRk*PU&lCe|g?AO0VnLqx7?t zK1}C4IDb51?pnTY!nsB~R(n%kFa3Il;nJ7CXt?y{^4*j8(wFxcz4Ybh441yV-*D;6 zuNf|Vc_qF-vaj^z)rL!7-e9=&<>DuCq%YrY^wO8_GhF)e!-h*=e#~&`zb_gt{r4rq zrO%d|DtSsjJ&^$o;nGh>4ZnhQqv6s|Z!ui@>79m4KYh?}>8FnvF8%aL!%yHn{K0VP zrzKxDyAnM2@;wwT{d8Ep?`)HPy54Znu;ak ze0y$tged|)8vISvqXCPTQ6I74F_NV-iOyKkkSE^B5i~~q@V|>N`|`Ju$3$;({~ymB zm}~Lf}BRt z;XaExz({Wq){M@jeu7)*g!i}pVfZ(i!dU-}VGI88T=!~6#&8uB+TZ#A^mW65AH(Ul(KA43`mZ_58`@6~@fhSQ$_ diff --git a/src/copapy/obj/stencils_x86_64_O2.o b/src/copapy/obj/stencils_x86_64_O2.o index 5a06a56a4e073c19e71bc9b471faa804abd54ebf..3f6a64b38239825ccf97f7e89a8334abcdd650dc 100644 GIT binary patch literal 7400 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 patch_entry: if reloc_type in ('R_AMD64_PLT32', 'R_AMD64_PC32'): # S + A - P - patch_offset = relocation_addr - r_addend - return patch_entry(RelocationType.RELOC_RELATIVE_32, patch_offset) + patch_offset = relocation_addr + return patch_entry(RelocationType.RELOC_RELATIVE_32, patch_offset, r_addend) else: raise Exception(f"Unknown: {reloc_type}") -def get_ret_function_def(symbol: pelfy.elf_symbol): - #print('*', symbol.name, symbol.section) - result_func = symbol.relocations[-1].symbol +def get_ret_function_def(symbol: pelfy.elf_symbol) -> str: + #print('*', symbol.name, len(symbol.relocations)) + if symbol.relocations: + result_func = symbol.relocations[-1].symbol - assert result_func.name.startswith('result_') - return result_func.name[7:] + assert result_func.name.startswith('result_') + return result_func.name[7:] + else: + return 'void' -def strip_symbol(data: bytes, byteorder: Literal['little', 'big']) -> bytes: +def strip_symbol(data: bytes, byteorder: ByteOrder) -> bytes: """Return data between start and end marker and removing last instruction (call)""" + start_index, end_index = get_stencil_position(data, byteorder) + return data[start_index:end_index] + +def get_stencil_position(data: bytes, byteorder: ByteOrder) -> tuple[int, int]: # Find first start marker - start_index = data.find(start_marker.to_bytes(4, byteorder)) + marker_index = data.find(START_MARKER.to_bytes(MARKER_LENGTH, byteorder)) + start_index = 0 if marker_index < 0 else marker_index + MARKER_LENGTH # Find last end marker - end_index = data.rfind(end_marker.to_bytes(4, byteorder), start_index) - - assert start_index > -1 and end_index > -1, f"Marker not found" - return data[start_index + 4:end_index - LENGTH_CALL_INSTRUCTION] + end_index = data.rfind(END_MARKER.to_bytes(MARKER_LENGTH, byteorder)) + end_index = len(data) if end_index < 0 else end_index - LENGTH_CALL_INSTRUCTION + return start_index, end_index class stencil_database(): @@ -82,9 +92,8 @@ class stencil_database(): """Return patch positions """ symbol = self.elf.symbols[symbol_name] - start_index = symbol.data.find(start_marker.to_bytes(4, symbol.file.byteorder)) - end_index = symbol.data.rfind(end_marker.to_bytes(4, symbol.file.byteorder), start_index) - + start_index, end_index = get_stencil_position(symbol.data, symbol.file.byteorder) + for reloc in symbol.relocations: # address to fist byte to patch relative to the start of the symbol @@ -94,8 +103,8 @@ class stencil_database(): reloc.bits, reloc.fields['r_addend']) - # Exclude the call to the result_x function - if patch.addr < end_index - start_index - LENGTH_CALL_INSTRUCTION: + # Exclude the call to the result_x function + if patch.addr < end_index - start_index: yield patch diff --git a/src/copapy/stencils.c b/src/copapy/stencils.c index ae52294..6dcd207 100644 --- a/src/copapy/stencils.c +++ b/src/copapy/stencils.c @@ -222,4 +222,14 @@ result_float(arg1); asm volatile (".long 0xF27ECAFE"); } + + void function_start(){ + result_int(0); + asm volatile (".long 0xF27ECAFE"); + } + + void function_end(){ + result_int(0); + asm volatile (".long 0xF17ECAFE"); + } \ No newline at end of file diff --git a/src/runner/runmem2.c b/src/runner/runmem2.c index 2513371..de1398b 100644 --- a/src/runner/runmem2.c +++ b/src/runner/runmem2.c @@ -71,6 +71,7 @@ int parse_commands(uint8_t *bytes){ int data_offs; uint32_t size; int err_flag = 0; + uint32_t rel_entr_point; while(!err_flag){ command = *(uint32_t*)bytes; @@ -78,8 +79,8 @@ int parse_commands(uint8_t *bytes){ switch(command) { case ALLOCATE_DATA: size = *(uint32_t*)bytes; bytes += 4; - printf("ALLOCATE_DATA size=%i\n", size); data_memory = get_data_memory(size); + printf("ALLOCATE_DATA size=%i mem_addr=%p\n", size, (void*)data_memory); break; case COPY_DATA: @@ -91,9 +92,9 @@ int parse_commands(uint8_t *bytes){ case ALLOCATE_CODE: size = *(uint32_t*)bytes; bytes += 4; - printf("ALLOCATE_CODE size=%i\n", size); executable_memory = get_executable_memory(size); executable_memory_len = size; + printf("ALLOCATE_CODE size=%i mem_addr=%p\n", size, (void*)executable_memory); //printf("# d %i c %i off %i\n", data_memory, executable_memory, data_offs); break; @@ -117,19 +118,19 @@ int parse_commands(uint8_t *bytes){ offs = *(uint32_t*)bytes; bytes += 4; reloc_type = *(uint32_t*)bytes; bytes += 4; value = *(int32_t*)bytes; bytes += 4; - printf("PATCH_OBJECT patch_offs=%i reloc_type=%i value=%i\n", - offs, reloc_type, value); data_offs = (int32_t)(data_memory - executable_memory); + //printf("PATCH_OBJECT patch_offs=%i reloc_type=%i value=%i data_offs=%i\n", + // offs, reloc_type, value, data_offs); if (abs(data_offs) > 0x7FFFFFFF) { perror("code and data memory to far apart"); return EXIT_FAILURE; } - patch(executable_memory + offs, reloc_type, value + (int32_t)data_offs); + patch(executable_memory + offs, reloc_type, value + data_offs); //printf("> %i\n", data_offs); break; case SET_ENTR_POINT: - uint32_t rel_entr_point = *(uint32_t*)bytes; bytes += 4; + rel_entr_point = *(uint32_t*)bytes; bytes += 4; printf("SET_ENTR_POINT rel_entr_point=%i\n", rel_entr_point); entr_point = (int (*)())(executable_memory + rel_entr_point); break; diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..feb7f06 --- /dev/null +++ b/test.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e +echo "Compile..." +python tests/test_compile.py +echo "Run..." +echo "-----------------------------------" +gcc -Wall -Wextra -Wconversion -Wsign-conversion -Wshadow -Wstrict-overflow -Werror -g src/runner/runmem2.c -o runmem2 +./runmem2 test.copapy \ No newline at end of file diff --git a/tests/test_stencil.db.py b/tests/test_stencil.db.py index abdcb7e..a5bfe7a 100644 --- a/tests/test_stencil.db.py +++ b/tests/test_stencil.db.py @@ -1,9 +1,26 @@ from copapy import stencil_database +from copapy import stencil_db -if __name__ == "__main__": +def test_list_symbols(): sdb = stencil_database('src/copapy/obj/stencils_x86_64_O3.o') print('----') #print(sdb.function_definitions) for sym_name in sdb.function_definitions.keys(): print('\n-', sym_name) - print(list(sdb.get_patch_positions(sym_name))) \ No newline at end of file + print(list(sdb.get_patch_positions(sym_name))) + + +def test_start_end_function(): + sdb = stencil_database('src/copapy/obj/stencils_x86_64_O3.o') + for sym_name in sdb.function_definitions.keys(): + data = sdb.elf.symbols[sym_name].data + print('-', sym_name, stencil_db.get_stencil_position(data, sdb.elf.byteorder), len(data)) + + start, end = stencil_db.get_stencil_position(data, sdb.elf.byteorder) + + assert start>= 0 and end >= start and end <= len(data) + + +if __name__ == "__main__": + test_list_symbols() + test_start_end_function() \ No newline at end of file