Integrating Crashpad with MacOS Qt application

526 views Asked by At

Our Qt application is built using qmake. We've built Crashpad from this commit which is currently the tip of master. We've linked our Qt application with libclient.a, libbase.a, libhandler.a, libutil.a, Security.Framework and AppKit.Framework and have added the relevant include directories. When we build our application we get the following errors from the linker:

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -stdlib=libc++ -headerpad_max_install_names  -arch x86_64 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -mmacosx-version-min=10.13 -Wl,-rpath,@executable_path/../Frameworks -Wl,-rpath,/Users/bobby/Qt/5.14.2/clang_64/lib -o myQtCrasher.app/Contents/MacOS/myQtCrasher main.o mainwindow.o qrc_myQtCrasher.o moc_mainwindow.o   -F/Users/bobby/Qt/5.14.2/clang_64/lib -framework Security -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/client/ -lclient -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/handler/ -lhandler -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/minidump/ -lformat -lminidump -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/snapshot/ -lcontext -lsnapshot -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/third_party/mini_chromium/mini_chromium/base/ -lbase -L/Users/bobby/Documents/Qt/myQtCrasher/../../../Desktop/bugsplat/crashpad/crashpad/out/Default/obj/util/ -lutil -framework QtWidgets -framework QtGui -framework AppKit -framework Metal -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL   
Undefined symbols for architecture x86_64:
  "___MIG_check__Request__child_port_check_in_t", referenced from:
      crashpad::ChildPortServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.child_port_server.o)
  "___MIG_check__Request__mach_notify_dead_name_t", referenced from:
      crashpad::NotifyServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.notify_server.o)
  "___MIG_check__Request__mach_notify_no_senders_t", referenced from:
      crashpad::NotifyServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.notify_server.o)
  "___MIG_check__Request__mach_notify_port_deleted_t", referenced from:
      crashpad::NotifyServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.notify_server.o)
  "___MIG_check__Request__mach_notify_port_destroyed_t", referenced from:
      crashpad::NotifyServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.notify_server.o)
  "___MIG_check__Request__mach_notify_send_once_t", referenced from:
      crashpad::NotifyServer::MachMessageServerFunction(mach_msg_header_t const*, mach_msg_header_t*, bool*) in libutil.a(util.notify_server.o)
  "_audit_token_to_pid", referenced from:
      crashpad::AuditPIDFromMachMessageTrailer(mach_msg_trailer_t const*) in libutil.a(util.mach_message.o)
  "_child_port_check_in", referenced from:
      crashpad::ChildPortHandshake::RunClientInternal_SendCheckIn(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long long, unsigned int, unsigned int) in libutil.a(util.child_port_handshake.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [myQtCrasher.app/Contents/MacOS/myQtCrasher] Error 1
11:18:12: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project myQtCrasher (kit: Desktop Qt 5.14.2 clang 64bit)
When executing step "Make"
11:18:12: Elapsed time: 00:02.

When we investigated child_port_server.o (using nm) we found that the symbol ___MIG_check__Request__child_port_check_in_t was undefined. This lead us back to out/Default/gen/util/mach/child_port_server.c where we found the following:

#if !defined(__MigTypeCheck) && defined(TypeCheck)
#define __MigTypeCheck      TypeCheck   /* Legacy setting */
#endif  /* !defined(__MigTypeCheck) */

...

#if ( __MigTypeCheck )
#if __MIG_check__Request__child_port_subsystem__
#if !defined(__MIG_check__Request__child_port_check_in_t__defined)
#define __MIG_check__Request__child_port_check_in_t__defined

mig_external kern_return_t __MIG_check__Request__child_port_check_in_t(__attribute__((__unused__)) __Request__child_port_check_in_t *In0P)
{

    typedef __Request__child_port_check_in_t __Request;
#if __MigTypeCheck
    if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
        (In0P->msgh_body.msgh_descriptor_count != 1) ||
        (In0P->Head.msgh_size != (mach_msg_size_t)sizeof(__Request)))
        return MIG_BAD_ARGUMENTS;
#endif  /* __MigTypeCheck */

#if __MigTypeCheck
    if (In0P->port.type != MACH_MSG_PORT_DESCRIPTOR)
        return MIG_TYPE_ERROR;
#endif  /* __MigTypeCheck */

    return MACH_MSG_SUCCESS;
}
#endif /* !defined(__MIG_check__Request__child_port_check_in_t__defined) */
#endif /* __MIG_check__Request__child_port_subsystem__ */
#endif /* ( __MigTypeCheck ) */

With limited knowledge of the gen and ninja we attempted to pass the -DTypeCheck flag by modifying util.ninja but this broke compilation. We're stuck and we would appreciate any help the community is willing to provide!

How do we fix the remainder of our linker errors?

1

There are 1 answers

1
bobbyg603 On BEST ANSWER

We were able to solve this thanks to a response to our post in Crashpad-dev

Add libbsm to your .pro file

macx: LIBS += -lbsm

Add all the .o files in out/Default/obj/out/Default/gen/util/mach to your .pro file

macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.child_portServer.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.child_portUser.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.excServer.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.excUser.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.mach_excServer.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.mach_excUser.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.notifyServer.o
macx: LIBS += /path/to/crashpad/crashpad/out/Default/obj/out/Default/gen/util/mach/mig_output.notifyUser.o