动态库符号抢占问题分析

背景

        前段时间在北汽项目中,遇到了一个奇怪现象,困扰了大家较长时间。最终在和同事的不懈努力下,从根因上解决了该问题,过程中也学习到了很多。在此,记录并分享,希望能够帮助大家。

问题描述

         作为OTA服务的提供方,我们提供方式一般为将自己的代码编译成动态库(libsysi4dpc.so),提供给设备厂家,让他们进行集成,并调试。

         熟悉aotodomain代码框架的同事应该知道,模块之间的通信方式为MQTT,并且libupc.a 提供了MQTT 的接口实现。也就是说,libsysi4dpc.so 库中其实是包含libupc.a 静态库的所有代码段和数据段,并不再依赖其他MQTT 动态库。如下图所示:

图一:libsysi4dpc.so 依赖动态库

         但是当客户集成libsysi4dpc.so 库,生成可执行程序hal-process。当出现crash时,通过gdb进行堆栈跟踪。会发现,虽然出错的线程是我们的adm_ups_run 接口(进行MQTT 重连的线程),但是其栈进入到了libmqtt-paho.so库中(这应该也是支持MQTT协议的库)。这就让我们很奇怪,因为我们代码中的MQTT协议接口应该是在libupc.a 中,为什么会走到libmqtt-paho.so 中呢?

         通过查询hal-process 动态库依赖,如下:

        

图2: hal-process 依赖动态库

        由上可知,libmqtt-paho.so 是hal-process进行链接的。(细心的同事可能会觉得奇怪,为什么没有看到libsysi4dpc.so,那是因为hal-process并不直接依赖我们的库,而是通过libqzm_dpc.so 间接依赖)。

        到此,问题应该就明确了,crash 的原因:是因为adm_ups_run 接口,并没有走到我们自己的mqtt库中,而是运行到了客户提供的mqtt库中,由于mqtt版本的不同,其中兼容问题,导致了crash。

解决方式

    上小节中的问题,在编译原理中有一个专业的名词:符号抢占。并且该业务情景应该是非常常见的,但为什么以前都不会出现呢?经过思考,我觉得原因可能如下:

    符号抢占可能一直存在,但是存在并不一定会出错。因为我们依赖的一些底层库,即使出现的符号抢占,但是客户依赖的库,其版本可能和我们是一样的,或者是相互兼容的,也就不会出现所谓的crash。只有当版本差距较大,或不兼容时,才会出现问题。

         最终问题的解决方式,在编译libsysi4dpc.so 时,加上编译选项-Wl,-Bsymbolic,该选项表示,强制采用本地的全局变量定义。

思考

    如果我们的mqtt库不再是静态库libupc.a,而是动态库libupc.so,上述的方法是否还可以呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch】Visualization of Feature Maps(1)

学习参考来自 CNN可视化Convolutional Featureshttps://github.com/wmn7/ML_Practice/blob/master/2019_05_27/filter_visualizer.ipynb 文章目录 filter 的激活值 filter 的激活值 原理:找一张图片,使得某个 layer 的 filter 的激活值最大&#xff0c…

66从零开始学Java之集合中的Collection体系

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 截止到今天,我们《从零开始学Java系列》的文章已经要到一个新的阶段了。在此之前&#xf…

【网络安全】——区块链安全和共识机制

区块链安全和共识机制 摘要:区块链技术作为一种分布式去中心化的技术,在无需第三方的情况下,使得未建立信任的交易双方可以达成交易。因此,区块链技术近年来也在金融,医疗,能源等多个行业得到了快速发展。然…

卷积、卷积图像操作和卷积神经网络

好多内容直接看书确实很难坚持,就比如这个卷积,书上的一大堆公式和图表直接把人劝退,我觉得一般的学习流程应该是自顶向下,先整体后局部,先把握大概再推敲细节的,上来就事无巨细地展示对初学者来说很痛苦。…

MAX/MSP SDK学习03:Atoms and Messages的使用

今天终于把Message消息选择器看得有点头绪了,主要是这个官方英文文档理解起来有点抽象。 编写IsMatchABC自定义Object,要求: ①若左入口(入口0)收到 "int" 型消息,则从出口发送数值 "888&q…

51单片机/STM32F103/STM32F407学习1_点亮LED灯

目录: 基础知识单片机从0实现单片机GPIO介绍 参考连接: 野火霸天虎教程 https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/ebf_stm32f407_batianhu_v1_v2/download/stm32f407_batianhu_v1_v2.html x.1 基础知识 x.1.1 指针中的取地址&a…

数据标注:猫目标检测数据集label标签制作

对于猫十二分类数据标注部分,可以使用官方制作的标注软件 下载地址:精灵标注助手-人工智能数据集标注工具 (jinglingbiaozhu.com) 标注图片为150张猫的图片 如下:

java智慧校园信息管理系统源码带微信小程序

一、智慧校园的定义 智慧校园指的是以云计算和物联网为基础的智慧化的校园工作、学习和生活一体化环境。以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合,让校园实现无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、…

适合学校或高校老师、学生学习用的网盘推荐

现代教育中,数字化的教学资源和家长的参与度越来越重要。然而文件传输的问题一直是学校和家长面临的一个挑战,网络限制、U盘病毒和文件管理不便等问题,都对教学质量和家校沟通造成了影响。Zoho WorkDrive企业网盘为学校还有教辅机构提供了一个…

基于单片机智能液位水位监测控制系统设计

**单片机设计介绍, 基于单片机智能液位水位监测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能液位水位监测控制系统可以用来检测和控制液位的高低,并可以用于水泵的控制和自…

键鼠自动化2.0展示

软件介绍:桌面键鼠自动化工具 Qtc 编写: 本软件采用Qt C编写,旨在提供高效、跨平台的桌面键鼠自动化解决方案。Qt C框架的选择确保了软件的稳定性、可靠性,并通过其图形用户界面实现了用户友好的操作体验。 鼠标移动与点击&#…

亚马逊车灯外贸出口CE认证标准办理解析

车灯是车辆夜间行驶在道路照明的工具,也是发出各种车辆行驶信号的提示工具。车灯一般分为前照灯、尾灯、转向灯等。车灯出口欧盟需要办理CE认证。 CE认证是欧盟对进入欧洲市场的产品强制性的认证标志,是指符合欧盟安全、健康、环境保护等标准和要求的产…

中国城镇化时空分异及影响因素数据集(2010-2020)

基于《中国统计年鉴》、各省份统计年鉴及EPS全球统计数据库等相关统计数据,从人居生活、人文环境、人城关系等维度界定了城镇化内涵框架与指标体系,利用改进的熵值法计算综合评价指数,并运用泰尔指数、方差分解及地理探测器等方法&#xff0c…

【Android Jetpack】理解ViewModel

文章目录 ViewModel实现ViewModelViewModel的生命周期在Fragments间分享数据ViewModel和SavedInstanceState对比ViewModel原理ViewModel与AndroidViewModel ViewModel Android系统提供控件,比如Activity和Fragment,这些控件都是具有生命周期方法&#x…

Playcanvas后处理-辉光bloom

(一)Bloom介绍 Bloom(辉光、光晕、泛光)是一种常见的摄像机后处理(PostProcessing)效果,用于再现真实世界相机的成像伪影。这种效果会产生从图像中明亮区域边界延伸的光条纹(或羽毛…

Altium Designer学习笔记2

原理图的绘制 需要掌握的是系统自带原理图库元件的添加。

[WUSTCTF 2020]level2 脱壳

这里我们发现ida打开后是有报错的 所以猜测是否有壳 所以我们去看看是否有壳 发现去壳了 然后再放到IDA中看即可

Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本

到2024年2月15日,Atlassian将不再提供对Jira、Confluence、Jira Service Management等Server版产品的支持。 近期,Atlassian推出了一项针对云产品的特殊优惠。现在从Server版迁移到云版,您能享受到高额补贴,甚至成本低至零元。立…

Odoo:行业领先的免费开源财务管理解决方案

面向现代企业的财务和会计软件 可靠关账,更快速、更准确地报告财务数据 Odoo ERP财务和会计软件可帮助财务主管设计、革新和理顺财务流程和运营。Odoo ERP无缝整合各种核心财务和会计功能,提供强大的合规管理特性,有助于企业改善业务绩效、提…

Selenium4+python被单独定义<div>的动态输入框和二级下拉框要怎么定位?

今天在做练习题的时候,发现几个问题捣鼓了好久,写下这篇来记录 问题一: 有层级的复选框无法定位到二级目录 对于这种拥有二级框的选项无法定位,也不是<select>属性. 我们查看下HTML,发现它是被单独封装在body内拥有动态属性的独立<div>,当窗口点击的时候才会触发…