从ldd谈起 [linux演习]

实战指南:为嵌入式Linux交叉编译tcpdump与libpcap 本文提供了一份详细的实战指南,指导开发者如何为ARM架构的嵌入式Linux设备交叉编译网络抓包工具tcpdump及其依赖库libpcap。文章涵盖了从环境准备、工具链配置、源码编译到解决经典pthread链接错误的完整流程,帮助开发者掌握交叉编译的核心技巧,为嵌入式网络调试提供强大工具。 阅读详情

ldd的原理


ldd 命令可以打印出ELF Executable文件的动态链接库依赖. 
如果了解ELF文件格式, 将非常容易理解系统连接器是如何加载so文件, 并链接启动一个ELF可执行文件的.   一句话来说: ldd命令的原理就是调用系统连接器, 修改连接器依赖的环境变量, 使得ELF加载时,让链接器输出具体需要哪些so文件, 由于linux上可执行文件为ELF格式, 所以ldd命令也就仅可以输出ELF文件的so依赖关系. 其他可执行文件格式, 比如a.out格式所的连接器同ELF文件连接器不同. 所以ldd命令无法处理a.out格式; 下面摘录了man ld.so的帮助信息, 其中列出了连接器以及连接器的用途. 可以看到ELF文件的链接器为/lib/ld-linux.so.1或者/lib/ld-linux.so.2  这里的1和2对应对应libc1和libc2两个c语言库. 而a.out格式则使用/lib/ld.so作为程序启动时加载动态so文件的链接器.

       /lib/ld.so
              a.out dynamic linker/loader
       /lib/ld-linux.so.{1,2}
              ELF dynamic linker/loader
       /etc/ld.so.cache
              File containing a compiled list of directories in which to search for libraries and an ordered list of candidate libraries.
       /etc/ld.so.preload
              File containing a whitespace separated list of ELF shared libraries to be loaded before the program.
       lib*.so*
              shared libraries

正是基于以上原理, 我们其实可以非常简单的猜想到ldd命令的内部逻辑, 它只是简单校验命令行参数, 然后将参数最后传递给ld-linux.so文件, 利用链接器读取ELF文件中的so依赖关系而已. 所以在系统中ldd命令真的只是一个shell脚本, 不要惊讶于一个shell脚本有这样强大的功能, 这个脚本只是编译工具,链接工具某一个简单阶段的接口调用而已. 想真正的去了解连接器是如何工作的. 推荐各位仔细研读ELF文件格式. 明白了可读的文本最终如何被编译链接, 并加载启动的流程之后, 所有东西最终都无比明白.
顺便扯远一点:  一切知识最终都是历史, ELF文件格式也是这样. a.out提出之后, unix和DOS分裂之后, linux出现之后..gcc, gdb, 链接器..这些东西最后都植根与ELF文件格式, 这些工具一些生成ELF文件, 另外一些则读取其中一部分内容而已...二进制和操作系统的秘密都藏在ELF和ld-linux.so文件之后.
回到ldd的话题, 由于ELF展开之后实在内容太多, 我们还是专注于ldd周边工具.  与ldd命令类似的 链接器接周边工具, 还有ldconfig。

纵观ldd脚本的内容, 可以发现整个脚本除了基本参数校验之外, 唯一功能即设置变量LD_TRACE_LOADED_OBJECTS=1. 链接器工作时如果该变量有值,则输出动态跨信息。
add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
add_env="$add_env LD_VERBOSE=$verbose"
if test "$unused" = yes; then
  add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
fi

# The following use of cat is needed to make ldd work in SELinux
# environments where the executed program might not have permissions
# to write to the console/tty.  But only bash 3.x supports the pipefail
# option, and we don't bother to handle the case for older bash versions.
if set -o pipefail 2> /dev/null; then
  try_trace() {
    eval $add_env '"$@"' | cat 
  }
else
  try_trace() {
    eval $add_env '"$@"'
  }
fi

一个简单的模仿: 自己export LD_TRACE_LOADED_OBJECTS=1, 然后运行ls命令。。。



固件漏洞挖掘实战:从环境搭建到漏洞利用的完整指南 在物联网和嵌入式设备安全领域,固件作为连接硬件与操作系统的底层软件,其安全性直接决定了设备的核心防护能力。理解固件的工作原理,是进行深度安全评估的基础。固件通常存储在设备的非易失性存储器中,负责初始化硬件、加载操作系统并提供最底层的运行时服务。其技术价值在于,通过分析固件,安全研究人员可以摆脱“黑盒”测试的局限,以“白盒”视角审计设备最核心的代码逻辑,从而发现那些被上层应用封装、常规测试难以触及的深层漏洞,例如内存破坏和逻辑缺陷。这种能力在智能家居、工业控制和网络设备等应用场景中尤为重要,能够有效评估设备被 阅读详情

相关推荐

第 39 章:USB、ADB 与 MTP

Android USB 子系统划分为 4 个垂直层级:公开 SDK API(UsbManager)、系统服务(UsbService 及其子管理器)、硬件抽象层(AIDL HAL 接口 IUsb、IUsbGadget)、Linux 内核 USB 子系统(gadget 驱动、主机控制器驱动、configfs、functionfs)。

dengfuma的专栏 389

Packstack部署OpenStack常见依赖冲突:leatherman_curl.so版本不兼容分析与解决

本文详细分析了使用Packstack部署OpenStack时常见的leatherman_curl.so版本不兼容问题。当facter工具因找不到特定版本的共享库(如leatherman_curl.so.1.3.0)而报错时,会导致部署流程中断。文章深入剖析了动态链接库冲突的根源,并提供了两种核心解决方案:直接降级leatherman包至兼容版本,或通过yum版本锁定及仓库优先级调整来根治问题。同时,文中还分享了系统净化、日志分析及ldd命令排查等实用技巧,帮助用户彻底解决此类依赖冲突,确保OpenStack

weixin_29207533的博客 374

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5761

当官方文档有误时:系统化验证与排查英伟达技术栈部署问题

在软件开发和系统部署中,环境配置与依赖管理是基础且关键的环节,其原理在于确保软件组件版本兼容、系统资源可访问及配置参数正确。这一过程的技术价值在于保障应用稳定运行与性能优化,广泛应用于深度学习、高性能计算及边缘AI部署等场景。实践中,开发者常面临官方技术白皮书或指南存在疏漏的挑战,例如依赖版本描述模糊或配置命令错误,导致部署失败。本文以英伟达技术栈(如CUDA、GPU驱动)部署为例,阐述如何通过建立基础环境检查清单、执行验证式操作流程及系统性错误排查,将文档视为可能出错的路线图而非绝对真理,从而独立定位问题

weixin_30791095的博客 350

Linux线程从入门到实战

本文深入讲解了Linux多线程编程的核心概念与实践。主要内容包括: 线程本质:Linux内核中没有真正的线程概念,而是通过轻量级进程(LWP)模拟实现,所有执行流在内核中都是task_struct。 进程与线程关系: 进程是资源分配的基本单位 线程是调度的基本单位 线程共享进程地址空间,但拥有独立栈和寄存器 线程特性: 创建代价比进程小 线程异常会导致整个进程崩溃 具备私有数据(线程ID、栈等)和共享资源(文件描述符等) 线程控制:介绍了pthread库的常用接口,包括线程创建、终止和等待等操作。 线程安全

2401_88654727的博客 561

Linux编译环境配置:解决configure: error: C compiler cannot create executables

Linux系统上进行软件编译时,开发环境配置是基础且关键的环节。编译工具链的完整性直接决定了源码能否成功构建为可执行程序,其核心原理在于编译器、链接器、标准库头文件等组件的协同工作。一个配置完善的编译环境对于软件开发和系统运维具有重要价值,它确保了从源码到二进制产物的可靠转换。在实际应用场景中,特别是在新部署的服务器或最小化安装的系统上,开发人员常会遇到因工具链缺失或环境变量配置不当导致的编译失败问题。例如,当执行./configure脚本时出现“C compiler cannot create exec

weixin_30920597的博客 380

OneGadget跨平台部署指南:从Ruby环境到漏洞利用的完整配置

在二进制安全研究和漏洞利用领域,自动化工具链的部署是高效工作的基础。理解工具依赖的原理,特别是跨平台环境配置,是每位安全研究员和CTF选手的必备技能。Ruby作为一门动态语言,其Gem包管理机制和本地扩展编译依赖特定的开发库和工具链,这直接关系到工具能否成功运行。通过系统包管理器、RVM或rbenv等版本管理工具,可以灵活搭建满足不同版本需求的Ruby环境,从而确保像OneGadget这样的关键工具稳定运行。OneGadget的核心价值在于自动化搜索libc中的‘一击必杀’gadget,极大简化了ROP链的

weixin_30896825的博客 310

OpenClaw浏览器启动失败全攻略:从环境搭建到深度排错

浏览器自动化是Web开发和测试中的基础技术,其核心原理是通过驱动(如ChromeDriver)与浏览器内核建立通信,实现对网页的模拟操作。这项技术的价值在于能够替代重复性人工操作,实现流程自动化,广泛应用于数据抓取、UI测试、表单填写等场景。在实际工程实践中,环境配置和依赖管理是决定自动化脚本能否稳定运行的关键。本文聚焦于OpenClaw智能体在启动浏览器时遇到的“静默挂起”问题,深入剖析了因**Docker容器**内资源限制和**ChromeDriver**版本不匹配等常见热词问题导致的启动失败,并提供了

weixin_34234829的博客 379

基于Qt+FFmpeg+OpenCV+Demucs构建智能视频播放器:实现AI分析与音频分离

音视频处理是现代多媒体应用的核心技术,其基本原理涉及对编码后的媒体流进行解复用、解码,最终渲染为可感知的视听内容。传统播放器主要解决播放功能,而随着人工智能技术的发展,计算机视觉和音频AI模型为音视频处理带来了新的技术价值。通过集成人脸检测、物体识别等视觉分析,以及音乐源分离等音频处理能力,播放器可以从被动播放升级为具备实时分析与内容理解能力的智能终端。这一融合方案在视频监控、内容审核、辅助创作、娱乐互动等场景有广泛应用。本文以Qt、FFmpeg、OpenCV和Demucs为核心,详细介绍了如何构建一个支持

weixin_33701617的博客 366

Netcat完整教程

总的来说,nc的核心在于其灵活的双向数据传输能力。无论是调试网络服务、传输文件,还是进行安全测试,它都能提供简洁而强大的解决方案。

编写博客,学习交流 165

飞凌嵌入式ElfBoard-Shell常用工具和命令-sleep命令

sleep命令在Linux中用于创建一个虚拟的工作,这个工作可以帮助我们延迟执行。它默认以秒为单位接受时间,但是也可以通过在末尾添加一个小后缀(s, m, h, d)来将其转换为任何其他格式。当用户在 Linux 中发出多个命令序列时,命令会立即一个接一个或同时执行(例如,tee 命令)。但是,有时需要推迟命令的执行并为系统提供足够的时间来产生预期的结果。其中sleep后面的时间可以根据实际情况来改变,1就是间隔1s,改的数字越小,进度条越快,反之越慢。sleep命令主要接受一个参数,即延迟的时间。

2301_76587520的博客 189

飞凌嵌入式ElfBoard-函数

shell中的函数定义比较简单,定义函数名可以没有类型,函数返回值可有可无,如果有返回值,必须返回整数n(0~255)。同时,函数的定义必须放在shell脚本的开头部分,只有函数被shell解释器发现后,才能发调用。function 函数名()

2301_76587520的博客 161

应急响应练习靶机1-web1

去web的服务找log日志,因为用的小P所以在Apache或者Nginx去找日志文件。利用在线工具也好,用uncompyle6也可以。使用:uncompyle6 你的.pyc > 命名要导出的文件.py。之前找的黑客账户,找这个账户去看他的桌面即可。4.攻击者挖矿程序的矿池域名。4.攻击者挖矿程序的矿池域名。1.攻击者的shell密码。1.攻击者的shell密码。命令没办法找到隐藏的用户。3.攻击者的隐藏账户名称。3.攻击者的隐藏账户名称。2.攻击者的IP地址。2.攻击者的IP地址。

2202_75858632的博客 237

Linux 提权

SUID(Set User ID)是一种特殊权限。设置了 SUID 的程序,在用户执行时,会以该程序属主的权限运行。古代皇帝给将军的虎符——手持虎符就能调用千军万马,即使你本人只是一个普通士兵。例如,ping命令需要 root 权限才能打开网络套接字,但普通用户也能 ping。这就是因为被设置了 SUID,所有执行 ping 的用户都暂时拥有 root 的权限。

2503_94807485的博客 531

linux提权/shadow可读写提权/passwd可写提权

反弹 Shell(Reverse Shell)是一种反向连接的命令交互通道。常规 Shell 是攻击机主动连接目标服务器(正向 Shell);反弹 Shell 是被攻击的 Linux 服务器主动向外连接攻击机,主动把命令行控制权 “弹” 给攻击者。

2303_82039857的博客 183

【二】:Shell和权限

内容是关于Shell基础概念、用户切换su、sudo、权限等。摘要需要简洁,涵盖主要知识点。注意字数。我们将提炼关键点:Shell定义、bash、命令执行、su/sudo、权限角色和操作。写一段不超过150字的中文摘要。</think>Shell是命令行解释器,充当用户与内核的桥梁,并过滤非法操作。bash是CentOS7的默认Shell实现。命令通过子进程执行,找不到程序时报command not found。su用于切换用户,sudo可临时提权

ws262的博客 193

RK3588修改串口默认波特率等参数

RK3588的ttyS*串口默认波特率为9600,如果要改为其他波特率,比如115200,可按如下方式修改代码://9600;修改后开机进入shell下通过stty命令查看波特率:

u011774634的博客 169

CVE 复现方法论——从公告到本地靶环境的完整流程

本文将以"五阶段方法论"为主线——信息收集 → 漏洞验证与限制因素分析 → 靶环境搭建 → PoC 执行与调试 → 报告输出与知识沉淀——把每个阶段的实操动作、常用工具、判断标准、常见坑全部拆开讲。文中会以 Log4Shell(CVE-2021-44228)、Struts2 S2-045(CVE-2017-5638)、Tomcat PUT(CVE-2017-12615)等经典 CVE 作为案例锚点,但重点始终是方法论本身——学完之后,你拿到任何一个新 CVE,都应该知道下一步该做什么。

数据知道的博客 489

Linux Shell 编程入门:脚本规范、变量详解、数值计算、条件判断【上篇】

简单地说,变量名是用一个固定的字符串代替更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其他的内容。变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。字母数字下划线注意: 变量名不能以数字开头。shell中变量的类型,一般不需要明确指明。变量的赋值方式为:先写变量名称,紧接着是= 这个字符,最后是值,中间无任何空格(如:username=liulele )。通过 echo 命令加上 $username 即可输出 username 变量的值。

qq_52580914的博客 296

JMeter 中实现 100 个用户在 3 秒内并发登录

通过以上配置,你可以在 JMeter 中实现 100 个用户在 3 秒内并发登录

十年软测衍究员|10年+实战+质控负责人 1653

李丰黄金K线理论(图文版).pdf

李丰黄金K线理论(图文版).pdf

上一篇: ls命令的实现和原理 [linux演习]
loadingvx
博客等级 码龄19年 1粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值