diff --git a/examples/check.sh b/examples/check.sh index 46ec6d3..0e0e6a1 100755 --- a/examples/check.sh +++ b/examples/check.sh @@ -11,7 +11,7 @@ case "$1" in ;; run) echo "[*] Loading and running $FILE" - sudo bpftool prog load "$FILE" "$PIN_PATH" autoattach + sudo bpftool prog loadall "$FILE" "$PIN_PATH" autoattach echo "[+] Program loaded. Press Ctrl+C to stop" sudo cat /sys/kernel/debug/tracing/trace_pipe sudo rm -f "$PIN_PATH" diff --git a/examples/execve2.py b/examples/execve2.py index 39d1de2..94e87a8 100644 --- a/examples/execve2.py +++ b/examples/execve2.py @@ -6,12 +6,13 @@ from ctypes import c_void_p, c_int64, c_int32 @section("tracepoint/syscalls/sys_enter_execve") def hello(ctx: c_void_p) -> c_int32: print("entered") + print("multi constant support") return c_int32(0) @bpf @section("tracepoint/syscalls/sys_exit_execve") -def hello_again(ctx: c_void_p) -> c_int64: +def hello_again(ctx: c_void_p) -> c_int32: print("exited") - return c_int64(0) + return c_int32(0) LICENSE = "GPL" diff --git a/pythonbpf/bpf_helper_handler.py b/pythonbpf/bpf_helper_handler.py index 2f80468..d8358da 100644 --- a/pythonbpf/bpf_helper_handler.py +++ b/pythonbpf/bpf_helper_handler.py @@ -2,13 +2,17 @@ import ast from llvmlite import ir def bpf_printk_emitter(call, module, builder, func): - # Handle print statement + if not hasattr(func, "_fmt_counter"): + func._fmt_counter = 0 + for arg in call.args: if isinstance(arg, ast.Constant) and isinstance(arg.value, str): fmt_str = arg.value + "\n" + "\0" - # Create a global variable for the format string + fmt_name = f"{func.name}____fmt{func._fmt_counter}" + func._fmt_counter += 1 + fmt_gvar = ir.GlobalVariable( - module, ir.ArrayType(ir.IntType(8), len(fmt_str)), name=f"{func.name}____fmt") + module, ir.ArrayType(ir.IntType(8), len(fmt_str)), name=fmt_name) fmt_gvar.global_constant = True fmt_gvar.initializer = ir.Constant( # type: ignore ir.ArrayType(ir.IntType(8), len(fmt_str)), @@ -17,17 +21,13 @@ def bpf_printk_emitter(call, module, builder, func): fmt_gvar.linkage = "internal" fmt_gvar.align = 1 # type: ignore - # Cast the global variable to i8* - fmt_ptr = builder.bitcast( - fmt_gvar, ir.PointerType()) + fmt_ptr = builder.bitcast(fmt_gvar, ir.PointerType()) - # Call bpf_trace_printk (assumed to be at address 6) fn_type = ir.FunctionType(ir.IntType( 64), [ir.PointerType(), ir.IntType(32)], var_arg=True) fn_ptr_type = ir.PointerType(fn_type) fn_addr = ir.Constant(ir.IntType(64), 6) fn_ptr = builder.inttoptr(fn_addr, fn_ptr_type) - # Call the function builder.call(fn_ptr, [fmt_ptr, ir.Constant( - ir.IntType(32), len(fmt_str))], tail=True) \ No newline at end of file + ir.IntType(32), len(fmt_str))], tail=True) diff --git a/pythonbpf/type_deducer.py b/pythonbpf/type_deducer.py index 30b6b5f..5d63864 100644 --- a/pythonbpf/type_deducer.py +++ b/pythonbpf/type_deducer.py @@ -2,7 +2,6 @@ from llvmlite import ir #TODO: THIS IS NOT SUPPOSED TO MATCH STRINGS :skull: def ctypes_to_ir(ctype: str): - print("CTYPE", ctype) mapping = { "c_int8": ir.IntType(8), "c_uint8": ir.IntType(8),