AARCH64架构openEuler系统下Android模拟器SIGSEGV问题求助
Android模拟器AARCH64平台SIGSEGV问题解答
疑问1:该问题是否属于模拟器自身bug?为何ci.android.com显示测试通过?
- 这确实是模拟器的线程局部存储(TLS)地址冲突bug。QEMU的
current_cpu和libandroid-emu-metrics.so的ul_jrand_seed两个线程局部变量,在计算TLS偏移时未考虑不同Linux发行版的TLS布局差异,导致抢占了同一内存地址,最终触发virtio_reset函数的非法访问错误。 - ci.android.com测试通过的原因主要有两种可能:一是测试环境采用Google官方标准的AARCH64系统(如Ubuntu),其TLS段布局与openEuler不同,刚好避开了这个偏移冲突;二是测试用例未覆盖到触发
virtio_reset的场景,没有走会触发地址冲突的代码路径。
疑问2:是否是我的系统存在问题?多次重装系统无效。
- 不是你的系统问题。openEuler 22.03 LTS SP1的TLS布局完全符合AARCH64架构规范,多次重装系统无效也证明了系统本身的TLS机制是正常的。问题根源在于模拟器模块没有兼容openEuler这类非Ubuntu系的AARCH64发行版的TLS布局。
额外建议
- 可以向Android模拟器官方提交bug报告,附上你的系统环境、GDB调试日志以及临时修复方案,帮助官方针对性修复跨发行版的兼容性问题。
- 临时修复可继续使用你当前修改
libandroid-emu-metrics.so指令的方式,也可以尝试更新到模拟器的最新Canary版本,看是否已修复该冲突。
内容的提问来源于stack exchange,提问作者吴云泽
相关产品推荐
相关产品推荐

