diff --git a/common/trace/BUILD.gn b/common/trace/BUILD.gn index 266e043aebdbe40b95ba493306cdefa95200f1a2..3b1ac29736857e07721d3a0777c71f9e7b8198a0 100644 --- a/common/trace/BUILD.gn +++ b/common/trace/BUILD.gn @@ -31,48 +31,116 @@ if (defined(ohos_lite)) { visibility = [ "*:*" ] include_dirs = [ "include" ] } - ohos_source_set("dfx_trace_dlsym") { - public_configs = [ ":dfx_trace_config" ] - defines = [ - "DFX_ENABLE_TRACE", - "is_ohos=${is_ohos}", - "is_mingw=${is_mingw}", - ] - sources = [ "dfx_trace_dlsym.cpp" ] - cflags = [ "-fstack-protector-strong" ] - if (is_ohos && !is_mingw) { - external_deps = [ "bounds_checking_function:libsec_shared" ] + template("dfx_trace_dlsym_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + } + ohos_source_set(target_name) { + public_configs = [ ":dfx_trace_config" ] + defines = [ + "DFX_ENABLE_TRACE", + "is_ohos=${is_ohos}", + "is_mingw=${is_mingw}", + ] + sources = [ "dfx_trace_dlsym.cpp" ] + cflags = [ "-fstack-protector-strong" ] + if (is_ohos && !is_mingw) { + external_deps = [ "bounds_checking_function:libsec_shared" ] + } + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" } - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" } - ohos_source_set("dfx_trace_dlsym_static") { - public_configs = [ ":dfx_trace_config" ] - defines = [ - "DFX_ENABLE_TRACE", - "is_ohos=${is_ohos}", - "is_mingw=${is_mingw}", - ] - sources = [ "dfx_trace_dlsym.cpp" ] - cflags = [ "-fstack-protector-strong" ] - if (is_ohos && !is_mingw) { - external_deps = [ "bounds_checking_function:libsec_static" ] + dfx_trace_dlsym_template("dfx_trace_dlsym") { + enable_cfi = false + } + + dfx_trace_dlsym_template("dfx_trace_dlsym_with_cfi") { + enable_cfi = true + } + + + template("dfx_trace_dlsym_static_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + } + ohos_source_set(target_name) { + public_configs = [ ":dfx_trace_config" ] + defines = [ + "DFX_ENABLE_TRACE", + "is_ohos=${is_ohos}", + "is_mingw=${is_mingw}", + ] + sources = [ "dfx_trace_dlsym.cpp" ] + cflags = [ "-fstack-protector-strong" ] + if (is_ohos && !is_mingw) { + external_deps = [ "bounds_checking_function:libsec_static" ] + } + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" } - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" } - ohos_source_set("dfx_trace") { - public_configs = [ ":dfx_trace_config" ] - defines = [ "DFX_ENABLE_TRACE" ] - sources = [ "dfx_trace.cpp" ] - cflags = [ "-fstack-protector-strong" ] - external_deps = [ - "bounds_checking_function:libsec_shared", - "hitrace:hitrace_meter", - ] - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" + dfx_trace_dlsym_static_template("dfx_trace_dlsym_static") { + enable_cfi = false + } + + dfx_trace_dlsym_static_template("dfx_trace_dlsym_static_with_cfi") { + enable_cfi = true } + + + template("dfx_trace_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + } + ohos_source_set(target_name) { + public_configs = [ ":dfx_trace_config" ] + defines = [ "DFX_ENABLE_TRACE" ] + sources = [ "dfx_trace.cpp" ] + cflags = [ "-fstack-protector-strong" ] + external_deps = [ + "bounds_checking_function:libsec_shared", + "hitrace:hitrace_meter", + ] + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" + } + } + dfx_trace_template("dfx_trace") { + enable_cfi = false + } + + dfx_trace_template("dfx_trace_with_cfi") { + enable_cfi = true + } + } diff --git a/faultloggerd.gni b/faultloggerd.gni index 85c87e68bdd4368baeda150ad396dd120b6f1466..4d20044264427b1ea65c6acd3468d67eb99c99c5 100644 --- a/faultloggerd.gni +++ b/faultloggerd.gni @@ -25,6 +25,7 @@ declare_args() { faultloggerd_liteperf_enable = true processdump_parse_lock_owner_enable = true faultloggerd_enable_build_targets = true + enable_cfi = false if (defined(global_parts_info)) { if (defined(global_parts_info.hiviewdfx_hisysevent)) { faultloggerd_hisysevent_enable = true diff --git a/frameworks/allocator/BUILD.gn b/frameworks/allocator/BUILD.gn index 9afa79c17078d2208e381d86c72adc714e363531..40589b2cb39281dacdc56fabbfc755d694bd368f 100644 --- a/frameworks/allocator/BUILD.gn +++ b/frameworks/allocator/BUILD.gn @@ -26,23 +26,45 @@ if (!defined(ohos_lite)) { "$faultloggerd_common_path/dfxlog", ] } - ohos_source_set("dfx_allocator_src") { - public_configs = [ ":dfx_allocator_config" ] - sources = dfx_allocator_sources + template("dfx_allocator_src_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + } + ohos_source_set(target_name) { + public_configs = [ ":dfx_allocator_config" ] + sources = dfx_allocator_sources - deps = [ - "$faultloggerd_common_path/cutil:dfx_cutil", - "$faultloggerd_common_path/dfxlog:dfx_hilog_base", - ] - if (is_asan) { - defines = [ "DFX_ALLOCATE_ASAN" ] + deps = [ + "$faultloggerd_common_path/cutil:dfx_cutil", + "$faultloggerd_common_path/dfxlog:dfx_hilog_base", + ] + if (is_asan) { + defines = [ "DFX_ALLOCATE_ASAN" ] + } + external_deps = [ + "c_utils:utils", + "hilog:libhilog_base", + ] + + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" } - external_deps = [ - "c_utils:utils", - "hilog:libhilog_base", - ] + } + + dfx_allocator_src_template("dfx_allocator_src") { + enable_cfi = false + } - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" + dfx_allocator_src_template("dfx_allocator_src_with_cfi") { + enable_cfi = true } } diff --git a/frameworks/localhandler/BUILD.gn b/frameworks/localhandler/BUILD.gn index 3008c19876f58aa33dd83e02cc1f54e5f7b162ab..cfd64f499e7eb5532c1da71e6bf1b62adb59c814 100644 --- a/frameworks/localhandler/BUILD.gn +++ b/frameworks/localhandler/BUILD.gn @@ -32,28 +32,59 @@ if (!defined(ohos_lite)) { "$faultloggerd_interfaces_path/innerkits/signal_handler/include", ] } - ohos_source_set("dfx_local_handler_src") { - public_configs = [ - ":dfx_local_handler_config", - "$faultloggerd_frameworks_path/allocator:dfx_allocator_config", - ] - sources = dfx_local_handler_sources - sources += [ "$faultloggerd_interfaces_path/innerkits/signal_handler/dfx_signalhandler_exception.c" ] - deps = [ - "$faultloggerd_common_path/cutil:dfx_cutil", - "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_frameworks_path/allocator:dfx_allocator_src", - "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", - "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", - "$faultloggerd_path/common/dfxlog:dfx_hilog_base", - ] - external_deps = [ - "c_utils:utils", - "hilog:libhilog_base", - "hisysevent:libhisysevent", - ] - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" + template("dfx_local_handler_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + } + ohos_source_set(target_name) { + public_configs = [ + ":dfx_local_handler_config", + "$faultloggerd_frameworks_path/allocator:dfx_allocator_config", + ] + sources = dfx_local_handler_sources + sources += [ "$faultloggerd_interfaces_path/innerkits/signal_handler/dfx_signalhandler_exception.c" ] + deps = [ + "$faultloggerd_common_path/cutil:dfx_cutil", + "$faultloggerd_common_path/dfxutil:dfx_util", + "$faultloggerd_frameworks_path/allocator:dfx_allocator_src_with_cfi", + "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", + "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", + "$faultloggerd_path/common/dfxlog:dfx_hilog_base", + ] + + external_deps = [ + "c_utils:utils", + "hilog:libhilog_base", + "hisysevent:libhisysevent", + ] + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" + + if (defined(invoker.branch_protector_ret)) { + branch_protector_ret = invoker.branch_protector_ret + } + + if (defined(invoker.sanitize)) { + sanitize = invoker.sanitize + } + } + } + + dfx_local_handler_template("dfx_local_handler_src") { + enable_cfi = false + } + + dfx_local_handler_template("dfx_local_handler_src_with_cfi") { + enable_cfi = true } } diff --git a/interfaces/innerkits/async_stack/BUILD.gn b/interfaces/innerkits/async_stack/BUILD.gn index 85585a8382e84754103b0883d8c047a7dae87c4e..1c03466d74aa32c507f7de4b359c09ed334ae62a 100644 --- a/interfaces/innerkits/async_stack/BUILD.gn +++ b/interfaces/innerkits/async_stack/BUILD.gn @@ -30,6 +30,13 @@ if (defined(ohos_lite)) { } ohos_shared_library("libasync_stack") { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":async_stack_config" ] defines = [ "is_ohos=${is_ohos}", diff --git a/interfaces/innerkits/backtrace/BUILD.gn b/interfaces/innerkits/backtrace/BUILD.gn index f181d62e72e3fef751a9676b38cff8c3dd5f5054..b2e3f4b7f3f2c762dc22b9abdf394472b13b959e 100644 --- a/interfaces/innerkits/backtrace/BUILD.gn +++ b/interfaces/innerkits/backtrace/BUILD.gn @@ -43,7 +43,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", ] @@ -77,6 +77,12 @@ if (defined(ohos_lite)) { ohos_shared_library("libbacktrace_local") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":dfx_backtrace_config", "$faultloggerd_common_path/build:coverage_flags", @@ -87,7 +93,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", ] @@ -125,7 +131,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog_base_static", - "$faultloggerd_common_path/trace:dfx_trace_dlsym_static", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_static_with_cfi", "$faultloggerd_interfaces_path/innerkits/procinfo:dfx_procinfo_static", "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder_base", ] diff --git a/interfaces/innerkits/crash_exception/BUILD.gn b/interfaces/innerkits/crash_exception/BUILD.gn index e6bc405c12553ddd6efdc257d068d4838ba2d17b..ff8bf235919011d9f4f92ac210ecfc55e12cbcab 100644 --- a/interfaces/innerkits/crash_exception/BUILD.gn +++ b/interfaces/innerkits/crash_exception/BUILD.gn @@ -43,6 +43,13 @@ if (defined(ohos_lite)) { } ohos_shared_library("crash_exception") { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } sources = crash_exception_sources public_configs = [ ":crash_exception_config" ] version_script = "libcrash_exception.map" diff --git a/interfaces/innerkits/dump_catcher/BUILD.gn b/interfaces/innerkits/dump_catcher/BUILD.gn index 1c5b5538801b7877464d8b6af06d2d74def3df75..071afa140362afbed61994c66c9628f7b88cc760 100644 --- a/interfaces/innerkits/dump_catcher/BUILD.gn +++ b/interfaces/innerkits/dump_catcher/BUILD.gn @@ -44,7 +44,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$faultloggerd_interfaces_path/innerkits/backtrace:libbacktrace_local", "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", @@ -66,6 +66,12 @@ if (defined(ohos_lite)) { ohos_shared_library("libdfx_dumpcatcher") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":dfx_dump_catcher_config", "$faultloggerd_path/common/build:coverage_flags", @@ -78,7 +84,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$faultloggerd_interfaces_path/innerkits/backtrace:libbacktrace_local", "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", diff --git a/interfaces/innerkits/faultloggerd_client/BUILD.gn b/interfaces/innerkits/faultloggerd_client/BUILD.gn index 50100f6c0521bba16cb8210a6fb4960ddef542b6..31aa4877adac531638513bf6f91bea50994e2045 100644 --- a/interfaces/innerkits/faultloggerd_client/BUILD.gn +++ b/interfaces/innerkits/faultloggerd_client/BUILD.gn @@ -63,6 +63,12 @@ if (defined(ohos_lite)) { ohos_shared_library("libfaultloggerd") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":faultloggerd_client_config", "$faultloggerd_path/common/build:coverage_flags", diff --git a/interfaces/innerkits/formatter/BUILD.gn b/interfaces/innerkits/formatter/BUILD.gn index e054c1c8b3620e264bfa4a449a39feb86f7f332c..e917636f7efea192bb62f241380050670bca2d46 100644 --- a/interfaces/innerkits/formatter/BUILD.gn +++ b/interfaces/innerkits/formatter/BUILD.gn @@ -24,6 +24,13 @@ if (defined(ohos_lite)) { } ohos_shared_library("libjson_stack_formatter") { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":json_stack_formatter_config", "$faultloggerd_common_path/build:coverage_flags", diff --git a/interfaces/innerkits/procinfo/BUILD.gn b/interfaces/innerkits/procinfo/BUILD.gn index 637409b92a23d7d4228933f79dd80fbfaa36fc37..4f4316ce49cbd2b20ac0434afe36e59e36dfcf7f 100644 --- a/interfaces/innerkits/procinfo/BUILD.gn +++ b/interfaces/innerkits/procinfo/BUILD.gn @@ -45,6 +45,12 @@ if (defined(ohos_lite)) { ohos_shared_library("libdfx_procinfo") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":dfx_procinfo_config", "$faultloggerd_path/common/build:coverage_flags", diff --git a/interfaces/innerkits/signal_handler/BUILD.gn b/interfaces/innerkits/signal_handler/BUILD.gn index 48ca8f28ad61b3d4003dea0424d388285b0cd762..f2245cf088a22fa72a7a695848dd363a74fc6693 100644 --- a/interfaces/innerkits/signal_handler/BUILD.gn +++ b/interfaces/innerkits/signal_handler/BUILD.gn @@ -54,6 +54,12 @@ if (defined(ohos_lite)) { ohos_shared_library("dfx_signalhandler") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":dfx_signal_handler_config", "$faultloggerd_common_path/build:coverage_flags", diff --git a/interfaces/innerkits/stack_printer/BUILD.gn b/interfaces/innerkits/stack_printer/BUILD.gn index bd26e90d7f2529e39e95227e51f068f0daeb3249..913f7be6ef340bc5ddfe20bdbb716961ac907455 100644 --- a/interfaces/innerkits/stack_printer/BUILD.gn +++ b/interfaces/innerkits/stack_printer/BUILD.gn @@ -25,6 +25,13 @@ if (defined(ohos_lite)) { } ohos_shared_library("libstack_printer") { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } sources = [ "src/stack_printer.cpp" ] public_configs = [ ":stack_printer_config" ] diff --git a/interfaces/innerkits/unwinder/BUILD.gn b/interfaces/innerkits/unwinder/BUILD.gn index ec7c74e648732bbddc580048a3c51a33eae1a9bb..2524169b432fb3b3cd0129c7a585dbff8c172781 100644 --- a/interfaces/innerkits/unwinder/BUILD.gn +++ b/interfaces/innerkits/unwinder/BUILD.gn @@ -84,7 +84,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$hilog_lite_deps_path", ] @@ -114,7 +114,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", "$hilog_lite_deps_path", ] external_deps = [ "bounds_checking_function:libsec_shared" ] @@ -160,6 +160,12 @@ if (defined(ohos_lite)) { ohos_shared_library("libunwinder") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } public_configs = [ ":dfx_unwinder_config", ":lzma_config", @@ -182,7 +188,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", ] version_script = "libunwinder.map" @@ -226,7 +232,7 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", ] external_deps = [ @@ -278,42 +284,64 @@ if (defined(ohos_lite)) { subsystem_name = "hiviewdfx" } - ohos_source_set("libunwinder_src") { - public_configs = [ - ":dfx_unwinder_config", - ":lzma_config", - ":mixstack_config", - ] - defines = [ - "DFX_LOG_UNWIND", - "INSTR_STATISTIC_ENABLE", - ] - defines += [ "CJ_DEMANGLE" ] - if (target_cpu != "x86_64") { - dfx_unwinder_sources -= [ "src/registers/getcontext_x86_64.S" ] + template("libunwinder_src_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi } - sources = dfx_unwinder_sources - sources += dfx_exidx_sources - sources += dfx_dwarf_sources - - deps = [ - "$faultloggerd_common_path/dfxlog:dfx_hilog", - "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", - ] - - external_deps = [ - "bounds_checking_function:libsec_shared", - "c_utils:utils", - "hilog:libhilog", - ] - - if (is_ohos && !is_mingw && !is_emulator) { - external_deps += [ "lzma:lzma_shared" ] + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } } + ohos_source_set(target_name) { + public_configs = [ + ":dfx_unwinder_config", + ":lzma_config", + ":mixstack_config", + ] + defines = [ + "DFX_LOG_UNWIND", + "INSTR_STATISTIC_ENABLE", + ] + defines += [ "CJ_DEMANGLE" ] + if (target_cpu != "x86_64") { + dfx_unwinder_sources -= [ "src/registers/getcontext_x86_64.S" ] + } + sources = dfx_unwinder_sources + sources += dfx_exidx_sources + sources += dfx_dwarf_sources + + deps = [ + "$faultloggerd_common_path/dfxlog:dfx_hilog", + "$faultloggerd_common_path/dfxutil:dfx_util", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", + ] + + external_deps = [ + "bounds_checking_function:libsec_shared", + "c_utils:utils", + "hilog:libhilog", + ] + + if (is_ohos && !is_mingw && !is_emulator) { + external_deps += [ "lzma:lzma_shared" ] + } + + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" + } + } - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" + libunwinder_src_template("libunwinder_src") { + enable_cfi = false + } + + libunwinder_src_template("libunwinder_src_with_cfi") { + enable_cfi = true } config("unwinder_host_config") { @@ -359,7 +387,7 @@ if (defined(ohos_lite)) { ] deps = [ "$faultloggerd_common_path/dfxutil:dfx_util_host", - "$faultloggerd_common_path/trace:dfx_trace_dlsym", + "$faultloggerd_common_path/trace:dfx_trace_dlsym_with_cfi", ] external_deps = [ "bounds_checking_function:libsec_static" ] diff --git a/services/BUILD.gn b/services/BUILD.gn index 082c6155be33a662e4c7b226426b276ad5e77d95..99c61e1db68f9c43a46258ef32d593a8f64968f3 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -59,7 +59,7 @@ if (defined(ohos_lite)) { deps = [ ":faultlogger.conf", - "$faultloggerd_common_path/trace:dfx_trace", + "$faultloggerd_common_path/trace:dfx_trace_with_cfi", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", "$faultloggerd_path/common/dfxlog:dfx_hilog", "$faultloggerd_path/common/dfxutil:dfx_util", @@ -169,11 +169,11 @@ if (defined(ohos_lite)) { ":faultloggerd.para.dac", ":faultloggerd_config.json", ":fault_coredump.json", - "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src", + "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src_with_cfi", "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", "$faultloggerd_path/common/dfxlog:dfx_hilog_base", "$faultloggerd_path/common/dfxutil:dfx_util", - "$faultloggerd_path/common/trace:dfx_trace", + "$faultloggerd_path/common/trace:dfx_trace_with_cfi", "$faultloggerd_path/interfaces/innerkits/faultloggerd_client:libfaultloggerd", ] diff --git a/services/snapshot/BUILD.gn b/services/snapshot/BUILD.gn index 3e0efdb22d1d981eea8a695062cb101a74639846..0fcbefff0a3cb931b2e62ebd0e7f52b17c55476f 100644 --- a/services/snapshot/BUILD.gn +++ b/services/snapshot/BUILD.gn @@ -15,6 +15,12 @@ import("//base/hiviewdfx/faultloggerd/faultloggerd.gni") ohos_shared_library("kernel_snapshot") { branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } install_enable = true sources = [ "kernel_snapshot_content_builder.cpp", diff --git a/test/unittest/backtrace/BUILD.gn b/test/unittest/backtrace/BUILD.gn index 30db561d77b8e9eda2ccf45b1109ff51bedbea3d..a5f1b329211a2c3568beb29a75a2b98b2461dd95 100644 --- a/test/unittest/backtrace/BUILD.gn +++ b/test/unittest/backtrace/BUILD.gn @@ -34,7 +34,6 @@ ohos_unittest("backtrace_utils_test") { if (use_musl && musl_use_jemalloc && musl_use_jemalloc_dfx_intf) { defines = [ "USE_JEMALLOC_DFX_INTF" ] } - branch_protector_ret = "pac_ret" external_deps = [ "c_utils:utils", "googletest:gtest_main", @@ -63,7 +62,6 @@ ohos_unittest("backtrace_local_test") { "$faultloggerd_path/interfaces/innerkits/procinfo:libdfx_procinfo", "$faultloggerd_path/test/utils:dfx_test_util", ] - branch_protector_ret = "pac_ret" external_deps = [ "bounds_checking_function:libsec_shared", "c_utils:utils", @@ -94,7 +92,6 @@ ohos_unittest("backtrace_utils_test_static") { if (use_musl && musl_use_jemalloc && musl_use_jemalloc_dfx_intf) { defines += [ "USE_JEMALLOC_DFX_INTF" ] } - branch_protector_ret = "pac_ret" external_deps = [ "c_utils:utilsbase", "googletest:gtest_main", @@ -126,7 +123,6 @@ ohos_unittest("backtrace_local_test_static") { "$faultloggerd_path/interfaces/innerkits/procinfo:dfx_procinfo_static", "$faultloggerd_path/test/utils:dfx_test_util", ] - branch_protector_ret = "pac_ret" external_deps = [ "bounds_checking_function:libsec_static", "c_utils:utilsbase", diff --git a/test/unittest/faultloggerd/BUILD.gn b/test/unittest/faultloggerd/BUILD.gn index 4037324818520804ff2d8e8199be44885a53fcbc..b2176e994801eda795d2dd62eb4595366a327b3c 100644 --- a/test/unittest/faultloggerd/BUILD.gn +++ b/test/unittest/faultloggerd/BUILD.gn @@ -15,21 +15,6 @@ import("//base/hiviewdfx/faultloggerd/faultloggerd.gni") import("//build/config/features.gni") import("//build/test.gni") -# Copyright (c) 2021-2024 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//base/hiviewdfx/faultloggerd/faultloggerd.gni") - if (defined(ohos_lite)) { import("//build/lite/config/component/lite_component.gni") import("//build/lite/config/test.gni") diff --git a/test/unittest/unwind/BUILD.gn b/test/unittest/unwind/BUILD.gn index 8a7bd7e9ff983ec92eb845b182114e2b96205f15..f06eebd49cac78367449de28dc3ca15eed7c74d2 100644 --- a/test/unittest/unwind/BUILD.gn +++ b/test/unittest/unwind/BUILD.gn @@ -82,7 +82,6 @@ ohos_unittest("test_unwind_pac") { "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder_src", "$faultloggerd_path/test/utils:dfx_test_util", ] - branch_protector_ret = "pac_ret" external_deps = [ "bounds_checking_function:libsec_shared", "c_utils:utils", diff --git a/tools/crasher_c/BUILD.gn b/tools/crasher_c/BUILD.gn index 341fdd1c080fa34dbe6913ae61efff97623704e0..eba102c95726cba9eb24ff6e5a28a491c077bd95 100644 --- a/tools/crasher_c/BUILD.gn +++ b/tools/crasher_c/BUILD.gn @@ -53,7 +53,6 @@ if (defined(ohos_lite)) { "$faultloggerd_path/common/build:coverage_flags", ] - branch_protector_ret = "pac_ret" sources = [ "dfx_crasher.c" ] external_deps = [ "hilog:libhilog" ] part_name = "faultloggerd" diff --git a/tools/crasher_c/dfx_crasher.c b/tools/crasher_c/dfx_crasher.c index 16daa6f52c2520ac315568884d814fa46a84c403..985f5185702cb9492024f5bae51c638d2b33da79 100644 --- a/tools/crasher_c/dfx_crasher.c +++ b/tools/crasher_c/dfx_crasher.c @@ -161,21 +161,21 @@ NOINLINE int MaxMethodNameTest12345678901234567890123456789012345678901234567890 return 0; } -NOINLINE int StackOverflow(void) +static int DoStackOverflow(int depth) { - printf("call StackOverflow\n"); - // for stack overflow test - char a[1024][1024][1024] = { { {'1'} } }; - char b[1024][1024][1024] = { { {'1'} } }; - char c[1024][1024][1024] = { { {'1'} } }; - char d[1024][1024][1024] = { { {'1'} } }; - printf("a[0][0] is %s\n", a[0][0]); - printf("b[0][0] is %s\n", b[0][0]); - printf("c[0][0] is %s\n", c[0][0]); - printf("d[0][0] is %s\n", d[0][0]); + char arr[1024][1024][1024] = { { {'1'} } }; + printf("arr[0][0] is %s\n", arr[0][0]); + if (depth > 0xFFFF) { + return 0; + } + return DoStackOverflow(depth + 1); +} - return 0; +NOINLINE int StackOverflow(void) +{ + printf("call StackOverflow\n"); + return DoStackOverflow(0); } NOINLINE int Oom(void) diff --git a/tools/crasher_cpp/BUILD.gn b/tools/crasher_cpp/BUILD.gn index db07f52ff55dded34839a629c8dbdf7478ffda47..4ae4396d1beeff923f3e1228e4d630ae3327d466 100644 --- a/tools/crasher_cpp/BUILD.gn +++ b/tools/crasher_cpp/BUILD.gn @@ -77,8 +77,6 @@ if (defined(ohos_lite)) { "faults/remote_object_interface_stub.cpp", ] - branch_protector_ret = "pac_ret" - deps = [ "$faultloggerd_interfaces_path/innerkits/async_stack:libasync_stack", "$faultloggerd_interfaces_path/innerkits/signal_handler:dfx_signalhandler", diff --git a/tools/dump_catcher/BUILD.gn b/tools/dump_catcher/BUILD.gn index 7da132d411fe29527de9400a437454e096fb41a8..e9ec7ae735d98f26bbeb41d32f4003e8078e2570 100644 --- a/tools/dump_catcher/BUILD.gn +++ b/tools/dump_catcher/BUILD.gn @@ -67,7 +67,7 @@ if (defined(ohos_lite)) { cflags_cc = [ "-DDEBUG_CRASH_LOCAL_HANDLER" ] deps = [ - "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src", + "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src_with_cfi", "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", "$faultloggerd_path/common/dfxlog:dfx_hilog", "$faultloggerd_path/common/dfxutil:dfx_util", diff --git a/tools/process_dump/BUILD.gn b/tools/process_dump/BUILD.gn index 6bc8880f998bd42ef54c00f5996d124106120b9e..2e2dd1b1a26146073b83d3bc5f7ef4c12022cd07 100644 --- a/tools/process_dump/BUILD.gn +++ b/tools/process_dump/BUILD.gn @@ -147,45 +147,68 @@ if (defined(ohos_lite)) { ] } - ohos_source_set("process_info_src") { - sources = processdump_sources - if (target_cpu == "arm64") { - sources += coredump_sources + template("process_info_src_template") { + if (defined(invoker.enable_cfi)) { + enable_cfi = invoker.enable_cfi + } + if (enable_cfi) { + branch_protector_ret = "pac_ret" + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } } - configs = [ - ":processdump_config", - "$faultloggerd_common_path/build:coverage_flags", - ] - deps = [ - "$faultloggerd_common_path/dfxlog:dfx_hilog", - "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace", - "$faultloggerd_interfaces_path/innerkits/async_stack:libasync_stack", - "$faultloggerd_interfaces_path/innerkits/backtrace:libbacktrace_local", - "$faultloggerd_interfaces_path/innerkits/crash_exception", - "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", - "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", - "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", - ] + ohos_source_set(target_name) { + sources = processdump_sources + if (target_cpu == "arm64") { + sources += coredump_sources + } + configs = [ + ":processdump_config", + "$faultloggerd_common_path/build:coverage_flags", + ] - external_deps = [ - "bundle_framework:appexecfwk_base", - "bundle_framework:appexecfwk_core", - "cJSON:cjson", - "c_utils:utils", - "hilog:libhilog", - "hisysevent:libhisysevent", - "hitrace:libhitracechain", - "hitrace:hitrace_meter", - "init:libbegetutil", - "jsoncpp:jsoncpp", - "ipc:ipc_core", - "samgr:samgr_proxy", - ] + deps = [ + "$faultloggerd_common_path/dfxlog:dfx_hilog", + "$faultloggerd_common_path/dfxutil:dfx_util", + "$faultloggerd_common_path/trace:dfx_trace_with_cfi", + "$faultloggerd_interfaces_path/innerkits/async_stack:libasync_stack", + "$faultloggerd_interfaces_path/innerkits/backtrace:libbacktrace_local", + "$faultloggerd_interfaces_path/innerkits/crash_exception", + "$faultloggerd_interfaces_path/innerkits/faultloggerd_client:libfaultloggerd", + "$faultloggerd_interfaces_path/innerkits/procinfo:libdfx_procinfo", + "$faultloggerd_interfaces_path/innerkits/unwinder:libunwinder", + ] - part_name = "faultloggerd" - subsystem_name = "hiviewdfx" + external_deps = [ + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "cJSON:cjson", + "c_utils:utils", + "hilog:libhilog", + "hisysevent:libhisysevent", + "hitrace:libhitracechain", + "hitrace:hitrace_meter", + "init:libbegetutil", + "jsoncpp:jsoncpp", + "ipc:ipc_core", + "samgr:samgr_proxy", + ] + + part_name = "faultloggerd" + subsystem_name = "hiviewdfx" + } + } + + process_info_src_template("process_info_src") { + enable_cfi = false + } + + process_info_src_template("process_info_src_with_cfi") { + enable_cfi = true } ohos_executable("processdump") { @@ -227,8 +250,8 @@ if (defined(ohos_lite)) { deps = [ "$faultloggerd_common_path/dfxlog:dfx_hilog", "$faultloggerd_common_path/dfxutil:dfx_util", - "$faultloggerd_common_path/trace:dfx_trace", - "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src", + "$faultloggerd_common_path/trace:dfx_trace_with_cfi", + "$faultloggerd_frameworks_path/localhandler:dfx_local_handler_src_with_cfi", "$faultloggerd_interfaces_path/innerkits/async_stack:libasync_stack", "$faultloggerd_interfaces_path/innerkits/backtrace:libbacktrace_local", "$faultloggerd_interfaces_path/innerkits/crash_exception",