Android NDK cannot locate symbol "__register_atfork"的一次经典定位分析~

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK cannot locate symbol "__register_atfork"的一次经典定位分析~相关的知识,希望对你有一定的参考价值。

团队当前承接各类小程序开发项目,安卓移植项目,APP开发,JAVA web开发,有需要合作的找明哥。

最近在给一个客户处理编译问题,最终编译出来的so库,运行时候出错,出错信息如下:

网上找了下,都说是NDK版本不对,但实际上我验证下来NDK是匹配的,出错的原因是别的,这一节就来分析下怎么处理这类问题。

这类问题出现,第一步先确认下这个符号是否在so库里面:

objdump -t xxx.so >~/log.txt ,查看文件,可以确定确实被so库引用了,这里标记的UND意思是,这个方法是由外部提供的,需要加载器在加载时候帮我找到,如果找不到,就出现我们的cannot locate symbol "__register_atfork"。

我们判定出来是一个外部引用,那么第二步就是判定这个是在哪里:

我们在源码和NDK目录搜索,最后发现这个东西存在于libc这种库里面,而libc这个是源码编译的,而且这里搜索出来的,android-23以上的libc.so有,以下版本没有。

而我们的板子是android 5.1,巧的是API 级别:22 ,也就是5.1的libc里面是没有这个方法的,所以启动的时候报了这个错误。

问题的分析结论就是:NDK的编译使用的API值,跟板子的不匹配,而不是所谓的跟AS环境不匹配。

到这里还不算结束,因为还没找到libc.so 对应的这个定义地方,于是我这边再找了下这个,确认分析没问题。

去 androidxref.com 点击http://androidxref.com/9.0.0_r3/ ,搜索:__register_atfork 

我们展开来看下,就知道为什么5.1之前会出错了。

终于找到了原因,同时也定位出来了,这里主要是

__ANDROID_API__ >= __ANDROID_API_M__

而我们在项目里面,默认没有定义这个值,导致的结果就是__ANDROID_API__ 会被定义成

而关于这个项目中,如何打印出编译过程的一些定义值呢?不晓得有多少人知道,可以先研究下,后面我会给出答案。

所以我们需要在编译的Makefile文件里面,定义这个值 CFLAGS+=-D__ANDROID_API__=22 

从而让编译引用22的库,最终在目标板子就可以顺利跑起来了。

不知道你在真正处理问题的时候,会分析到哪个阶段呢?

1 只解决问题,不追求原因

2 追求原因

3 找到原因输出文档

4 找到核心点,做出推演这一类问题的解决思路

今天就说到这里了,喜欢别忘记转发~

~~~~~~~~~~~~~~~~~~end~~~~~~~~~~~~~~~~~~

最近有过来咨询安卓学习的朋友,贴了一些网上的教程,讲了一堆三方库的使用,以及常见控件的使用,这些在我这边不会细讲的,原因很简单,这个玩意就不是能力,培训这个纯粹是拼课程而已,没营养。

我的课程讲完,你学到的是:

1 如何去使用常见控件

2 如何自定义控件,原理是什么,整体框架是什么

3 系统怎么跑起来的,具体逻辑怎么理解

4 虚拟机是什么,代码位置,编译过程,加载过程

。。。。。。。。。。。

更多的内容,可以参看:

原创PDF |《Android 深入系统完全讲解》,可能价值百万!

暂时没折扣了,不用再问了。之前的3999都能感受到物超所值,因为辅导成长显而易见。

如果想尝鲜,可以咨询一次699,来给你把脉,我会依据你的能力栈,给你一个精准的辅导,助力你飞跃。后续报名全课程,直接抵1000.

最近咨询C语言的人比较多,同时最近也在准备系列视频课程,同时开设1V1的讲解,如果需要C语言的指导,可以联系我,我的微信 code_gg_boy 。

课程简单来讲,围绕这些,关于语法什么的,这些基础的东西,会让你去练习,遇见问题我来答疑,辅导的核心是解决理解上的所有障碍,这个才是真正要掌握的。

1 为什么学习c?

2 C语言相关知识体系

3 工具环境搭建

4 源码到可执行文件经历了哪些步骤?

5 程序又是怎么被加载运行的?

6 静态库与动态库的设计原理以及应用

7 计算机世界的映射以及抽象模型

8 C语言的指针与函数关联是什么

9 如何透彻的理解指针

10 C标准库路径以及学习路线指南

11 如何实现一个项目的开发过程?

课程当前安排表:

1 C语言简单介绍

2 环境设置,如何搭建,windows 和Linux 下的操作

3 程序结构,主要组成部分

4 基础语法

5 变量和常量

6 基础数据类型

7 运算符

8 条件,循环

9 作用域

10 头文件的引用

11 枚举

12 存储

13 堆与栈

14 作用域

15 字串

16 结构体和共用体

17 预处理,宏定义

18 文件操作

19 指针,函数指针

20 可变参数

21 递归,库的引用

22 实战项目开发(坦克大战)

--end--

今天分享一些整理的书单,关于C语言的,看这些书就足够学懂C语言了。关于操作系统相关内容,我们后续再来分享。

获取方式, 后台回复 我要学C语言  ,领取链接。

C语言练习项目源码:

获取方式, 后台回复 我要学C语言  ,领取链接。

抖音项目,全集100T内容,各类玩法,拍摄技巧,网络整理搜集!

计算机书籍一网打尽

热门文章

零基础新手自学Python编程教程入门精通学习资料网站大全

自学编程C语言不迷路,我私藏的书单分享给你!

零基础新手学习算法Leetcode刷题指南

程序员码农IT工程师自学编程计算机入门进阶学习网站大全

程序员面试题宝典以及相关书籍下载!

计算机类常用电子书整理大全

职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!

我的微信 code_gg_boy 。

以上是关于Android NDK cannot locate symbol "__register_atfork"的一次经典定位分析~的主要内容,如果未能解决你的问题,请参考以下文章

NDK编译库执行时报dlopen failed: cannot locate symbol "__exidx_end" 解决的方法

cannot locate symbol "atof" referenced by错误分析

CANNOT LINK EXECUTABLE 错误。如何将运行时库添加到 NDK 编译代码

android cannot locate symbol 'sigemptyset'问题解决

错误记录Visual Studio 中编译 NDK 报错 ( error : cannot use ‘throw‘ with exceptions disabled )

Android Studio: Error:Cannot locate factory for objects of type DefaultGradleConnector, as Connector