musl libc ldso 动态加载研究笔记:动态库的搜索路径

news2024/12/23 17:35:40

前言

  • 在手动设置动态库的存放路径的情况下,发现 musl ldso 依旧可以加载位于 /lib 目录下的 动态共享库

  • 动态库的存放路径或者说搜索路径,是否可以手动配置?比如 Linux 上 有个配置文件可以配置,可以改变 动态库的搜索次序,musl ldso 是否也可以做到这一点?

搜索路径

  • 通过查看 musl 的代码: ldso\dynlink.c 中的 load_library 函数中实现,了解到,musl 的动态库默认是以 lib 作为前缀的,并且不能使用系统预留的 动态库名字,比如 libc.so

在这里插入图片描述

  • musl ldso 通过应用程序的 动态库依赖列表获取依赖的动态库名字,大部分是没有路径的。

在这里插入图片描述

  • 下面是动态库路径的处理:

在这里插入图片描述
在这里插入图片描述

  • 通过这里发现,当前 平台 LDSO_ARCH 如果为 aarch64 时,如果存在 /etc/ld-musl-aarch64.path 文件,就读取这个文件,获取 sys_path,也就是动态库的搜索路径

  • 动态库的搜索路径不只是一个,可以使用 : 冒号分隔多个路径,这个 sys_path 路径是有先后次序的,前面的优先搜索。

在这里插入图片描述

环境变量

  • ldso\dynlink.c 中的 __dls3 函数中,可以发现, env_path 与 env_preload 也是动态库搜索路径的环境变量,系统如果通过 setenv 设置了 LD_LIBRARY_PATH 或者 LD_PRELOAD,也会改变 musl ldso 的搜索路径的次序
		env_path = getenv("LD_LIBRARY_PATH");
		env_preload = getenv("LD_PRELOAD");
  • 当前了解到 LD_PRELOAD 设置的是动态库,这里的动态库也是使用: 冒号分隔,优先加载

  • 如果设置了 LD_LIBRARY_PATH,是动态库的搜索路径,可以是多个,: 冒号分隔,在 ldso\dynlink.c 中的 load_library 函数 发现比 系统路径执行的早。

  • 以上都没有设置,并且有了 /etc/ld-musl-aarch64.path 文件,就读取 /etc/ld-musl-aarch64.path 里面的路径作为系统动态库搜索路径

  • 如果没有 /etc/ld-musl-aarch64.path 文件,就搜索 默认的 sys_path = "/lib:/usr/local/lib:/usr/lib",这说明即使不设置, /lib 目录下的动态库可以被 musl ldso 搜索得到。

  • "/lib:/usr/local/lib:/usr/lib" 路径搜索次序为: /lib -> /usr/local/lib -> /usr/lib

LD_LIBRARY_PATH 设置方法

  • setenv("LD_LIBRARY_PATH", "/kernel:/home/lib:/hello/app", 1);,这里设置环境变量 LD_LIBRARY_PATH,这样可以搜索的路径为: /kernel -> /home/lib -> /hello/app

  • 注意 LD_LIBRARY_PATH 的设置不影响系统的动态库搜索路径,也就是 LD_LIBRARY_PATH 搜索不到,依旧去系统的动态库路径下搜索

ld-musl-aarch64.path 设置方法

  • 注意 ld-musl-aarch64.path 表示 aarch64 平台下的,不同的平台,注意名字 "/etc/ld-musl-" LDSO_ARCH ".path"

  • 测试方法: 把共享库 libt0.so 移动到其他的位置,如 /hello 目录下,此时运行 应用程序(依赖共享库 libt0.so),提示无法找到 依赖的共享库

  • 新建 /etc 目录, 在 /etc 目录下 新建 ld-musl-aarch64.path,内容 :/lib:/usr/local/lib:/usr/lib:/hello,也就是增加了 /hello 的路径

  • 此时再次运行应用程序,正常运行,发现加载的共享库位置: /hello/libt0.so

msh />./t0_test_s.elf
msh />Error loading shared library libt0.so: No such file or directory (needed by ./t0_test_s.elf)
librtthread.so : load map : 0x212000 
Error relocating ./t0_test_s.elf: t0_data_set: symbol not found
Error relocating ./t0_test_s.elf: t0_data_get: symbol not found


msh />mkdir /etc

msh />cd /etc/

msh /etc>echo /lib:/usr/local/lib:/usr/lib:/hello /etc/ld-musl-aarch64.path

msh /etc>cat ld-musl-aarch64.path
/lib:/usr/local/lib:/usr/lib:/hello


msh />./t0_test_s.elf
msh />libt0.so : load map : 0x212000 
librtthread.so : load map : 0x233000 
  /lib/librtthread.so : init_array : 0x235a60 
  /hello/libt0.so : init_array : 0x212750 
  ./t0_test_s.elf : init_array : 0x2015d0 
main : test start
main : -----------dlopen enter -----------
dl_test : ------------get-----------
dl_test : [get] ts.name = rt-smart_t0_lib_default
dl_test : [get] ts.cmd = 0xaabbccdd
dl_test : [get] ts.data = 0x8999eeff
main : -----------dlopen exit -----------
main : ------------get-----------
main : [get] ts.name = rt-smart_t0_lib_default
main : [get] ts.cmd = 0xaabbccdd
main : [get] ts.data = 0x8999eeff
main : ------------set->get-----------
main : [set-get] ts.name = t2_name_is_ok
main : [set-get] ts.cmd = 0x33559977
main : [set-get] ts.data = 0x4499aabb
main : test end

预加载库 LD_PRELOAD

  • 当前 musl ldso 支持 "LD_PRELOAD" 环境变量,可以通过 setenv("LD_PRELOAD", "/lib/aa.so:/lib/bb.so", 1); 设置需要提前加载的共享库。

小结

  • 如果应用程序共享的库有优先级,可以把优先级高的放在搜索路径的前面,可以通过配置 /etc/ld-musl-aarch64.path 文件或者设置环境变量: setenv("LD_LIBRARY_PATH", "/kernel:/home/lib:/hello/app", 1);

  • 如果几个动态库需要提前加载初始化,可以通过 设置 "LD_PRELOAD" 环境变量,这样提前加载的共享库优先加载

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

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

相关文章

花了4天,做了一个公司的管理系统,只需几个步骤

一、背景 我是企业的管理人员,公司发展到现阶段,感觉进入到了瓶颈期,每个员工的工作都已经饱和,很难再挤出时间做其它的事情,需要一款合适的管理软件来协作我们的工作。 本来打算买一套管理软件就行了,现实…

jupyter notebook 插件nbextensions的安装

安装步骤: 1、打开 jupyter notebook,新建一个 python 文件; 2、 分别输入以下代码,然后运行,出现 warning 不影响使用,如果出现 errors,则说明下载有问题: !python -m pip install…

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询,全文搜索首先对查询词进行分析,然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据(text类型),默认的数据形式是人类的自然语言,如对话内容、图书名…

本地生活服务平台加盟哪家公司好?

本地生活的竞争从年初的火热到现在,已经进入了下半场,随着优胜劣汰的筛选,那么直到现在,想做本地生活服务平台加盟,哪家公司比较好呢,应该如何选择呢? 首先我们得弄懂,我们加盟本地…

c#设计模式-结构型模式 之 外观模式

概述 外观模式(Facade Pattern)又名门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。该模式…

命令行一键启动和关闭java应用

背景 近来在搞springcloud微服务,有服务的注册和发现,即nacos。有网关服务,即spring-gateway。有认证中心服务。还有用户中心服务,文件中心服务,springboot admin等等。部署的时候,这么多服务,…

2023-8-23 KMP字符串

题目链接&#xff1a;KMP字符串 #include <iostream>using namespace std;const int N 100010, M 1000010;int n, m; char p[N], s[M]; int ne[N];int main() {cin >> n >> p 1 >> m >> s 1;// 求ne&#xff0c;也就是求next数组的过程for…

司徒理财:8.23晚间黄金多空走势分析及操作策略

黄金走势分析&#xff1a;      黄金下跌遇阻&#xff0c;短线开启震荡调整走势&#xff0c;但跌势依旧没有改变&#xff0c;没有突破1906压力前&#xff0c;还是偏空走势&#xff0c;反弹继续干空。趋势行情&#xff0c;不要轻言翻转&#xff01;即便下跌结束&#xff0c;…

从零开始搭建公司后台技术栈

整个后台技术栈我的理解包括 4 个层面的内容&#xff1a; 语言&#xff1a;用了哪些开发语言&#xff0c;如&#xff1a;C/Java/Go/PHP/Python/Ruby 等等&#xff1b;组件&#xff1a;用了哪些组件&#xff0c;如&#xff1a;MQ 组件&#xff0c;数据库组件等等&#xff1b;流…

网络安全(黑客)自学,看这篇就够了!

前言 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、…

Spring缓存深入解析:@Cacheable的使用详解

摘要&#xff1a;在本文中&#xff0c;我们将深入研究Spring框架中的Cacheable注解。我们会通过详细的Java示例&#xff0c;探讨如何使用这个功能强大的注解来提升应用程序性能。 一、什么是缓存&#xff1f; 在计算机科学中&#xff0c;缓存是一种存储技术&#xff0c;用于保…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

OzCode v4.0 for VS2022 Crack

在 Datadog&#xff0c;我们认为了解生产环境对于构建更好的软件至关重要&#xff0c;尤其是在现代环境变得越来越复杂的情况下。生产中出现的错误通常很难在本地重现&#xff0c;OzCode 这使得开发人员只能猜测出了什么问题。为了解决这个问题&#xff0c;团队需要像本地环境一…

kaggle推荐系统比赛top方案汇总【附baseline代码】

推荐系统可以很好地解决信息过载以及信息不足等问题&#xff0c;广泛应用与电商、金融、新闻咨询、社交、旅游等行业&#xff0c;其中最典型并具有良好的发展和应用前景的领域就是电子商务领域。 在学术界&#xff0c;推荐系统同样是热门的研究方向&#xff0c;在各大顶会中的…

skynet环境搭建

一、系统环境&#xff1a;win10 二、基础软件下载&#xff1a; 1、VirtualBox虚拟机软件 下载地址&#xff1a;Oracle VM VirtualBox 其实常用的虚拟机软件是VMWare&#xff0c;VirtualBox&#xff0c;它轻量、开源免费&#xff0c;学习使用够用。 2、Ubuntu系统镜像 下载…

堆叠聚合模型是处理非平衡数据的理想算法

堆叠聚合模型是处理非平衡数据的理想算法 堆叠聚合模型的设计是通过训练多个模型&#xff0c;然后使用原模型&#xff0c;将多个模型的输出结果整合在一起以实现更准确的预测。这叠聚合模型在多个临床场景上都表现出优于单一模型的效能[1]。是构建临床预测模型过程中值得考察的…

听GPT 讲Alertmanager源代码--api

在Alertmanager项目中&#xff0c;api目录承担了与Alertmanager的API相关的功能和实现。下面是api目录中一些主要文件和作用的详细解释&#xff1a; api.go: 这个文件定义了Alertmanager的API接口&#xff0c;包括路由和处理API请求的函数。它定义了与Alertmanager交互的各种AP…

生信豆芽菜-样本分布比较的圈图

网址&#xff1a;http://www.sxdyc.com/visualsPieComparePlot 1、数据准备 样本的分组信息&#xff0c;其中第一列为需要比较组&#xff0c;其他都是默认和第一个进行比较 2、输入图片的宽度和高度&#xff0c;选择颜色的类型&#xff0c;提交后&#xff0c;等待运行成功即可…

C#开发WinForm之DataGridView开发

前言 DataGridView是开发Winform的一个列表展示&#xff0c;类似于表格。学会下面的基本特征用法&#xff0c;再辅以经验&#xff0c;基本功能开发没问题。 1.设置 DataGridView表格行首为序号索引, //设置 DataGridView表格行首为序号索引private void dataGridView1_RowPost…

WinDbg定位死锁问题

文章目录 方法1方法2方法3 方法1 1、首先确认下是哪个进程出现死锁的情况&#xff0c;如界面卡死、点击没有反应等&#xff0c;抓取对应进程的dump 2、查看是否存在 0:000> kv ChildEBP RetAddr Args to Child 0019f3b8 77736b0c 77722253 00000108 0000000…