From 38f24ca05c50c2003276bb65b1e160ff97daa4b4 Mon Sep 17 00:00:00 2001 From: Thomas A Date: Tue, 29 Aug 2023 09:41:11 -0700 Subject: [PATCH] [xtrace] Convert All Source Files To CPP * Changed all sources files from `c` to `cpp`. * Updated header files to include `extern "C"`. * Added a few more C-styled casts. * Fail build if hook struct is not implemented for arch. * Misc formatting. --- src/xtrace/CMakeLists.txt | 12 ++-- src/xtrace/base.h | 9 +-- src/xtrace/bsd_trace.h | 14 +++-- src/xtrace/include/xtrace/xtrace-mig-types.h | 11 ++++ src/xtrace/{lock.c => lock.cpp} | 11 ++-- src/xtrace/lock.h | 4 +- src/xtrace/mach_trace.h | 14 +++-- src/xtrace/{malloc.c => malloc.cpp} | 9 ++- src/xtrace/malloc.h | 4 +- src/xtrace/{mig_trace.c => mig_trace.cpp} | 4 +- src/xtrace/mig_trace.h | 14 +++-- ...osix_spawn_args.c => posix_spawn_args.cpp} | 3 +- src/xtrace/{tls.c => tls.cpp} | 10 ++-- src/xtrace/tls.h | 4 +- src/xtrace/{xtracelib.c => xtracelib.cpp} | 60 +++++++++++-------- src/xtrace/xtracelib.h | 10 ++-- 16 files changed, 116 insertions(+), 77 deletions(-) rename src/xtrace/{lock.c => lock.cpp} (95%) rename src/xtrace/{malloc.c => malloc.cpp} (97%) rename src/xtrace/{mig_trace.c => mig_trace.cpp} (98%) rename src/xtrace/{posix_spawn_args.c => posix_spawn_args.cpp} (98%) rename src/xtrace/{tls.c => tls.cpp} (91%) rename src/xtrace/{xtracelib.c => xtracelib.cpp} (89%) diff --git a/src/xtrace/CMakeLists.txt b/src/xtrace/CMakeLists.txt index 257dbe180..a27a74aee 100644 --- a/src/xtrace/CMakeLists.txt +++ b/src/xtrace/CMakeLists.txt @@ -9,15 +9,15 @@ include_directories( ) set(xtrace_sources - xtracelib.c + xtracelib.cpp trampoline.S mach_trace.cpp bsd_trace.cpp - mig_trace.c - tls.c - malloc.c - lock.c - posix_spawn_args.c + mig_trace.cpp + tls.cpp + malloc.cpp + lock.cpp + posix_spawn_args.cpp ) if (TARGET_x86_64) diff --git a/src/xtrace/base.h b/src/xtrace/base.h index 0206569cb..f3b8d5c67 100644 --- a/src/xtrace/base.h +++ b/src/xtrace/base.h @@ -6,15 +6,16 @@ #define XTRACE_INLINE static __attribute__((always_inline)) #ifdef __cplusplus - #define XTRACE_DECLARATIONS_BEGIN extern "C" { + #define XTRACE_DECLARATIONS_C_BEGIN extern "C" { + #define XTRACE_CPP __cplusplus #else - #define XTRACE_DECLARATIONS_BEGIN + #define XTRACE_DECLARATIONS_C_BEGIN #endif #ifdef __cplusplus - #define XTRACE_DECLARATIONS_END } + #define XTRACE_DECLARATIONS_C_END } #else - #define XTRACE_DECLARATIONS_END + #define XTRACE_DECLARATIONS_C_END #endif #endif // _XTRACE_BASE_H_ diff --git a/src/xtrace/bsd_trace.h b/src/xtrace/bsd_trace.h index 660d038b3..95d9aff29 100644 --- a/src/xtrace/bsd_trace.h +++ b/src/xtrace/bsd_trace.h @@ -1,10 +1,12 @@ -#ifdef __cplusplus -extern "C" { -#endif +#ifndef XTRACE_BSD_TRACE +#define XTRACE_BSD_TRACE + +#include "base.h" + +XTRACE_DECLARATIONS_C_BEGIN extern void xtrace_print_string_literal(const char* str); -#ifdef __cplusplus -} -#endif +XTRACE_DECLARATIONS_C_END +#endif // XTRACE_BSD_TRACE diff --git a/src/xtrace/include/xtrace/xtrace-mig-types.h b/src/xtrace/include/xtrace/xtrace-mig-types.h index 3e4cfc534..c7126f684 100644 --- a/src/xtrace/include/xtrace/xtrace-mig-types.h +++ b/src/xtrace/include/xtrace/xtrace-mig-types.h @@ -1,5 +1,12 @@ +#ifndef XTRACE_XTRACE_MIG_TYPES +#define XTRACE_XTRACE_MIG_TYPES + #include +#include "../base.h" + +XTRACE_DECLARATIONS_C_BEGIN + struct xtrace_mig_callbacks { void (*add_raw_arg)(const char *format, ...) __attribute__((format(printf, 1, 2))); void (*add_num_arg)(unsigned long long n); @@ -35,3 +42,7 @@ struct xtrace_mig_subsystem { unsigned long routine_cnt; const struct xtrace_mig_routine_desc *routines; }; + +XTRACE_DECLARATIONS_C_END + +#endif // XTRACE_XTRACE_MIG_TYPES diff --git a/src/xtrace/lock.c b/src/xtrace/lock.cpp similarity index 95% rename from src/xtrace/lock.c rename to src/xtrace/lock.cpp index bbb0bd950..e184492ab 100644 --- a/src/xtrace/lock.c +++ b/src/xtrace/lock.cpp @@ -49,6 +49,7 @@ uint32_t cmpxchg_wrapper_u32(_Atomic uint32_t* atom, uint32_t expected, uint32_t return expected; }; +extern "C" void xtrace_lock_lock(xtrace_lock_t* _lock) { xtrace_lock_internal_t* lock = (xtrace_lock_internal_t*)_lock; @@ -70,7 +71,7 @@ void xtrace_lock_lock(xtrace_lock_t* _lock) { xtrace_lock_debug("going to wait"); // do the actual sleeping // we expect `xtrace_lock_state_locked_contended` because we don't want to sleep if it's not contended - __linux_futex_reterr(&lock->state, FUTEX_WAIT, xtrace_lock_state_locked_contended, NULL, 0, 0); + __linux_futex_reterr((int*)&lock->state, FUTEX_WAIT, xtrace_lock_state_locked_contended, nullptr, 0, 0); xtrace_lock_debug("awoken"); } @@ -83,6 +84,7 @@ void xtrace_lock_lock(xtrace_lock_t* _lock) { xtrace_lock_debug("lock acquired"); }; +extern "C" void xtrace_lock_unlock(xtrace_lock_t* _lock) { xtrace_lock_internal_t* lock = (xtrace_lock_internal_t*)_lock; @@ -95,7 +97,7 @@ void xtrace_lock_unlock(xtrace_lock_t* _lock) { // if it was previously contended, then we need to wake someone up if (prev == xtrace_lock_state_locked_contended) { xtrace_lock_debug("waking someone up"); - __linux_futex_reterr(&lock->state, FUTEX_WAKE, 1, NULL, 0, 0); + __linux_futex_reterr((int*)&lock->state, FUTEX_WAKE, 1, NULL, 0, 0); } }; @@ -123,6 +125,7 @@ enum xtrace_once_state { xtrace_once_state_completed = 3, }; +extern "C" void xtrace_once(xtrace_once_t* _once, xtrace_once_callback callback) { xtrace_once_internal_t* once = (xtrace_once_internal_t*)_once; @@ -152,7 +155,7 @@ void xtrace_once(xtrace_once_t* _once, xtrace_once_callback callback) { case xtrace_once_state_triggered_contended: { xtrace_once_debug("waking up all waiters..."); // otherwise, we have to wake someone up - __linux_futex_reterr(&once->state, FUTEX_WAKE, INT_MAX, NULL, 0, 0); + __linux_futex_reterr((int*)&once->state, FUTEX_WAKE, INT_MAX, NULL, 0, 0); } break; } @@ -184,7 +187,7 @@ void xtrace_once(xtrace_once_t* _once, xtrace_once_callback callback) { // somebody is already performing the callback and there are already waiters; // let's wait xtrace_once_debug("someone is already performing the callback with waiters; going to wait..."); - __linux_futex_reterr(&once->state, FUTEX_WAIT, prev, NULL, 0, 0); + __linux_futex_reterr((int*)&once->state, FUTEX_WAIT, prev, NULL, 0, 0); xtrace_once_debug("woken up"); diff --git a/src/xtrace/lock.h b/src/xtrace/lock.h index d9493d0a3..e69e1165b 100644 --- a/src/xtrace/lock.h +++ b/src/xtrace/lock.h @@ -9,7 +9,7 @@ // we also have to implement our own locks, because we can't rely on libplatform's or libpthread's locks // so we implement our own on top of Linux futexes -XTRACE_DECLARATIONS_BEGIN; +XTRACE_DECLARATIONS_C_BEGIN // // lock @@ -48,6 +48,6 @@ void xtrace_once_init(xtrace_once_t* once) { void xtrace_once(xtrace_once_t* once, xtrace_once_callback callback); -XTRACE_DECLARATIONS_END; +XTRACE_DECLARATIONS_C_END #endif // _XTRACE_LOCK_H_ diff --git a/src/xtrace/mach_trace.h b/src/xtrace/mach_trace.h index aa97fef72..ceda357f5 100644 --- a/src/xtrace/mach_trace.h +++ b/src/xtrace/mach_trace.h @@ -1,11 +1,13 @@ -#ifdef __cplusplus -extern "C" { -#endif +#ifndef XTRACE_MACH_TRACE +#define XTRACE_MACH_TRACE + +#include "base.h" + +XTRACE_DECLARATIONS_C_BEGIN const char* xtrace_msg_type_to_str(mach_msg_type_name_t type_name, int full); void xtrace_print_kern_return(kern_return_t kr); -#ifdef __cplusplus -} -#endif +XTRACE_DECLARATIONS_C_END +#endif // XTRACE_MACH_TRACE diff --git a/src/xtrace/malloc.c b/src/xtrace/malloc.cpp similarity index 97% rename from src/xtrace/malloc.c rename to src/xtrace/malloc.cpp index 0be4b5358..07f591351 100644 --- a/src/xtrace/malloc.c +++ b/src/xtrace/malloc.cpp @@ -186,7 +186,7 @@ static xtrace_memory_fragment_t allocate_fragment(size_t required_size) { if (viable_fragment == NULL) { // ...allocate some memory size_t allocation_size = round_up(required_size, BLOCK_SIZE_MULTIPLE); - xtrace_memory_block_t block = _mmap_for_xtrace(NULL, allocation_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + xtrace_memory_block_t block = (xtrace_memory_block_t)_mmap_for_xtrace(NULL, allocation_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); xtrace_malloc_debug("mmap for %llu bytes returned %p", allocation_size, block); @@ -414,6 +414,7 @@ static bool expand_fragment(xtrace_memory_fragment_t fragment, size_t new_size) // api functions // +extern "C" void* xtrace_malloc(size_t size) { if (size == 0) { return NULL; @@ -425,16 +426,18 @@ void* xtrace_malloc(size_t size) { return fragment->memory; }; +extern "C" void xtrace_free(void* pointer) { if (pointer == NULL) { return; } - xtrace_memory_fragment_t fragment = __container_of(pointer, struct xtrace_memory_fragment, memory); + xtrace_memory_fragment_t fragment = __container_of((const char (*)[])pointer, struct xtrace_memory_fragment, memory); release_fragment(fragment); }; +extern "C" void* xtrace_realloc(void* old_pointer, size_t new_size) { - xtrace_memory_fragment_t fragment = __container_of(old_pointer, struct xtrace_memory_fragment, memory); + xtrace_memory_fragment_t fragment = __container_of((const char (*)[])old_pointer, struct xtrace_memory_fragment, memory); size_t old_size = xtrace_memory_fragment_size(fragment); xtrace_lock_lock(&free_lock); diff --git a/src/xtrace/malloc.h b/src/xtrace/malloc.h index bb016fa50..5093b635b 100644 --- a/src/xtrace/malloc.h +++ b/src/xtrace/malloc.h @@ -4,12 +4,12 @@ #include #include "base.h" -XTRACE_DECLARATIONS_BEGIN; +XTRACE_DECLARATIONS_C_BEGIN void* xtrace_malloc(size_t size); void xtrace_free(void* pointer); void* xtrace_realloc(void* old_pointer, size_t new_size); -XTRACE_DECLARATIONS_END; +XTRACE_DECLARATIONS_C_END #endif // _XTRACE_MALLOC_H_ diff --git a/src/xtrace/mig_trace.c b/src/xtrace/mig_trace.cpp similarity index 98% rename from src/xtrace/mig_trace.c rename to src/xtrace/mig_trace.cpp index 2f126e9a5..1b23694b3 100644 --- a/src/xtrace/mig_trace.c +++ b/src/xtrace/mig_trace.cpp @@ -22,6 +22,7 @@ static struct xtrace_mig_subsystem** subsystems = NULL; static mach_port_name_t host_port; +extern "C" void xtrace_setup_mig_tracing(void) { // This runs before the syscall tracing is enabled, so we can @@ -37,7 +38,7 @@ void xtrace_setup_mig_tracing(void) } // Count the number of files, and allocate this many subsystem pointers; for (struct dirent* dirent; (dirent = readdir(xtrace_mig_dir)) != NULL; subsystems_cnt++); - subsystems = malloc(subsystems_cnt * sizeof(struct xtrace_mig_subsystem*)); + subsystems = (xtrace_mig_subsystem**)malloc(subsystems_cnt * sizeof(struct xtrace_mig_subsystem*)); rewinddir(xtrace_mig_dir); for (size_t i = 0; i < subsystems_cnt; i++) @@ -322,6 +323,7 @@ static int find_subsystem( return 0; } +extern "C" void xtrace_print_mig_message(const mach_msg_header_t* message, mach_port_name_t request_port) { if (message == NULL) diff --git a/src/xtrace/mig_trace.h b/src/xtrace/mig_trace.h index 76b8e644b..b560d83c9 100644 --- a/src/xtrace/mig_trace.h +++ b/src/xtrace/mig_trace.h @@ -1,12 +1,14 @@ +#ifndef XTRACE_MIG_TRACE +#define XTRACE_MIG_TRACE + #include +#include "base.h" -#ifdef __cplusplus -extern "C" { -#endif +XTRACE_DECLARATIONS_C_BEGIN void xtrace_setup_mig_tracing(void); void xtrace_print_mig_message(const mach_msg_header_t* message, mach_port_name_t request_port); -#ifdef __cplusplus -} -#endif +XTRACE_DECLARATIONS_C_END + +#endif // XTRACE_MIG_TRACE diff --git a/src/xtrace/posix_spawn_args.c b/src/xtrace/posix_spawn_args.cpp similarity index 98% rename from src/xtrace/posix_spawn_args.c rename to src/xtrace/posix_spawn_args.cpp index 8e8a4af66..3cc563d14 100644 --- a/src/xtrace/posix_spawn_args.c +++ b/src/xtrace/posix_spawn_args.cpp @@ -12,7 +12,7 @@ #include "xtracelib.h" -extern void print_open_flags(void* arg); +extern "C" void print_open_flags(void* arg); static struct { unsigned short flag; @@ -35,6 +35,7 @@ static struct { #undef POSIX_SPAWN_ATTR_ENTRY }; +extern "C" void print_arg_posix_spawn_args(void* arg) { const struct _posix_spawn_args_desc* args = (const struct _posix_spawn_args_desc*)(arg); bool is_first = true; diff --git a/src/xtrace/tls.c b/src/xtrace/tls.cpp similarity index 91% rename from src/xtrace/tls.c rename to src/xtrace/tls.cpp index 83d7327b2..9b5c9b69a 100644 --- a/src/xtrace/tls.c +++ b/src/xtrace/tls.cpp @@ -34,8 +34,9 @@ struct tls_table { // TODO: also perform TLS cleanup for other threads when doing a fork +extern "C" void xtrace_tls_thread_cleanup(void) { - tls_table_t table = _pthread_getspecific_direct(__PTK_XTRACE_TLS); + tls_table_t table = (tls_table_t)_pthread_getspecific_direct(__PTK_XTRACE_TLS); if (!table) { xtrace_tls_debug("no table to cleanup for this thread"); return; @@ -53,17 +54,18 @@ void xtrace_tls_thread_cleanup(void) { xtrace_free(table); }; +extern "C" void* xtrace_tls(void* key, size_t size, bool* created, xtrace_tls_destructor_f destructor) { xtrace_tls_debug("looking up tls variable for key %p", key); - tls_table_t table = _pthread_getspecific_direct(__PTK_XTRACE_TLS); + tls_table_t table = (tls_table_t)_pthread_getspecific_direct(__PTK_XTRACE_TLS); xtrace_tls_debug("got %p as table pointer from pthread", table); // if the table doesn't exist yet, create it if (table == NULL) { xtrace_tls_debug("table is NULL, creating now..."); - table = xtrace_malloc(sizeof(struct tls_table)); + table = (tls_table_t)xtrace_malloc(sizeof(struct tls_table)); if (table == NULL) { xtrace_abort("xtrace: failed TLS table memory allocation"); } @@ -90,7 +92,7 @@ void* xtrace_tls(void* key, size_t size, bool* created, xtrace_tls_destructor_f } table->table[index][0] = key; table->table[index][1] = xtrace_malloc(size); - table->table[index][2] = destructor; + table->table[index][2] = (void*)destructor; if (table->table[index][1] == NULL) { xtrace_abort("xtrace: failed TLS variable memory allocation"); } diff --git a/src/xtrace/tls.h b/src/xtrace/tls.h index 71d520d36..0a7fe128d 100644 --- a/src/xtrace/tls.h +++ b/src/xtrace/tls.h @@ -6,7 +6,7 @@ #include #include "base.h" -XTRACE_DECLARATIONS_BEGIN; +XTRACE_DECLARATIONS_C_BEGIN typedef void (*xtrace_tls_destructor_f)(void* value); @@ -47,6 +47,6 @@ typedef void (*xtrace_tls_destructor_f)(void* value); void* xtrace_tls(void* key, size_t size, bool* created, xtrace_tls_destructor_f destructor); void xtrace_tls_thread_cleanup(void); -XTRACE_DECLARATIONS_END; +XTRACE_DECLARATIONS_C_END #endif // _XTRACE_TLS_H_ diff --git a/src/xtrace/xtracelib.c b/src/xtrace/xtracelib.cpp similarity index 89% rename from src/xtrace/xtracelib.c rename to src/xtrace/xtracelib.cpp index 42dc4d513..cf446ce30 100644 --- a/src/xtrace/xtracelib.c +++ b/src/xtrace/xtracelib.cpp @@ -17,30 +17,30 @@ #include // Defined in assembly -extern void darling_mach_syscall_entry_trampoline(void); -extern void darling_mach_syscall_exit_trampoline(void); -extern void darling_bsd_syscall_entry_trampoline(void); -extern void darling_bsd_syscall_exit_trampoline(void); -extern int sys_thread_selfid(void); +extern "C" void darling_mach_syscall_entry_trampoline(void); +extern "C" void darling_mach_syscall_exit_trampoline(void); +extern "C" void darling_bsd_syscall_entry_trampoline(void); +extern "C" void darling_bsd_syscall_exit_trampoline(void); +extern "C" int sys_thread_selfid(void); static void xtrace_thread_exit_hook(void); static void xtrace_execve_inject_hook(const char*** envp_ptr); static void xtrace_postfork_child_hook(void); #ifdef __x86_64__ -struct hook -{ +struct hook { uint8_t movabs[2]; uint64_t addr; uint8_t call[3]; -} -__attribute__((packed)); +} __attribute__((packed)); #elif defined(__i386__) struct hook { uint8_t mov; uint32_t addr; uint8_t call[2]; } __attribute__((packed)); +#else +#error "Missing hook struct for arch" #endif // Defined in libsystem_kernel @@ -49,9 +49,9 @@ extern struct hook* _darling_mach_syscall_exit; extern struct hook* _darling_bsd_syscall_entry; extern struct hook* _darling_bsd_syscall_exit; -extern void _xtrace_thread_exit(void); -extern void _xtrace_execve_inject(const char*** envp_ptr); -extern void _xtrace_postfork_child(void); +extern "C" void _xtrace_thread_exit(void); +extern "C" void _xtrace_execve_inject(const char*** envp_ptr); +extern "C" void _xtrace_postfork_child(void); static void xtrace_setup_mach(void); static void xtrace_setup_bsd(void); @@ -66,6 +66,7 @@ static int xtrace_ignore = 1; #define SIGALTSTACK_GUARD 1 __attribute__((constructor)) +extern "C" void xtrace_setup() { xtrace_setup_options(); @@ -168,6 +169,8 @@ static void setup_hook(struct hook* hook, void* fnptr, bool jump) hook->addr = (uintptr_t)fnptr; hook->call[0] = 0xff; hook->call[1] = jump ? 0xe1 : 0xd1; +#else +#error "Missing hook implementation for arch #endif } @@ -184,8 +187,8 @@ static void xtrace_setup_mach(void) mprotect((void*) area, bytes, PROT_READ | PROT_WRITE | PROT_EXEC); - setup_hook(_darling_mach_syscall_entry, darling_mach_syscall_entry_trampoline, false); - setup_hook(_darling_mach_syscall_exit, darling_mach_syscall_exit_trampoline, false); + setup_hook(_darling_mach_syscall_entry, (void*)darling_mach_syscall_entry_trampoline, false); + setup_hook(_darling_mach_syscall_exit, (void*)darling_mach_syscall_exit_trampoline, false); mprotect((void*) area, bytes, PROT_READ | PROT_EXEC); } @@ -203,8 +206,8 @@ static void xtrace_setup_bsd(void) mprotect((void*) area, bytes, PROT_READ | PROT_WRITE | PROT_EXEC); - setup_hook(_darling_bsd_syscall_entry, darling_bsd_syscall_entry_trampoline, false); - setup_hook(_darling_bsd_syscall_exit, darling_bsd_syscall_exit_trampoline, false); + setup_hook(_darling_bsd_syscall_entry, (void*)darling_bsd_syscall_entry_trampoline, false); + setup_hook(_darling_bsd_syscall_exit, (void*)darling_bsd_syscall_exit_trampoline, false); mprotect((void*) area, bytes, PROT_READ | PROT_EXEC); } @@ -228,11 +231,12 @@ static void setup_hook_with_perms(struct hook* hook, void* fnptr, bool jump) { }; static void xtrace_setup_misc_hooks(void) { - setup_hook_with_perms((void*)&_xtrace_thread_exit, xtrace_thread_exit_hook, true); - setup_hook_with_perms((void*)&_xtrace_execve_inject, xtrace_execve_inject_hook, true); - setup_hook_with_perms((void*)&_xtrace_postfork_child, xtrace_postfork_child_hook, true); + setup_hook_with_perms((hook*)&_xtrace_thread_exit, (void*)xtrace_thread_exit_hook, true); + setup_hook_with_perms((hook*)&_xtrace_execve_inject, (void*)xtrace_execve_inject_hook, true); + setup_hook_with_perms((hook*)&_xtrace_postfork_child, (void*)xtrace_postfork_child_hook, true); }; +extern "C" void xtrace_set_gray_color(void) { if (xtrace_no_color) @@ -241,6 +245,7 @@ void xtrace_set_gray_color(void) xtrace_log("\033[37m"); } +extern "C" void xtrace_reset_color(void) { if (xtrace_no_color) @@ -249,6 +254,7 @@ void xtrace_reset_color(void) xtrace_log("\033[0m"); } +extern "C" void xtrace_start_line(int indent) { xtrace_set_gray_color(); @@ -289,6 +295,7 @@ struct nested_call_struct { DEFINE_XTRACE_TLS_VAR(struct nested_call_struct, nested_call, (struct nested_call_struct) {0}, NULL); +extern "C" void handle_generic_entry(const struct calldef* defs, const char* type, int nr, void* args[]) { if (xtrace_ignore) @@ -320,7 +327,7 @@ void handle_generic_entry(const struct calldef* defs, const char* type, int nr, get_ptr_nested_call()->previous_level = get_ptr_nested_call()->current_level++; } - +extern "C" void handle_generic_exit(const struct calldef* defs, const char* type, uintptr_t retval, int force_split) { if (xtrace_ignore) @@ -354,6 +361,7 @@ void handle_generic_exit(const struct calldef* defs, const char* type, uintptr_t xtrace_log("0x%lx\n", retval); } +extern "C" void xtrace_log(const char* format, ...) { va_list args; va_start(args, format); @@ -402,6 +410,7 @@ static void ensure_logfile(void) { set_xtrace_per_thread_logfile(fd); }; +extern "C" void xtrace_log_v(const char* format, va_list args) { if (xtrace_kprintf) { char real_format[512] = "xtrace: "; @@ -417,6 +426,7 @@ void xtrace_log_v(const char* format, va_list args) { } }; +extern "C" void xtrace_error(const char* format, ...) { va_list args; va_start(args, format); @@ -424,6 +434,7 @@ void xtrace_error(const char* format, ...) { va_end(args); }; +extern "C" void xtrace_error_v(const char* format, va_list args) { if (xtrace_kprintf) { char real_format[512] = "xtrace: "; @@ -439,6 +450,7 @@ void xtrace_error_v(const char* format, va_list args) { } }; +extern "C" void xtrace_abort(const char* message) { _abort_with_payload_for_xtrace(0, 0, NULL, 0, message, 0); __builtin_unreachable(); @@ -481,7 +493,7 @@ static const char** envp_find(const char** envp, const char* key) { static const char* envp_make_entry(const char* key, const char* value) { size_t key_length = strlen(key); size_t value_length = strlen(value); - char* entry = xtrace_malloc(key_length + value_length + 2); + char* entry = (char*)xtrace_malloc(key_length + value_length + 2); memcpy(entry, key, key_length); entry[key_length] = '='; memcpy(&entry[key_length + 1], value, value_length); @@ -493,7 +505,7 @@ static void envp_set(const char*** envp_ptr, const char* key, const char* value, const char** envp = *envp_ptr; if (!envp) { - *envp_ptr = envp = xtrace_malloc(sizeof(const char*) * 2); + *envp_ptr = envp = (const char**)xtrace_malloc(sizeof(const char*) * 2); envp[0] = envp_make_entry(key, value); envp[1] = NULL; *allocated = true; @@ -504,7 +516,7 @@ static void envp_set(const char*** envp_ptr, const char* key, const char* value, *entry_ptr = envp_make_entry(key, value); } else { size_t count = envp_count(envp); - const char** new_envp = xtrace_malloc(sizeof(const char*) * (count + 2)); + const char** new_envp = (const char**)xtrace_malloc(sizeof(const char*) * (count + 2)); memcpy(new_envp, envp, sizeof(const char*) * count); @@ -544,7 +556,7 @@ static void xtrace_execve_inject_hook(const char*** envp_ptr) { const char* insert_libraries = envp_get(*envp_ptr, "DYLD_INSERT_LIBRARIES"); size_t insert_libraries_length = insert_libraries ? strlen(insert_libraries) : 0; - char* new_value = xtrace_malloc(insert_libraries_length + (insert_libraries_length == 0 ? 0 : 1) + LIBRARY_PATH_LENGTH + 1); + char* new_value = (char*)xtrace_malloc(insert_libraries_length + (insert_libraries_length == 0 ? 0 : 1) + LIBRARY_PATH_LENGTH + 1); size_t offset = 0; if (insert_libraries && insert_libraries_length > 0) { diff --git a/src/xtrace/xtracelib.h b/src/xtrace/xtracelib.h index 1ac591428..c28e88e41 100644 --- a/src/xtrace/xtracelib.h +++ b/src/xtrace/xtracelib.h @@ -3,6 +3,8 @@ #include #include +#include "base.h" + struct calldef { const char* name; @@ -10,9 +12,7 @@ struct calldef void (*print_retval)(int nr, uintptr_t rv); }; -#ifdef __cplusplus -extern "C" { -#endif +XTRACE_DECLARATIONS_C_BEGIN void handle_generic_entry(const struct calldef* defs, const char* type, int nr, void* args[]); void handle_generic_exit(const struct calldef* defs, const char* type, uintptr_t retval, int force_split); @@ -30,9 +30,7 @@ void xtrace_error_v(const char* format, va_list args) __attribute__((format(prin void xtrace_abort(const char* message) __attribute__((noreturn)); -#ifdef __cplusplus -} -#endif +XTRACE_DECLARATIONS_C_END #endif