From 50e376110ce44ab5a4cda411ce7d50ee010a0db3 Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 12 Mar 2026 10:40:35 +0000 Subject: [PATCH 1/3] Improved logger compatibility for non posix intercepting libraries --- capio/common/syscall.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/capio/common/syscall.hpp b/capio/common/syscall.hpp index a4c182dc6..cfb411e4b 100644 --- a/capio/common/syscall.hpp +++ b/capio/common/syscall.hpp @@ -3,7 +3,7 @@ #include -#ifdef __CAPIO_POSIX +#if defined(__CAPIO_POSIX) && !defined(__CAPIO_POSIX_ALIKE) #include From b0a076f2e3e8d9d00bca3c214518ca3cde51d370 Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 12 Mar 2026 11:29:29 +0000 Subject: [PATCH 2/3] Updated gen_syscall.sh for cross architecture compatibility --- CMakeLists.txt | 1 + capio/common/syscall.hpp | 2 +- scripts/gen_syscallnames.sh | 92 ++++++++++++++++++++++--------------- 3 files changed, 56 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc0842141..a3c372de8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ IF (CAPIO_LOG) execute_process( COMMAND bash "${PROJECT_SOURCE_DIR}/scripts/gen_syscallnames.sh" "${PROJECT_BINARY_DIR}/include/syscall/syscallnames.h" + ${CMAKE_CXX_COMPILER} ) ELSE (CMAKE_BUILD_TYPE STREQUAL "Debug") message(WARNING "Capio logger enabled in release mode. skipping compilation of CAPIO logger") diff --git a/capio/common/syscall.hpp b/capio/common/syscall.hpp index cfb411e4b..a4c182dc6 100644 --- a/capio/common/syscall.hpp +++ b/capio/common/syscall.hpp @@ -3,7 +3,7 @@ #include -#if defined(__CAPIO_POSIX) && !defined(__CAPIO_POSIX_ALIKE) +#ifdef __CAPIO_POSIX #include diff --git a/scripts/gen_syscallnames.sh b/scripts/gen_syscallnames.sh index cf195a15e..420296bf2 100755 --- a/scripts/gen_syscallnames.sh +++ b/scripts/gen_syscallnames.sh @@ -1,42 +1,58 @@ #!/bin/bash -if [ -z "${1}" ]; then - echo "Usage: $(basename "${BASH_SOURCE[0]}") OUTPUT_PATH" - exit +OUTPUT_PATH="${1}" +PROVIDED_COMPILER="${2}" + +if [ -z "${OUTPUT_PATH}" ]; then + echo "Usage: $(basename "${BASH_SOURCE[0]}") OUTPUT_PATH [COMPILER_PATH]" + exit 1 +fi + +CC="${PROVIDED_COMPILER:-$(command -v gcc || command -v clang)}" + +if [ -z "$CC" ]; then + echo "Error: No compiler found." >&2 + exit 1 fi -ARCH=$(uname -m | rev | cut -c 1-2 | rev) -INPUT=$(find /usr/include -name "unistd_${ARCH}.h") -DESTINATION="${1}" - -# Generate default destination file -mkdir -p "$(dirname "${DESTINATION}")" -echo 'auto sys_num_to_string(int sysnum) { return "Table not created"; }' > "${DESTINATION}" - -# Parse syscall names -echo "Parsing ${INPUT}" -DATA="auto sys_num_to_string(int sysnum) { - switch (sysnum) {" > "${DESTINATION}" - -while IFS= read -r line -do - if [[ "$(echo "$line" | grep '#define __NR_')" != "" ]] - then - SYSCALL=$(echo "$line" | cut -d ' ' -f 2) - SYSCALL=${SYSCALL#"__NR_"} - SYSCALLNO=$(echo "$line" | cut -d ' ' -f 3) - DATA="$DATA - case $SYSCALLNO: - return \"$SYSCALL\";" >> "${DESTINATION}" - fi -done < "${INPUT}" - -# Add default branch -DATA="$DATA - default: - return \"Unknown\"; - }; -};" - -# Print content to the destination file -echo "${DATA}" > "${DESTINATION}" +OUTPUT_DIRECTORY=$(dirname $OUTPUT_PATH) + +echo "Generating syscall table using $CC..." +echo "Output directory: $OUTPUT_DIRECTORY" +echo "Output path: $OUTPUT_PATH" + +mkdir -p "$OUTPUT_DIRECTORY" + +# Create a temporary C file to resolve macro values +TEMP_C=$(mktemp /tmp/syscall_gen.XXXXXX.c) +echo "#include " > "$TEMP_C" +$CC -E -dM "$TEMP_C" | grep "#define __NR_" | awk '{print $2}' | sort | uniq | while read -r line; do + echo "VAL_$line=$line" >> "$TEMP_C" +done + +# Run preprocessor on our temp file to get the resolved integers +RESOLVED_DEFS=$($CC -E -P "$TEMP_C" | grep "VAL___NR_") +rm "$TEMP_C" + +{ + echo "#include " + echo "" + echo "inline std::string sys_num_to_string(int sysnum) {" + echo " switch (sysnum) {" + + echo "$RESOLVED_DEFS" | while IFS='=' read -r label value; do + name=${label#VAL___NR_} + if [[ "$name" == "syscalls" || "$name" == "ia32_syscalls" || "$name" == "x32_syscalls" ]]; then + continue + fi + if [[ "$value" =~ ^[0-9]+$ ]]; then + echo " case $value: return \"$name\";" + fi + done | sort -n -u -k2 + + echo " default: return \"Unknown (\" + std::to_string(sysnum) + \")\";" + echo " }" + echo "}" +} > "${OUTPUT_PATH}" + +echo "Done! Generated $(grep "case" "$OUTPUT_PATH" | wc -l) syscalls." \ No newline at end of file From a4f237ace1a3e61d9fc269da8e54378b2c2bd5cb Mon Sep 17 00:00:00 2001 From: Marco Edoardo Santimaria <39337626+marcoSanti@users.noreply.github.com> Date: Sat, 14 Mar 2026 08:34:42 +0000 Subject: [PATCH 3/3] apply suggestion by @glassOfWhiskey Co-authored-by: Iacopo Colonnelli --- scripts/gen_syscallnames.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gen_syscallnames.sh b/scripts/gen_syscallnames.sh index 420296bf2..bf2d3c48b 100755 --- a/scripts/gen_syscallnames.sh +++ b/scripts/gen_syscallnames.sh @@ -24,7 +24,7 @@ echo "Output path: $OUTPUT_PATH" mkdir -p "$OUTPUT_DIRECTORY" # Create a temporary C file to resolve macro values -TEMP_C=$(mktemp /tmp/syscall_gen.XXXXXX.c) +TEMP_C=$(mktemp -t syscall_gen.XXXXXX.c) echo "#include " > "$TEMP_C" $CC -E -dM "$TEMP_C" | grep "#define __NR_" | awk '{print $2}' | sort | uniq | while read -r line; do echo "VAL_$line=$line" >> "$TEMP_C"