当前位置: 首页 > news >正文

musl libc ldso 动态加载研究笔记:01

前言

  • musl 是一个轻量级的标准C库,建立在系统调用之上,可以认为是【用户态】的C 库,与 glibc 或者 uClibc 属于同一类。

  • 基于 musl 的 gcc 工具链包括交叉编译工具链,可以用于编译 Linux 或者其他的操作系统,如当前 Lite-OS、RT-Smart 上都采用 musl gcc 作为编译工具链,使用 musl libc作为用户态应用的C 库。

  • musl 基于 MIT 授权,开源、轻量、免费,估计越来越多的操作系统开始采用 musl 作为标准C库

  • 最近也一直在研究 musl libc 的 ldso,也就是动态加载功能,musl 的 动态加载功能集成在 musl libc.so 中。

elf 格式文件

  • musl 本身集成了 动态加载 功能 ldso,初步看了代码,发现支持 elf 格式的动态编译的应用程序加载。

  • 使用 musl gcc 工具链(交叉编译工具链)编译的应用程序,可以通过 readelf -l xxx.elf,查看 elf 文件的是否存在动态链接信息,如果包含则需要使用 musl ldso 对依赖的共享库进行加载

  • 示例: 查看一个动态链接的应用程序是否存在 【解释器段】信息: INTERP 类型的

命令:aarch64-linux-musleabi-readelf.exe -l glib_gio_test_s.elf 或者 readelf.exe -l glib_gio_test_s.elf

发现 存在 INTERP 段信息, [Requesting program interpreter: /lib/ld-musl-aarch64.so.1]

在这里插入图片描述

查看 elf 文件依赖的共享库

  • 静态编译的 elf,没有 动态链接信息,也不依赖 共享库,而动态编译链接的 elf 文件,存在动态链接信息,通过 aarch64-linux-musleabi-readelf.exe -d glib_gio_test_s.elf 或者 readelf.exe -d glib_gio_test_s.elf,可以查看依赖的共享库

在这里插入图片描述

查看 elf 的头部信息

  • 使用 aarch64-linux-musleabi-readelf.exe -h glib_gio_test_s.elf 或者 readelf.exe -h glib_gio_test_s.elf 可以查看应用程序 elf 的头部信息,如获取 入口函数地址等

在这里插入图片描述

查看 elf 符号信息

  • 所谓 elf 符号,就是一些变量名、函数名、数组等,依旧可以通过 readelf 来查看

aarch64-linux-musleabi-readelf.exe -s glib_gio_test_s.elf 或者 readelf.exe -s glib_gio_test_s.elf,注意由于有些 应用程序 elf 文件的符号特别多,所以可以输出到一个文本文件,然后使用文件查看工具进行查看

aarch64-linux-musleabi-readelf.exe -s glib_gio_test_s.elf > sym_01.s ,这里 把符号导出到 sym_01.s 文件,然后用文本查看工具打开查看

在这里插入图片描述

elf 查看工具

  • 以上是 elf 文件 通过 readelf 进行查看,那么还有其他的工具可以查看 elf 文件吗?

  • 推荐使用 :EmEditor 二进制查看工具,可以查看、搜索、编辑二进制文件, elf 文件其实也是二进制文件。

在这里插入图片描述

  • 推荐使用 Die,大名鼎鼎的 Detect It Easy 工具进行 elf 文件的解析查看,可以二进制查看、反汇编、查看 各个段、节等信息

  • 使用 die 打开一个 elf 文件

在这里插入图片描述

  • 使用 die 查看 elf 文件信息: elf 头部
    在这里插入图片描述

小结

  • 本篇主要记录 elf 文件的查看,初步了解一下 要动态加载的 文件,也就是 研究动态加载之前,一定要熟悉 elf 格式的文件,文件组成、文件头部、文件 Program Header,文件的各个段,文件的 节,动态加载需要加载 elf 文件的哪些内容

  • 当前了解到, 一个 elf 文件 只有一个 头部、有一个或者多个 Program Header,一个 Program Header 的大小是固定的,也就是一个结构体,里面的内容描述一个 段Segment 信息, 一个 elf 文件有多少个 Program Header? 这个需要通过解析 elf 文件的 头部: elf Header 获取到

  • 建议查看 elf 的标准规范,熟悉 elf ,熟悉 elf 组成、加载机制,这样对后面研究动态加载非常重要。

相关文章:

musl libc ldso 动态加载研究笔记:01

前言 musl 是一个轻量级的标准C库,建立在系统调用之上,可以认为是【用户态】的C 库,与 glibc 或者 uClibc 属于同一类。 基于 musl 的 gcc 工具链包括交叉编译工具链,可以用于编译 Linux 或者其他的操作系统,如当前 L…...

2023 年 4 款适用于安卓手机的最佳 PDF 转 Word 转换器

尝试在 Android 上将 PDF 文档转换为 Word 文件?好吧,您可能会发现要让它发挥作用几乎是不可能的,至少在没有任何额外工具的情况下是这样。Web 上有用于此类转换的选项,但本地不一定会发生任何情况(可能除了一个应用程…...

前端:运用html+css+jquery.js实现截图游戏

前端:运用htmlcssjquery.js实现截图游戏 1. 前言2. 实现原理3. 参考代码和运行结果 1. 前言 最近在刷手机视频时,总是能刷到一个这样的视频,视频上是一个截图游戏,当图片上的某个片段正好在图片的正确位置时,暂停视频,…...

Maven之JDK编译问题

IDEA Maven 默认使用 JDK 1.5 编译问题 IDEA 在「调用」maven 时,IDEA 默认都会采用 JDK 1.5 编译,不管你安装的 JDK 版本是 JDK 7 还是 JDK 8 或者更高。这样一来非常不方便,尤其是时不时使用 JDK 7/8 的新特性时。如果使用新特性&#xff…...

开发测试框架一 - 创建springboot工程及基础操作

一、创建及运行方式 1. 从官网导入: 注意:由于我的java版本是1.8;所以选中了spring2.7.14;如果你的java版本是9及以上,选中spring3相关的同时Java 版本也要对应起来 2. 创建第一个get请求 创建Controller package及…...

【IMX6ULL驱动开发学习】08.马达驱动实战:驱动编写、手动注册平台设备和设备树添加节点信息

目录 一、使用设备树 1.1 修改设备树流程 二、手动创建平台设备 三、总结(附驱动程序) 前情提要:​​​​​​​【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树_阿龙还在写代码的博客-CSDN博客 手动注册…...

直方图均衡化和自适应直方图均衡化

前言: Hello大家好,我是Dream。 均衡化是数字图像处理中常用的一种技术,用于增强图像的视觉效果和对比度。,今天我们将实现对同一张图像的直方图均衡化和自适应直方图均衡化处理,学习一下两者的的基本原理和实现过程&a…...

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境,面对问题我们在效率提升、质量保障等方向的探索和实践,在此将实践过程中问题解决的思路和方案与大家一起分享,也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…...

数据挖掘 | 零代码采集房源数据,支持自动翻页、数据排重等

1 前言 城市规划、商业选址等应用场景中经常会对地区房价、地域价值进行数据分析,其中地区楼盘房价是分析数据中重要的信息参考点,一些互联网网站上汇聚了大量房源信息,通过收集此类数据,能够对地区房价的分析提供参考依据。 如何…...

迪米特法则

迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个原则,旨在降低对象之间的耦合性,提高系统的可维护性和可扩展性。该原则强调一个类不应该直接与其它不相关的类相互交互,…...

云积天赫|AIGC+营销的排头兵

AIGC生成式人工智能,正逐渐成为人们关注的焦点。AIGC的出现,标志着人工智能已经进入了一个全新的时代。AIGC的出现,也为营销行业带来了新的活力。那么企业该怎么利用这次AIGC浪潮,成为AIGC营销的排头兵呢?      “…...

Oracle 数据库备份

1、使用管理员账号创建对应的directory目录 登录数据库 sqlplus / as sysdba 创建directory create or replace directory dumpdir as F:\container; 2、给用户赋予使用该目录的权限 grant read,write on directory dumpdir to Scott; 查看创建的目录位置 select * fro…...

【C++】模板template

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ C       🛰️社区 :✈️ 进步学堂       🛰️欢…...

智能工厂:适应不断变化的制造世界

制造业已经从过去传统的装配线工艺流程中走了很长一段路。随着技术的进步和工业 4.0 的兴起,制造业正在迅速发展,以满足现代世界不断变化的需求。近年来出现的一个关键概念就是“智能工厂”。在这篇文章中,我们将探讨什么是智能工厂、它是如何…...

大数据课程I3——Kafka的消息流与索引机制

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的消息流处理; ⚪ 掌握Kafka的索引机制; ⚪ 掌握Kafka的消息系统语义; 一、Kafka消息流处理 1. Producer 写入消息 流程说明: 1. producer 要向Kafka生产消息,需要先通过…...

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…...

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…...

【学会动态规划】最长湍流子数组(23)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…...

HTML详解连载(7)

HTML详解连载(7) 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽结构伪类选择器作用 :nth-child(公式)作用举例 伪元素选择器作用注意: PxCoook作用盒子模型-重要组成部分 盒子模型-边框线属性名属性…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

webpack面试题

面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...

【Qt】控件 QWidget

控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...