meganz / MEGAsync

Easy automated syncing between your computers and your MEGA Cloud Drive
Other
1.58k stars 279 forks source link

Update Google Breakpad #801

Open koxu1996 opened 1 year ago

koxu1996 commented 1 year ago

This PR updates Google Breakpad to the latest version.

It should close ARM related issues: https://github.com/meganz/MEGAsync/issues/303, https://github.com/meganz/MEGAsync/issues/310, https://github.com/meganz/MEGAsync/issues/456.


You can reproduce all changes with the following steps:

1. Prepare breakpad

$ git clone https://github.com/google/breakpad.git /tmp/breakpad
$ cd /tmp/breakpad
$ git checkout 3ea3af4

2. Prepare lss

$ git clone https://chromium.googlesource.com/linux-syscall-support /tmp/lss
$ cd /tmp/lss
$ git checkout 9719c1e

3. Clone MEGAsync repository

$ git clone --recursive https://github.com/meganz/MEGAsync.git /tmp/megasync
$ cd /tmp/megasync
$ git checkout c422ca2

4. Update breakpad files - https://github.com/meganz/MEGAsync/pull/801/commits/2751244095bc78697b0a29a79233d64a17bedc10

$ rm -r ./src/MEGASync/google_breakpad/client
$ cp -r /tmp/breakpad/src/client ./src/MEGASync/google_breakpad/client

$ rm -r ./src/MEGASync/google_breakpad/common
$ cp -r /tmp/breakpad/src/common ./src/MEGASync/google_breakpad/common

$ rm -r ./src/MEGASync/google_breakpad/google_breakpad
$ cp -r /tmp/breakpad/src/google_breakpad ./src/MEGASync/google_breakpad/google_breakpad

$ rm ./src/MEGASync/google_breakpad/third_party/lss/linux_syscall_support.h
$ cp /tmp/lss/linux_syscall_support.h ./src/MEGASync/google_breakpad/third_party/lss/linux_syscall_support.h

$ sed -ie "s/convert_UTF.c/convert_UTF.cc/g" ./src/MEGASync/google_breakpad/google_breakpad.pri

$ git add . && git commit -m "Update google breakpad to 3ea3af4"

5. Apply workaround for inttypes.h has already been included before this header file, but without __STDC_FORMAT_MACROS defined error - https://github.com/meganz/MEGAsync/pull/801/commits/fbbe423e8fd68c544f4da04544098a23761770bd

$ sed -i '44s|^|//|' ./src/MEGASync/google_breakpad/google_breakpad/common/breakpad_types.h
$ sed -i '45s|^|//|' ./src/MEGASync/google_breakpad/google_breakpad/common/breakpad_types.h

$ git add . && git commit -m "Workaround for inttypes.h error"

I am not sure about this step, maybe __STDC_FORMAT_MACROS should be defined somewhere in megasync SDK :thinking:

koxu1996 commented 1 year ago

I was getting unresolved reference error:

/usr/bin/ld: minidump_writer.o: in function `(anonymous namespace)::MinidumpWriter::FillRawModule(google_breakpad::MappingInfo const&, bool, unsigned int, MDRawModule*, unsigned char const*)':
/tmp/MEGAsync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:651: undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(char const*, google_breakpad::_RSDS_DEBUG_FORMAT*)'

It was just matter of inculding new pe_file.cc in qmake - https://github.com/meganz/MEGAsync/pull/801/commits/588101ded286aea0b1ff39053ae969663f0fda71:

--- a/src/MEGASync/google_breakpad/google_breakpad.pri
+++ b/src/MEGASync/google_breakpad/google_breakpad.pri
@@ -31,6 +31,7 @@ unix:!macx {
   SOURCES += $$PWD/client/linux/handler/exception_handler.cc
   SOURCES += $$PWD/client/linux/handler/minidump_descriptor.cc
   SOURCES += $$PWD/client/linux/minidump_writer/minidump_writer.cc
+  SOURCES += $$PWD/client/linux/minidump_writer/pe_file.cc
   SOURCES += $$PWD/client/linux/minidump_writer/linux_dumper.cc
   SOURCES += $$PWD/client/linux/minidump_writer/linux_ptrace_dumper.cc
   SOURCES += $$PWD/client/linux/log/log.cc

Note, I also had some issues with freeimage library and its neon optimizations. I found out they should be disabled for ARM, however it seems to be already done in mega's SDK:

    # freeimage's LibPNG has a problem with deciding to use neon on 64 bit arm, resulting in a missing symbol
    if [ "$ARCH" == "aarch64" -o "$ARCH" == "arm64" ]; then
        export CFLAGS="$CFLAGS -DPNG_ARM_NEON_OPT=0"
    fi 

With that I was able to build everything:

$ cd /tmp/megasync/src/
$ ./configure -g -q -i
$ qmake MEGASync/MEGASync.pro
$ lrelease MEGASync/MEGASync.pro
$ make
koxu1996 commented 1 year ago

It works on Asahi Linux with M2 :heart:

image

I am sharing compiled binary with you: megasync_v4.9.3_aarch64, virus total scan here.

farid220 commented 9 months ago

Hi Thanks for your concern about fixing this problem. I'm using aarch64 and I want to compile it. I encounterd the breakpad issue and I tried your solotuion step by step. But now I get the following error while compiling.

I'd appreciate it if you could take a look and help.

root@Falkenstein:/tmp/megasync/src# make Makefile:4343: warning: overriding recipe for target 'qrc_Resources_linux.cpp' Makefile:3010: warning: ignoring old recipe for target 'qrc_Resources_linux.cpp' Makefile:5676: warning: overriding recipe for target 'qrc_Resources_linux.cpp' Makefile:4343: warning: ignoring old recipe for target 'qrc_Resources_linux.cpp' Makefile:7009: warning: overriding recipe for target 'qrc_Resources_linux.cpp' Makefile:5676: warning: ignoring old recipe for target 'qrc_Resources_linux.cpp' g++ -Wl,-O1 -Wl,-rpath-link,/usr/lib/aarch64-linux-gnu -o megasync SettingsDialog.o BalloonToolTip.o BlurredShadowEffect.o ButtonIconManager.o LowDiskSpaceDialog.o DateTimeFormatter.o EventHelper.o InfoDialog.o MegaDelegateHoverManager.o NotificationsSettings.o OverQuotaDialog.o ScanningWidget.o QtPositioningBugFixer.o PasswordLineEdit.o SetupWizard.o UploadToMegaDialog.o PasteMegaLinksDialog.o ImportMegaLinksDialog.o ImportListWidgetItem.o CrashReportDialog.o MultiQFileDialog.o MegaProxyStyle.o AccountDetailsDialog.o DownloadFromMegaDialog.o ChangeLogDialog.o GuestWidget.o StreamingFromMegaDialog.o MegaProgressCustomDialog.o UpgradeDialog.o PlanWidget.o InfoWizard.o QMegaMessageBox.o AvatarWidget.o MenuItemAction.o AddExclusionDialog.o StatusInfo.o ChangePassword.o PSAwidget.o ElidedLabel.o UpgradeOverStorage.o Login2FA.o QRWidget.o CircularUsageProgressBar.o HighDpiResize.o AlertItem.o QAlertsModel.o MegaAlertDelegate.o QFilterAlertsModel.o FilterAlertWidget.o AlertFilterType.o BugReportDialog.o VerifyLockMessage.o MegaInfoMessage.o WaitingSpinnerWidget.o ProxySettings.o BandwidthSettings.o SwitchButton.o GuiUtilities.o CancelConfirmWidget.o NodeNameSetterDialog.o NewFolderDialog.o RenameNodeDialog.o NodeSelectorDelegates.o NodeSelectorProxyModel.o NodeSelectorModel.o NodeSelectorModelSpecialised.o NodeSelectorModelItem.o NodeSelectorTreeView.o NodeSelectorTreeViewWidget.o NodeSelectorTreeViewWidgetSpecializations.o NodeSelector.o NodeSelectorLoadingDelegate.o SearchLineEdit.o NodeSelectorSpecializations.o LockedPopOver.o PermissionsDialog.o PermissionsWidget.o attrmap.o backofftimer.o base64.o command.o commands.o db.o gfx.o file.o fileattributefetch.o filefingerprint.o filesystem.o http.o json.o megaclient.o node.o pubkeyaction.o request.o serialize64.o nodemanager.o setandelement.o share.o sharenodekeys.o sync.o transfer.o transferslot.o treeproc.o user.o useralerts.o utils.o logging.o waiterbase.o proxy.o pendingcontactrequest.o textchat.o cryptopp.o sodium.o sqlite.o external.o mega_utf8proc.o mega_ccronexpr.o mega_evt_tls.o mega_zxcvbn.o mediafileattribute.o raid.o testhooks.o heartbeats.o megaapi.o megaapi_impl.o QTMegaRequestListener.o QTMegaTransferListener.o QTMegaGlobalListener.o QTMegaListener.o QTMegaEvent.o mega_http_parser.o net.o fs.o waiter.o posixthread.o freeimage.o drivenotify.o drivenotifyposix.o HTTPServer.o DialogOpener.o DownloadQueueController.o Preferences.o LinkProcessor.o MegaUploader.o TransferRemainingTime.o UpdateTask.o EncryptedSettings.o CrashHandler.o ExportProcessor.o UserAttributesManager.o Utilities.o ThreadPool.o MegaDownloader.o MegaSyncLogger.o ConnectivityChecker.o TransferBatch.o TextDecorator.o qrcodegen.o TransfersModel.o DuplicatedNodeDialog.o DuplicatedNodeInfo.o DuplicatedNodeItem.o DuplicatedUploadChecker.o InfoDialogTransferLoadingItem.o InfoDialogTransfersProxyModel.o TransfersManagerSortFilterProxyModel.o TransferMetaData.o InfoDialogTransferDelegateWidget.o InfoDialogTransfersWidget.o MegaTransferDelegate.o MegaTransferView.o TransferBaseDelegateWidget.o TransferItem.o TransferManager.o TransferManagerDelegateWidget.o TransferManagerLoadingItem.o TransfersStatusWidget.o TransfersSummaryWidget.o TransferScanCancelUi.o TransferWidgetHeaderItem.o TransfersWidget.o DesktopNotifications.o TransferNotificationBuilder.o NotificatorBase.o NotificationDelayer.o Notificator.o AddBackupDialog.o BackupNameConflictDialog.o BackupRenameWidget.o BackupTableView.o BackupTableViewTooltips.o BackupsWizard.o RemoveBackupDialog.o SyncTooltipCreator.o SyncsMenu.o BindFolderDialog.o FolderBinder.o SyncTableView.o SyncTableViewTooltips.o BackupItemModel.o SyncItemModel.o SyncInfo.o SyncController.o SyncSettings.o AbstractPlatform.o Platform.o ShellNotifier.o PlatformImplementation.o ExtServer.o NotifyServer.o PowerOptions.o PlatformStrings.o crash_generation_client.o exception_handler.o minidump_descriptor.o minidump_writer.o pe_file.o linux_dumper.o linux_ptrace_dumper.o log.o minidump_file_writer.o linux_libc_support.o file_id.o memory_mapped_file.o safe_readlink.o guid_creator.o elfutils.o string_conversion.o convert_UTF.o qtlockedfile.o qtlockedfile_unix.o main.o MegaApplication.o TransferQuota.o UserAlertTimedClustering.o ScaleFactorManager.o CommonMessages.o ScanStageController.o EventUpdater.o FolderTransferListener.o BlockingStageProgressController.o Avatar.o CameraUploadFolder.o DeviceName.o FullName.o MyBackupsHandle.o MyChatFilesFolder.o qrc_Resources_linux.o moc_SettingsDialog.o moc_AutoResizeStackedWidget.o moc_BalloonToolTip.o moc_ButtonIconManager.o moc_DateTimeFormatter.o moc_LowDiskSpaceDialog.o moc_EventHelper.o moc_InfoDialog.o moc_MegaDelegateHoverManager.o moc_MegaNodeNames.o moc_NotificationsSettings.o moc_OverQuotaDialog.o moc_ScanningWidget.o moc_QtPositioningBugFixer.o moc_PasswordLineEdit.o moc_SetupWizard.o moc_UploadToMegaDialog.o moc_PasteMegaLinksDialog.o moc_ImportMegaLinksDialog.o moc_ImportListWidgetItem.o moc_CrashReportDialog.o moc_MultiQFileDialog.o moc_MegaProxyStyle.o moc_AccountDetailsDialog.o moc_DownloadFromMegaDialog.o moc_ChangeLogDialog.o moc_GuestWidget.o moc_StreamingFromMegaDialog.o moc_MegaProgressCustomDialog.o moc_UpgradeDialog.o moc_PlanWidget.o moc_InfoWizard.o moc_AvatarWidget.o moc_AddExclusionDialog.o moc_StatusInfo.o moc_PSAwidget.o moc_ElidedLabel.o moc_UpgradeOverStorage.o moc_ChangePassword.o moc_Login2FA.o moc_QRWidget.o moc_CircularUsageProgressBar.o moc_HighDpiResize.o moc_AlertItem.o moc_QAlertsModel.o moc_MegaAlertDelegate.o moc_QFilterAlertsModel.o moc_FilterAlertWidget.o moc_AlertFilterType.o moc_BugReportDialog.o moc_VerifyLockMessage.o moc_ViewLoadingScene.o moc_MegaInfoMessage.o moc_WaitingSpinnerWidget.o moc_ProxySettings.o moc_BandwidthSettings.o moc_SwitchButton.o moc_CancelConfirmWidget.o moc_NodeNameSetterDialog.o moc_NewFolderDialog.o moc_RenameNodeDialog.o moc_NodeSelectorProxyModel.o moc_NodeSelectorModel.o moc_NodeSelectorModelSpecialised.o moc_NodeSelectorModelItem.o moc_NodeSelectorTreeView.o moc_NodeSelectorTreeViewWidget.o moc_NodeSelectorTreeViewWidgetSpecializations.o moc_NodeSelector.o moc_NodeSelectorLoadingDelegate.o moc_SearchLineEdit.o moc_NodeSelectorSpecializations.o moc_LockedPopOver.o moc_PermissionsDialog.o moc_PermissionsWidget.o moc_QTMegaRequestListener.o moc_QTMegaTransferListener.o moc_QTMegaGlobalListener.o moc_QTMegaListener.o moc_HTTPServer.o moc_DownloadQueueController.o moc_Preferences.o moc_LinkProcessor.o moc_MegaUploader.o moc_UpdateTask.o moc_EncryptedSettings.o moc_CrashHandler.o moc_ExportProcessor.o moc_UserAttributesManager.o moc_Utilities.o moc_MegaDownloader.o moc_MegaSyncLogger.o moc_ConnectivityChecker.o moc_TextDecorator.o moc_InfoDialogTransfersProxyModel.o moc_DuplicatedNodeDialog.o moc_DuplicatedNodeInfo.o moc_DuplicatedNodeItem.o moc_DuplicatedUploadChecker.o moc_InfoDialogTransferLoadingItem.o moc_TransfersManagerSortFilterProxyModel.o moc_TransfersSortFilterProxyBaseModel.o moc_TransfersModel.o moc_InfoDialogTransferDelegateWidget.o moc_InfoDialogTransfersWidget.o moc_MegaTransferDelegate.o moc_MegaTransferView.o moc_TransferBaseDelegateWidget.o moc_TransferManager.o moc_TransferManagerDelegateWidget.o moc_TransferManagerLoadingItem.o moc_TransfersStatusWidget.o moc_TransfersSummaryWidget.o moc_TransferScanCancelUi.o moc_TransferWidgetHeaderItem.o moc_TransfersWidget.o moc_DesktopNotifications.o moc_TransferNotificationBuilder.o moc_NotificatorBase.o moc_NotificationDelayer.o moc_Notificator.o moc_AddBackupDialog.o moc_BackupNameConflictDialog.o moc_BackupRenameWidget.o moc_BackupTableView.o moc_BackupTableViewTooltips.o moc_BackupsWizard.o moc_RemoveBackupDialog.o moc_SyncsMenu.o moc_BindFolderDialog.o moc_FolderBinder.o moc_SyncTableView.o moc_SyncTableViewTooltips.o moc_BackupItemModel.o moc_SyncItemModel.o moc_SyncController.o moc_SyncInfo.o moc_ShellNotifier.o moc_PlatformStrings.o moc_ExtServer.o moc_NotifyServer.o moc_MegaApplication.o moc_TransferQuota.o moc_UserAlertTimedClustering.o moc_ScanStageController.o moc_FolderTransferListener.o moc_BlockingStageProgressController.o moc_Avatar.o moc_CameraUploadFolder.o moc_DeviceName.o moc_FullName.o moc_MyBackupsHandle.o moc_MyChatFilesFolder.o -lstdc++fs /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libuv.a -lmediainfo -lzen -lraw -fopenmp -lavcodec -lavformat -lavutil -lswscale -lswresample /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libfreeimage.a -licuuc -licudata -lsqlite3 -lrt /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libcurl.a /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libz.a /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libcryptopp.a -lcares /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libsodium.a -ludev -lssl -lcrypto -ldl -lxcb /usr/lib/aarch64-linux-gnu/libQt5Svg.so /usr/lib/aarch64-linux-gnu/libQt5Widgets.so /usr/lib/aarch64-linux-gnu/libQt5X11Extras.so /usr/lib/aarch64-linux-gnu/libQt5Gui.so /usr/lib/aarch64-linux-gnu/libQt5Network.so /usr/lib/aarch64-linux-gnu/libQt5DBus.so /usr/lib/aarch64-linux-gnu/libQt5Core.so -lGL -lpthread /usr/bin/ld: /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libfreeimage.a(strenc.o): in functionStrIOEncInit': strenc.c:(.text+0x13a8): warning: the use of tmpnam' is dangerous, better usemkstemp' /usr/bin/ld: exception_handler.o: in function google_breakpad::ExceptionHandler::SimulateSignalDelivery(int)': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/handler/exception_handler.cc:493: undefined reference tobreakpad_getcontext' /usr/bin/ld: exception_handler.o: in function google_breakpad::ExceptionHandler::DoDump(int, void const*, unsigned long)': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/handler/exception_handler.cc:609: undefined reference togoogle_breakpad::WriteMicrodump(int, void const, unsigned long, std::__cxx11::list<google_breakpad::MappingEntry, std::allocator > const&, bool, unsigned long, bool, google_breakpad::MicrodumpExtraInfo const&)' /usr/bin/ld: exception_handler.o: in function google_breakpad::ExceptionHandler::WriteMinidump()': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/handler/exception_handler.cc:678: undefined reference tobreakpad_getcontext' /usr/bin/ld: minidump_writer.o: in function (anonymous namespace)::MinidumpWriter::Init()': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:204: undefined reference togoogle_breakpad::UContextReader::GetStackPointer(ucontext_t const)' /usr/bin/ld: minidump_writer.o: in function CrashingThreadReferencesPrincipalMapping': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:205: undefined reference togoogle_breakpad::UContextReader::GetInstructionPointer(ucontext_t const)' /usr/bin/ld: minidump_writer.o: in function `(anonymous namespace)::MinidumpWriter::WriteThreadListStream(MDRawDirectory)': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:495: undefined reference to google_breakpad::ThreadInfo::GetInstructionPointer() const' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:504: undefined reference togoogle_breakpad::ThreadInfo::FillCPUContext(MDRawContextARM64_Old) const' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:512: undefined reference to google_breakpad::ThreadInfo::GetInstructionPointer() const' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:426: undefined reference togoogle_breakpad::UContextReader::GetStackPointer(ucontext_t const)' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:427: undefined reference to google_breakpad::UContextReader::GetInstructionPointer(ucontext_t const*)' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:434: undefined reference togoogle_breakpad::UContextReader::GetInstructionPointer(ucontext_t const)' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/minidump_writer.cc:480: undefined reference to `google_breakpad::UContextReader::FillCPUContext(MDRawContextARM64_Old, ucontext_t const, fpsimd_context const)' /usr/bin/ld: linux_ptrace_dumper.o: in function google_breakpad::LinuxPtraceDumper::ReadRegisterSet(google_breakpad::ThreadInfo*, int)': /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc:159: undefined reference togoogle_breakpad::ThreadInfo::GetGeneralPurposeRegisters(void*, unsigned long)' /usr/bin/ld: /tmp/megasync/src/MEGASync/google_breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc:164: undefined reference to google_breakpad::ThreadInfo::GetFloatingPointRegisters(void**, unsigned long*)' /usr/bin/ld: /tmp/megasync/src/MEGASync/mega/bindings/qt/../..//bindings/qt/3rdparty/libs/libfreeimage.a(pngrutil.o): in functionpng_read_filter_row': pngrutil.c:(.text+0x69c4): undefined reference to png_init_filter_functions_neon' collect2: error: ld returned 1 exit status make: *** [Makefile:1446: megasync] Error 1

ArchitektApx commented 1 month ago

Despite following the provided steps I was not able to build on a up to date install of asahi linux due to the breakpad issue. This alternative removes the crashhandler to allow working builds and runs great on asahi: https://github.com/zarandya/megasync-nocrashhandler

Screenshot from 2024-05-18 11-41-12

archisman-panigrahi commented 3 days ago

@koxu1996 Any updates on this?