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 组成、加载机制,这样对后面研究动态加载非常重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM——类加载器

回顾一下类加载过程 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义…

STM32 cubemx CAN

接收用到的结构体如下:CAN概念: 全称Controller Area Network,是一种半双工,异步通讯。 物理层: 闭环:允许总线最长40m,最高速1Mbps,规定总线两端各有一个120Ω电阻,闭环…

IC流程中 DFT 学习笔记(2)

引言 DFT是ASIC芯片设计流程中不可或缺的环节。其主要目的是在芯片前端设计验证完成后插入一些诸如寄存器链等可供测试的逻辑,算是IC后端设计的范畴,属于结构测试而非功能测试。主要是在ASIC芯片流片完成后,通过这些已插入的逻辑&#xff0c…

国家一带一路和万众创业创新的方针政策指引下,Live Market探索跨境产业的创新发展

现代社会,全球经济互联互通,跨境产业也因此而崛起。为了推动跨境产业的创新发展,中国政府提出了“一带一路”和“万众创业、万众创新”的方针政策,旨在促进全球经济的互联互通和创新发展。在这个大环境下,Live Market积…

华为PPPOE配置实验

华为PPPOE配置实验 网络拓扑图拓扑说明电信ISP设备配置用户拨号路由器配置查看是否拨上号是否看不懂? 看不懂就对了,只是记录一下命令。至于所有原理,等想写了再写 网络拓扑图 拓扑说明 用户路由器用于模拟家用拨号路由器,该设备…

github以及上传代码处理

最近在github上传代码的时候出现了: /video_parser# git push -u origin main Username for https://github.com: gtnyxxx Password for https://gtny2010github.com: remote: Support for password authentication was removed on August 13, 2021. remote: Plea…

STM32——SPI外设总线

SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作 可…

HTTP与HTTPS的区别

面试常见问题,HTTPS优化总结易记版: 1、HSTS重定向技术:将http自动转换为https,减少301重定向 2、TLS握手优化:在TLS握手完成前客户端就提前向服务器发送数据 3、会话标识符:服务器记录下与某客户端的会…

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass,请改用适用的窗口

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass,请改用适用的窗口 解决办法如下: 只需要将引入的Interop.SpeechLib的属性嵌入互操作类型改为false 改为false 即可解决!

微服务最佳实践,零改造实现 Spring Cloud Apache Dubbo 互通

作者:孙彩荣 很遗憾,这不是一篇关于中间件理论或原理讲解的文章,没有高深晦涩的工作原理分析,文后也没有令人惊叹的工程数字统计。本文以实际项目和代码为示例,一步一步演示如何以最低成本实现 Apache Dubbo 体系与 S…

面试之ReentrantLock

一,ReentrantLock 1.ReentrantLock是什么? ReentrantLock实现了Lock接口,是一个可重入且独占式的锁,和Synchronized关键字类似,不过ReentrantLock更灵活,更强大,增加了轮询、超时、中断、公平锁…

k8s v1.27.4二进制部署记录

记录二进制部署过程 #!/bin/bash#升级内核 update_kernel() {rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgyum -y install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpmyum --disablerepo"*" --enablerepo"elrepo-kernel&q…

carla中lka实现(二)

前言: 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离,,并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上,所获得的图像的中间线极为车辆的中心。 …

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…

[HDLBits] Exams/m2014 q4d

Implement the following circuit: module top_module (input clk,input in, output out);always(posedge clk) beginout<out^in;end endmodule直接写out^in就行

前端如何安全的渲染HTML字符串?

在现代的Web 应用中&#xff0c;动态生成和渲染 HTML 字符串是很常见的需求。然而&#xff0c;不正确地渲染HTML字符串可能会导致安全漏洞&#xff0c;例如跨站脚本攻击&#xff08;XSS&#xff09;。为了确保应用的安全性&#xff0c;我们需要采取一些措施来在安全的环境下渲染…

Docker 常规软件安装

1. 总体安装步骤 1. 搜索镜像 search 2. 拉取镜像 pull 3. 查看镜像 images 4. 启动镜像 - 端口映射 run 5. 停止容器 stop 6. 移除容器 rm 2. 安装tomcat 1. 搜索 docker search tomcat 2. 拉取 docker pull tomcat 3. 查看本地镜像 docker images tomcat 4. 创建容器实…

python Requests

Requests概述 官方文档&#xff1a;http://cn.python-requests.org/zh_CN/latest/,Requests是python的HTTP的库&#xff0c;我们可以安全的使用 Requests安装 pip install Requests -i https://pypi.tuna.tsinghua.edu.cn/simple Requests的使用 Respose的属性 属性说明url响…

TCP中窗口和滑动窗口的含义以及流量控制

一.窗口 在TCP中由于要保证可靠性&#xff0c;所以每发送一条数据后&#xff0c;都需要接收方返回一条应答报文&#xff0c;要是我们每发送一条数据&#xff0c;发送方就等待接收应答报文&#xff0c;收到之后再去发送下一条数据&#xff0c;这样我们就会花费大量的时间在等待应…