概述:

ASAN全称:Address Sanitizer,google发明的一种内存地址错误检查器,它会接管内存的申请和释放,每次的内存的读写都会检查,因此可以做到快速的定位各种内存错误的问题。OpenHarmony_asan版本编译及使用见如下链接:https://laval.csdn.net/64c86c2fbc2c435cdd54b7e6.html 。

部分产品适配开源GPU(mesa3d)后直接编译asan版本会报:ld.lld:error:undefined symbol:__asan_XXXXX  类故障导致编译失败。下面就某产品适配开源GPU版本后编译asan版本适配步骤如下,以供参考。

常规版本编译:

使用正常编译指令(./build.sh --product-name 产品名称)编译产品,确保常规版本能正常编译并烧写开发板后功能正常。

适配前asan版本编译:

使用asan版本编译指令(./build/common/asan/build_mixed_asan.sh --product-name 产品名称  --build-variant root -gX:XXXXXX (gX:X为0-9中数字,XXXXXX为开启asan检测的服务名称))编译产品,

编译mesa3d过程中三方库zlib/expat 多处报错:ld.lld:error: undefined symbol: ___asan_xxxxxx 导致编译失败。

mesa3d编译asan版本适配:

1)、修改meson_cross_process.py 中交叉编译链接工具地址:

对比目录(代码根目录/prebuilts/clang/ohos/ )下工具的名称和版本,修改编译工具链配置:

以3.2release为例:

代码路径:代码根目录/third_party/mesa3d/ohos/meson_cross_process.py

修改前:

' -Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/10.0.1/lib/arm-linux-ohos'
' -Lproject_stub/prebuilts/clang/ohos/linux-x87_64/llvm/lib/arm-linux-ohos/c++'

修改后:

' -Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/12.0.1/lib/arm-linux-ohos'
' -Lproject_stub/prebuilts/clang/ohos/linux-x86_64/llvm/lib/arm-linux-ohos/c++'

2)、编译三方库expat/zlib

代码根目录下:

./build.sh --product-name 产品名称 --build-target expat 

./build.sh --product-name 产品名称 --build-target zlib

3)、清除mesa3d编译临时文件

cd third_party/mesa3d

rm -rf cross_file

rm -rf pkgconfig

rm -rf build-ohos

4)、编译普通版本mesa3d

python ohos/build_ohos.py ~/代码根目录 产品名称 ~/代码根目录/third_party/mesa3d

注意:如果还是上报之前的ld.lld:error:undefined symbol:__asan_XXXXX类故障,需重复执行常规版本编译步骤,整编项目成功后继续单独编译mesa3d,编译mesa3d普通版本成功后再继续下面步骤。

5)、添加meas3d asan版本编译脚本:  

路径:代码根目录/third_party/mesa3d/ohos/

复制 build_mesa3d.py并改名为build_mesa3d_asan.py,同时如下添加meson clang编译asan 版本参数

修改前:

...
os.chdir(mesa3d_dir)
prepare_environment(project_dir,product)
...
'-Dtools=panfrost',
'-Ddri-search-path=/system/lib',

修改后:

...
os.chdir(mesa3d_dir)
shutil.rmtree('build-ohos',ignore_errors=True)
prepare_environment(project_dir,product)
...
'-Dtools=panfrost',
'-Db_sanitize=address',
'-Db_lundef=false',
'-Ddri-search-path=/system/lib',

路径:代码根目录/third_party/mesa3d/ohos/

复制 build_ohos.py 并改名为build_ohos_asan.py,同时如下添加参数

修改前:

-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools=panfrost -Ddri-search-path=/system/lib'

修改后:

-Dvulkan-drivers= -Dgbm=enabled -Degl=enabled -Dcpp_rtti=false -Dglx=disabled -Dtools=panfrost -Db_sanitize=address -Db_lundef=false -Ddri-search-path=/system/lib'


6)、编译mesa3d asan版本:

重复步骤3,清除临时文件

重复步骤4,编译mesa3d asan版本,

python ohos/build_ohos_asan.py ~/代码根目录 产品名称 ~/代码根目录/third_party/mesa3d

编译成功后方可继续下面步骤。

7)、修改BUILD.gn 文件

路径:代码根目录/third_party/mesa3d/ohos/BUILD.gn

修改前:

inputs = deps_inputs
script = build_mesa3d.py
deps = [
    "//foundation/graphic/graphic_2d:libsurface"
    "//third_party/expat:expat"
]

修改后:

inputs = deps_inputs
if(is_asan){
    script = build_mesa3d_asan.py
}else{
    script = build_mesa3d.py
}
deps = [
    "//foundation/graphic/graphic_2d:libsurface"
    "//third_party/expat:expat"
]

8)、整编系统asan版本

示例rk3568开启camera_service 服务的asan 检测,gn 中n 编号0 

./build/common/asan/build_mixed_asan.sh --product-name rk3568  --build-variant root -g0:camera_service

编译成功后,在out/产品名称/packages/phone/images 中生成system0.img

按照asan版本烧录镜像测试即可。

 

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐