我正在为Android编译一个共享库,别人在他们的应用中加载。我想在我的库在Android设备上运行的时候,使用Clang的 仪表测绘.
我已经添加了Clang选项 -fprofile-instr-generate
到编译和链接,虽然这在Linux上编译和加载库时产生了原始剖析数据,但在Android上我得到了以下错误。
04-26 20:39:37.559 3313 3313 D AndroidRuntime: 关闭虚拟机
04-26 20:39:37.559 3313 3313 E AndroidRuntime: FATAL EXCEPTION: main
04-26 20:39:37.559 3313 3313 E AndroidRuntime: 进程: com.my.process, PID: 3313
04-26 20:39:37.559 3313 3313 E AndroidRuntime.Java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__start___llvm_prf_vnds" referenced by "pathtomy.so":
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__start___llvm_prf_vnds" referenced by "pathtomy.so"...。
04-26 20:39:37.559 3313 3313 E AndroidRuntime: at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
04-26 20:39:37.559 3313 3313 E AndroidRuntime: at java.lang.System.loadLibrary(System.java:1657)
当运行 nm -D my.so | grep prf
我得到的是
00000000007f1cc8 D __start___llvm_prf_cnts.
0000000000827918 d __start___llvm_prf_data
00000000008fb570 d __start___llvm_prf_names。
000000000117bf58 d __start___llvm_prf_vnds
0000000000827918 a __stop___llvm_prf_cnts
00000000008fb568 a __stop___llvm_prf_data
000000000117bf54 a __stop___llvm_prf_names
0000000001181F58 A __stop___llvm_prf_vnds
所以看起来符号是有的。
能否在安卓系统上运行剖析仪器?
剖析与gold和LD连接器一起工作。只有在使用BFD链接器时才会出现这个错误。. 该 sh_info
参赛 .dynsym
部分应该指向第一个非LOCAL符号,但在错误情况下,它被设置得太低。
要验证,运行 readelf -aW
在有问题的共享库上。在我的repo中, sh_info
对于 .dynsym
是3个,而LOCAL符号至少有11个。