From b84ed4818d95c9796ce141e66d42f6732dc7da92 Mon Sep 17 00:00:00 2001 From: xlgitee Date: Tue, 9 Sep 2025 15:43:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E8=83=BD=E5=89=8D&=E5=90=8E=E5=90=91c?= =?UTF-8?q?fi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xlgitee Change-Id: Ia9fca6426d6bccf7a18b843d8633e46e2d55812f --- common/trace/BUILD.gn | 142 +++++++++++++----- faultloggerd.gni | 1 + frameworks/allocator/BUILD.gn | 52 +++++-- frameworks/localhandler/BUILD.gn | 75 ++++++--- interfaces/innerkits/async_stack/BUILD.gn | 7 + interfaces/innerkits/backtrace/BUILD.gn | 12 +- interfaces/innerkits/crash_exception/BUILD.gn | 7 + interfaces/innerkits/dump_catcher/BUILD.gn | 10 +- .../innerkits/faultloggerd_client/BUILD.gn | 6 + interfaces/innerkits/formatter/BUILD.gn | 7 + interfaces/innerkits/procinfo/BUILD.gn | 6 + interfaces/innerkits/signal_handler/BUILD.gn | 6 + interfaces/innerkits/stack_printer/BUILD.gn | 7 + interfaces/innerkits/unwinder/BUILD.gn | 104 ++++++++----- services/BUILD.gn | 6 +- services/snapshot/BUILD.gn | 6 + test/unittest/backtrace/BUILD.gn | 4 - test/unittest/faultloggerd/BUILD.gn | 15 -- test/unittest/unwind/BUILD.gn | 1 - tools/crasher_c/BUILD.gn | 1 - tools/crasher_c/dfx_crasher.c | 24 +-- tools/crasher_cpp/BUILD.gn | 2 - tools/dump_catcher/BUILD.gn | 2 +- tools/process_dump/BUILD.gn | 97 +++++++----- 24 files changed, 407 insertions(+), 193 deletions(-) diff --git a/common/trace/BUILD.gn b/common/trace/BUILD.gn index 266e043ae..3b1ac2973 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 85c87e68b..4d2004426 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 9afa79c17..40589b2cb 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 3008c1987..cfd64f499 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 85585a838..1c03466d7 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 f181d62e7..b2e3f4b7f 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 e6bc405c1..ff8bf2359 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 1c5b55388..071afa140 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 50100f6c0..31aa4877a 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 e054c1c8b..e917636f7 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 637409b92..4f4316ce4 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 48ca8f28a..f2245cf08 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 bd26e90d7..913f7be6e 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 ec7c74e64..2524169b4 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 082c6155b..99c61e1db 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 3e0efdb22..0fcbefff0 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 30db561d7..a5f1b3292 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 403732481..b2176e994 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 8a7bd7e9f..f06eebd49 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 341fdd1c0..eba102c95 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 16daa6f52..985f51857 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 db07f52ff..4ae4396d1 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 7da132d41..e9ec7ae73 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 6bc8880f9..2e2dd1b1a 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", -- Gitee