CallStack相关的编译报错undefined symbol正面解决方案

背景:

前面文章关于CallStack的解决方法都是属于不直接使用CallStack的方式来解决,但先说明哈,是实在没有办法的情况下才会考虑非CallStack打印方案,其实在很多情况下都是可以使用这个CallStack。
因为经常报错的如下:

 error: undefined symbol: android::CallStack::CallStack(char const*, int)

但是你又明明加了对应的libutilscallstack在cpp的对应目标上,还是报错找不到的话,那么很可能是结构上的依赖有问题。
下面以两个案例来说明正常使用CallStack进行编译的情况

学员案例1

需求在
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
代码的openInputChannelPair进行堆栈打印

status_t openInputChannelPair(const std::string& name, std::shared_ptr<InputChannel>& serverChannel,
                              std::unique_ptr<InputChannel>& clientChannel) {
    android::CallStack cs("INTEL-MESA");
	cs.update();
	cs.log("INTEL-MESA");
 //省略
    return result;
}

然后编译的Android.bp中进行添加相关的添加libutilscallstack库,这里正常肯定是修改哪个cpp文件,就在cpp对应的编译目标中添加,所以这里修改如下:
frameworks/native/services/inputflinger/dispatcher/Android.bp
在这里插入图片描述
但是编译后报错如下:

[ 86% 211/244] //frameworks/native/services/inputflinger:libinputflinger link libinputflinger.so
FAILED: out/soong/.intermediates/frameworks/native/services/inputflinger/libinputflinger/android_x86_64_shared/unstripped/libinputflinger.so
prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_so/android_x86_64/crtbegin_so.o @out/soong/.intermediates/frameworks/native/services/inputflinger/libinputf
linger/android_x86_64_shared/unstripped/libinputflinger.so.rsp out/soong/.intermediates/external/libpalmrejection/libpalmrejection/android_x86_64_static/libpalmrejection.a out/soong/.intermediates/frameworks/nat
ive/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a out/soong/.intermediates/frameworks/native/libs/attestation/libattestation/android_x86_64_static/libattestation.
a prebuilts/clang/host/linux-x86/clang-r450784d/lib64/clang/14.0.6/lib/linux/libclang_rt.ubsan_minimal-x86_64-android.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_x86_64_static/libc++dema
ngle.a prebuilts/clang/host/linux-x86/clang-r450784d/lib64/clang/14.0.6/lib/linux/libclang_rt.builtins-x86_64-android.a out/soong/.intermediates/hardware/interfaces/input/processor/aidl/android.hardware.input.pr
ocessor-V1-ndk/android_x86_64_shared/android.hardware.input.processor-V1-ndk.so out/soong/.intermediates/system/libbase/libbase/android_x86_64_shared/libbase.so out/soong/.intermediates/frameworks/native/libs/bi
nder/libbinder/android_x86_64_shared/libbinder.so out/soong/.intermediates/frameworks/native/libs/binder/ndk/libbinder_ndk/android_x86_64_shared/libbinder_ndk.so out/soong/.intermediates/external/libchrome/libch
rome/android_x86_64_shared/libchrome.so out/soong/.intermediates/external/boringssl/libcrypto/android_x86_64_shared/libcrypto.so out/soong/.intermediates/system/core/libcutils/libcutils/android_x86_64_shared/lib
cutils.so out/soong/.intermediates/system/libhidl/libhidlbase/android_x86_64_shared/libhidlbase.so out/soong/.intermediates/frameworks/native/libs/input/libinput/android_x86_64_shared/libinput.so out/soong/.inte
rmediates/packages/modules/StatsD/lib/libkll/libkll/android_x86_64_shared/libkll.so out/soong/.intermediates/system/logging/liblog/liblog/android_x86_64_shared/liblog.so out/soong/.intermediates/external/protobu
f/libprotobuf-cpp-lite/android_x86_64_shared/libprotobuf-cpp-lite.so out/soong/.intermediates/frameworks/proto_logging/stats/stats_log_api_gen/libstatslog/android_x86_64_shared/libstatslog.so out/soong/.intermed
iates/packages/modules/StatsD/lib/libstatspull/libstatspull/android_x86_64_shared_current/libstatspull.so out/soong/.intermediates/packages/modules/StatsD/lib/libstatssocket/libstatssocket/android_x86_64_shared_
current/libstatssocket.so out/soong/.intermediates/system/core/libutils/libutils/android_x86_64_shared/libutils.so out/soong/.intermediates/frameworks/native/libs/ui/libui/android_x86_64_shared/libui.so out/soon
g/.intermediates/system/server_configurable_flags/libflags/server_configurable_flags/android_x86_64_shared/server_configurable_flags.so out/soong/.intermediates/frameworks/native/services/inputflinger/libinputfl
inger_base/android_x86_64_shared/libinputflinger_base.so out/soong/.intermediates/frameworks/native/services/inputflinger/reporter/libinputreporter/android_x86_64_shared/libinputreporter.so out/soong/.intermedia
tes/frameworks/native/services/inputflinger/reader/libinputreader/android_x86_64_shared/libinputreader.so out/soong/.intermediates/frameworks/native/libs/gui/libgui/android_x86_64_shared/libgui.so out/soong/.int
ermediates/external/libcxx/libc++/android_x86_64_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_x86_64_shared_current/libc.so out/soong/.intermediates/bionic/libm/libm/android_x86_64_shared_c
urrent/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_x86_64_shared_current/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_x86_64/obj/bionic/libc/arch-common/bionic/crtend_so.o -o o
ut/soong/.intermediates/frameworks/native/services/inputflinger/libinputflinger/android_x86_64_shared/unstripped/libinputflinger.so -target x86_64-linux-android10000 -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -W
l,--build-id=md5 -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe
 -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--hash-style=gnu -Wl,--exclude-libs=libclang_rt.builtins.a -m64 -nostdlib -Wl,--gc-sections -shared -Wl,-soname,libinputflinger.so -Wl,--ex
clude-libs,libclang_rt.ubsan_minimal.a -fsanitize=bounds -fno-sanitize-link-runtime -Wl,--exclude-libs,libclang_rt.ubsan_minimal.a 
ld.lld: error: undefined symbol: android::CallStack::CallStack(char const*, int)
>>> referenced by InputDispatcher.cpp:356 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:356)
>>>               InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a

ld.lld: error: undefined symbol: android::CallStack::update(int, int)
>>> referenced by InputDispatcher.cpp:357 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:357)
>>>               InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a

ld.lld: error: undefined symbol: android::CallStack::log(char const*, android_LogPriority, char const*) const
>>> referenced by InputDispatcher.cpp:358 (frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp:358)
>>>               InputDispatcher.o:(android::inputdispatcher::InputDispatcher::createInputMonitor(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)) in arch
ive out/soong/.intermediates/frameworks/native/services/inputflinger/dispatcher/libinputdispatcher/android_x86_64_static/libinputdispatcher.a

可以看到这里确实在编译InputDispatcher.cpp:356时候发现引入ld不到libutilscallstack库,所以导致无法找到符号表报错,但是明明我们确实cpp编译的bp中加入了相关的libutilscallstack,那这种应该怎么解决呢?
其实这种问题大家一定要认真看编译的报错日志第一行,看看具体编译哪个目标时候在报错:

[ 86% 211/244] //frameworks/native/services/inputflinger:libinputflinger link libinputflinger.so

大家注意这里是在编译libinputflinger.so时候报错的,那么大家就可以考虑找到libinputflinger的编译Android.bp,然后考虑加入libutilscallstack

frameworks/native/services/inputflinger/Android.bp
修改如下
在这里插入图片描述

再进行编译直接成果:

在这里插入图片描述

本质上其实就是libiinputflinger编译时候会对这个libinputdispatcher静态库有依赖,它libiinputflinger报错了引入不到,就需要把libutilscallstack加入到这个库的Android.bp.
验证:
在这里插入图片描述

学员案例2

这个文章已经讲解过了libgui这个库的BufferQueueProducer加入相关的CallStack会报错,进入基本无解状态

https://blog.csdn.net/learnframework/article/details/143989499

但是大家仔细一看报错
在这里插入图片描述
这些编译都不是在编译libgui.so时候报错的,都是编译media相关库才报错的,也就是说其实单独编译libgui是可以成功的

在这里插入图片描述
所以这里完全可以通过push libgui.so到手机系统获取模拟进行更新,也可以正常运行起来,这里就不进行整编也是完全可以看到相关的堆栈。注意这里如果模拟器整编还是报错,只能回退再编译,但是可以保存单编译libgui.so覆盖回退的,然后再触发打包既可以。

在这里插入图片描述

在这里插入图片描述
更多framework实战技术干货,请关注下面“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值