From ad4e30fe5f267faecfaa8018d46795fd87876a8f Mon Sep 17 00:00:00 2001 From: Ariel Abreu Date: Sat, 29 Apr 2023 10:26:31 -0400 Subject: [PATCH] Add coresymbolicationd stub service This service is used by Xcode when it crashes to help symbolicate the stack trace. However, stubbing it to return empty dictionary replies seems to be enough to get by. --- .../CoreSymbolication/CMakeLists.txt | 20 ++++- .../com.apple.coresymbolicationd.plist | 15 ++++ .../CoreSymbolication/src/daemon.c | 87 +++++++++++++++++++ 3 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 src/private-frameworks/CoreSymbolication/resources/com.apple.coresymbolicationd.plist create mode 100644 src/private-frameworks/CoreSymbolication/src/daemon.c diff --git a/src/private-frameworks/CoreSymbolication/CMakeLists.txt b/src/private-frameworks/CoreSymbolication/CMakeLists.txt index 09fddbc45..b0a468baa 100644 --- a/src/private-frameworks/CoreSymbolication/CMakeLists.txt +++ b/src/private-frameworks/CoreSymbolication/CMakeLists.txt @@ -7,8 +7,6 @@ remove_sdk_framework(CoreSymbolication set(DYLIB_COMPAT_VERSION "1.0.0") set(DYLIB_CURRENT_VERSION "62046.0.0") -file(GLOB CS_C src/*.c) - set(FRAMEWORK_VERSION "A") generate_sdk_framework(CoreSymbolication @@ -24,8 +22,24 @@ add_framework(CoreSymbolication VERSION ${FRAMEWORK_VERSION} SOURCES - ${CS_C} + src/functions.c DEPENDENCIES system ) + +add_darling_executable(coresymbolicationd src/daemon.c) + +install( + TARGETS + coresymbolicationd + DESTINATION + libexec/darling/usr/libexec +) + +install( + FILES + resources/com.apple.coresymbolicationd.plist + DESTINATION + libexec/darling/System/Library/LaunchDaemons +) diff --git a/src/private-frameworks/CoreSymbolication/resources/com.apple.coresymbolicationd.plist b/src/private-frameworks/CoreSymbolication/resources/com.apple.coresymbolicationd.plist new file mode 100644 index 000000000..14358ee6a --- /dev/null +++ b/src/private-frameworks/CoreSymbolication/resources/com.apple.coresymbolicationd.plist @@ -0,0 +1,15 @@ + + + + + Label + com.apple.coresymbolicationd + Program + /usr/libexec/coresymbolicationd + MachServices + + com.apple.coresymbolicationd + + + + diff --git a/src/private-frameworks/CoreSymbolication/src/daemon.c b/src/private-frameworks/CoreSymbolication/src/daemon.c new file mode 100644 index 000000000..13703e029 --- /dev/null +++ b/src/private-frameworks/CoreSymbolication/src/daemon.c @@ -0,0 +1,87 @@ +/** + * This file is part of Darling. + * + * Copyright (C) 2023 Darling developers + * + * Darling is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Darling is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Darling. If not, see . + */ + +#include +#include +#include +#include + +#define SERVICE_NAME "com.apple.coresymbolicationd" + +#ifndef ENABLE_LOG + #define ENABLE_LOG 0 +#endif + +#if ENABLE_LOG + #define server_log(format, ...) do { printf("server connection: " format "\n", ## __VA_ARGS__); fflush(stdout); } while (0) + #define server_error(format, ...) do { fprintf(stderr, "server connection: " format "\n", ## __VA_ARGS__); fflush(stderr); } while (0) +#else + #define server_log(format, ...) + #define server_error(format, ...) +#endif + +static void connection_handler(xpc_connection_t connection) { + server_log("Got a new connection: %p\n", connection); + + xpc_connection_set_event_handler(connection, ^(xpc_object_t object) { + char* desc = xpc_copy_description(object); + xpc_type_t type = xpc_get_type(object); + server_log("Received %s from connection %p: %s\n", (type == (xpc_type_t)XPC_TYPE_DICTIONARY) ? "message" : ((type == (xpc_type_t)XPC_TYPE_ERROR) ? "error" : "unexpected object"), connection, desc); + free(desc); + + // stub reply + xpc_object_t reply = xpc_dictionary_create_reply(object); + xpc_connection_send_message(connection, reply); + }); + xpc_connection_resume(connection); +}; + +static void handle_server_error(xpc_object_t error) { + if (error == XPC_ERROR_CONNECTION_INVALID) { + server_log("server died (or got cancelled)\n"); + } else if (error == XPC_ERROR_TERMINATION_IMMINENT) { + server_log("someone wants to kill us\n"); + } else { + server_error("received unexpected error: %s\n", xpc_copy_description(error)); + exit(1); + } +}; + +int main(int arc, char** argv) { + xpc_connection_t server = NULL; + + server = xpc_connection_create_mach_service(SERVICE_NAME, NULL, XPC_CONNECTION_MACH_SERVICE_LISTENER); + + xpc_connection_set_event_handler(server, ^(xpc_object_t object) { + xpc_type_t obj_type = xpc_get_type(object); + if (obj_type == (xpc_type_t)XPC_TYPE_CONNECTION) { + connection_handler(object); + } else if (obj_type == (xpc_type_t)XPC_TYPE_ERROR) { + handle_server_error(object); + } else { + server_error("received non-connection, non-error object in event handler: %s\n", xpc_copy_description(object)); + exit(1); + } + }); + + xpc_connection_resume(server); + + dispatch_main(); + return 0; +}; -- 2.51.2