dlsym函数返回null的解决办法

dlsym函数返回null的解决办法dlsym 是什么 见 采用 dlopen dlsym dlclose 加载动态链接库 总结

dlsym是什么?

dlsym是一个计算机函数,功能是根据动态链接库操作句柄与符号,返回符号对应的地址,不但可以获取函数地址,也可以获取变量地址

见:采用dlopen、dlsym、dlclose加载动态链接库【总结】

 

出现问题

给Android添加system_service的代码时,在HAL层出现问题;

源代码

/* Get the address of the struct hal_module_info. */ const char *sym = HAL_MODULE_INFO_SYM_AS_STR; hmi = (struct hw_module_t *)dlsym(handle, sym); if (hmi == NULL) { ALOGE("load: couldn't find symbol %s", sym); status = -EINVAL; goto done; }

错误日志打印:

2021-06-14 21:23:58.084 1828-1828/system_process I/HAL: 1.1 hardware load() path:/system/lib64/hw/freg.default.so 2021-06-14 21:23:58.084 1828-1828/system_process I/HAL: 2 hardware load() 2021-06-14 21:23:58.084 1828-1828/system_process E/HAL: load: couldn't find symbol HMI

结果表明,库“freg.default.s”没有HMI符号。

 

排查步骤

(1)首先使用grep查看“.os”是否有HMI,如下:

gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ ls  audio.a2dp.default.so camera.default.so camera.usb.default.so freg.default.so input.evdev.default.so gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ grep -rn HMI Binary file input.evdev.default.so matches Binary file camera.default.so matches Binary file audio.a2dp.default.so matches Binary file camera.usb.default.so matches gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$

上面的结果现实,“freg.default.s”没有HMI符号。

(2)使用查看符号表命令;

查看符号表的命令:linux 下查看 so库 符号表

gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ nm -D freg.default.so U __android_log_print 0000000000002008 A __bss_start U close U __cxa_atexit U __cxa_finalize 0000000000002008 A _edata 0000000000002008 A _end U __errno U free U malloc U __open_2 U read U __register_atfork U __stack_chk_fail U strcmp U strerror U __write_chk gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ nm -D input.evdev.default.so U __android_log_assert U __android_log_print 0000000000004118 A __bss_start U __cxa_atexit U __cxa_finalize 0000000000004118 A _edata 0000000000004120 A _end 0000000000004010 D HMI U memcpy U pthread_create U pthread_setspecific U __register_atfork U __stack_chk_fail U strcmp U _ZdlPv 0000000000001530 T _ZN7android11EvdevModule12notifyReportEP12input_report 0000000000001410 T _ZN7android11EvdevModule4initEv 0000000000001510 T _ZN7android11EvdevModule4loopEv 0000000000001300 T _ZN7android11EvdevModuleC1EPNS_18InputHostInterfaceE 0000000000001300 T _ZN7android11EvdevModuleC2EPNS_18InputHostInterfaceE U _ZN7android8InputHubC1ERKNSt3__110shared_ptrINS_22InputCallbackInterfaceEEE U _ZNKSt3__119__shared_weak_count13__get_deleterERKSt9type_info 0000000000001840 W _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN7android11EvdevModuleEFvvEPS8_EEEEEPvSD_ U _ZNSt3__115__thread_structC1Ev U _ZNSt3__115__thread_structD1Ev U _ZNSt3__119__shared_weak_count14__release_weakEv U _ZNSt3__119__shared_weak_countD2Ev U _ZNSt3__119__thread_local_dataEv 0000000000001750 W _ZNSt3__120__shared_ptr_emplaceIN7android18InputDeviceManagerENS_9allocatorIS2_EEE16__on_zero_sharedEv 0000000000001760 W _ZNSt3__120__shared_ptr_emplaceIN7android18InputDeviceManagerENS_9allocatorIS2_EEE21__on_zero_shared_weakEv U _ZNSt3__120__throw_system_errorEiPKc U _ZNSt3__16threadD1Ev U _Znwm U _ZSt9terminatev U _ZTVN7android18InputDeviceManagerE U _ZTVN7android9InputHostE 0000000000003c60 V _ZTVNSt3__120__shared_ptr_emplaceIN7android18InputDeviceManagerENS_9allocatorIS2_EEEE gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$

(3)查看代码;

查看代码,对比了 hardware/libhardware/modules/ 目录下的其他模块的 Android.bp 文件,发现多了个  “-fvisibility=hidden”,  如下面所示,删除掉这句。

这是从其他的文件中拷贝过来的,因此引入了这个问题。

 cflags: [ "-Wall", "-Wextra", "-Werror", "-fvisibility=hidden", ],

(4)验证问题,编译后,重新查看符号表。如下:

gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ nm -D freg.default.so U __android_log_print 0000000000003108 A __bss_start U close U __cxa_atexit U __cxa_finalize 0000000000003108 A _edata 000000000000310c A _end U __errno U free 0000000000003010 D HMI U malloc U __open_2 U read U __register_atfork U __stack_chk_fail U strcmp U strerror U __write_chk gs@aigo:~/nvme_1T/android9.0.0_35/out/target/product/generic_x86_64/system/lib64/hw$ 

可以看到,有 “HMI” 了,至此,问题解决。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220395.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:35
下一篇 2026年3月17日 下午8:36


相关推荐

  • Gradle build.gradle配置

    Gradle build.gradle配置Gradlebuild gradle 配置每个构建脚本 build gradle 都有一个默认的 Project 的实例 脚本中所有的操作都在 project 实例的作用域 1 项目信息项目信息指项目的坐标 groupversion 为 project 的方法 项目名称 name 在 settings gradle 中 group com kepus version 1

    2026年3月17日
    2
  • 解决:error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No

    解决:error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No解决OpenSSL:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:No解决OpenSSL:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfil…

    2022年6月29日
    33
  • 机房搬迁是什么意思_计算机机房管理规定

    机房搬迁是什么意思_计算机机房管理规定原标题:盘点机房搬迁中最容易出现的五个问题企业要更换办公地址的时候,最头疼的问题就是搬迁机房,机房的搬迁可不是搬家那么简单,是否能顺利搬迁,将成为保障企业业务连续性的关键要素。在企业机房的搬迁中,最容易出现哪些问题?盘点机房搬迁中最容易出现的五个问题(1)领导不明确在规划阶段最常见的错误是未能建立明确的领导。这意味着在迁移过程中的各个阶段中要确定谁负责明确的沟通,带领团队。在一个单一的部门,默认…

    2025年6月26日
    5
  • 笔记本外接显示器怎么投屏(笔记本电脑怎么连接显示屏)

    “开始”右键,点击搜索->在搜索框中输入“投影”->“投影到第二屏幕”,点击打开可以看到四种模式:仅电脑屏幕;仅第二屏幕;复制;扩展选择“扩展”桌面空白处右键->显示设置->显示点击标识,确认屏幕1(一般是笔记本原屏幕),屏幕2(一般是外接显示屏)分别是哪块屏幕。根据自己的需要设置主显示器然后就可以愉快的双屏工作啦~…

    2022年4月11日
    408
  • php stristr_str.center()方法的功能是什么

    php stristr_str.center()方法的功能是什么欢迎进入Linux社区论坛,与200万技术人员互动交流>>进入php中strstr函数的用法:strstr()函数搜索一个字符串在另一个字符串中的第一次出现的字符串。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回false.语法strstr(欢迎进入Linux社区论坛,与200万技术人员互动交流>>进入php中strstr函数的…

    2025年11月12日
    7
  • 表白代码Python_自制表白神器

    表白代码Python_自制表白神器文章目录前言演示网站制作部署网站二维码制作总结前言跟着我做,不要跳着看,否则你会失败。第一步是制作二维码;第二步是制作网站。演示具体成果地址:https://yanghanwen.xyz/ai/网站制作首先你需要下载我的这个完整项目:链接:https://pan.baidu.com/s/1EmRehx_gRnT5hLjJvKuAIg提取码:pz1y–来自百度网盘超级会员V2的分享下载好后文件目录如下:然后你需要注意的是我把img里面的图片删了,涉及隐私,大家自己替换自己追

    2022年8月23日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号