linux中环境变量LD_PRELOAD是怎样工作的?

从一次恼人的编译错误到搞懂Linux动态库加载机制:LD_PRELOAD、ld.so与共享对象 本文深入探讨了Linux动态库加载机制,特别是LD_PRELOAD和ld.so的工作原理。通过分析常见的编译错误和动态库问题,提供了实用的调试技巧和最佳实践,帮助开发者更好地理解和解决共享对象加载问题。 阅读详情

A Simple LD_PRELOAD Tutorial

有的时候为了研究需要,我们需要重载C的标准库函数,比如printf,fopen等等,这篇文章介绍如何利用LD_PRELOAD这个环境变量实现这个目标。

首先由一个简单的C程序开始。(prog.c)

 

#include <stdio.h>

int main(void) {
    printf("Calling the fopen() function...\n");

    FILE *fd = fopen("test.txt","r");
    if (!fd) {
        printf("fopen() returned NULL\n");
        return 1;
    }

    printf("fopen() succeeded\n");

    return 0;
}


这段程序简单地调用了fopen函数并检查返回值。

下面编译执行以下

$ ls
prog.c  test.txt

$ gcc prog.c -o prog

$ ls
prog  prog.c  test.txt

$ ./prog
Calling the fopen() function...
fopen() succeeded

可以看到调用标准库函数成功。

然后我们编写自己的fopen替代libc库函数中的fopen

#include <stdio.h>

FILE *fopen(const char *path, const char *mode) {
    printf("Always failing fopen\n");
    return NULL;
}


并且编译成共享库。

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c
Now we can simply modify LD_PRELOAD:

$ LD_PRELOAD=./myfopen.so ./prog
Calling the fopen() function...
Always failing fopen
fopen() returned NULL


可以看到,调用失败,因为我们的共享库返回null。

总结

我们如果需要调试或者使用我们自己的函数来代替libc库或者其他库的函数时,这个方法是可行的。

 

Linux动态链接器环境变量:LD_PRELOAD、LD_LIBRARY_PATH与LD_DEBUG详解 动态链接是Linux程序运行的核心机制,它允许程序在运行时加载共享库,实现代码复用和模块化。其原理在于通过动态链接器解析符号引用,将程序与库函数在内存中绑定。这一技术极大地提升了系统资源利用率和软件维护效率,在软件部署、性能优化和安全分析等场景中不可或缺。理解动态链接的关键在于掌握其环境变量控制机制,其中LD_PRELOAD和LD_LIBRARY_PATH是调整库加载行为的核心工具。LD_PRELOAD允许优先加载指定库,常用于函数劫持和调试;而LD_LIBRARY_PATH则扩展了库的搜索路径,解决依赖问 阅读详情

相关推荐

别再被LD_PRELOAD报错烦死了!手把手教你排查Ubuntu/CentOS动态库加载问题

本文详细解析了Linux系统中LD_PRELOAD报错的根源与解决方案,从快速排查到系统级修复,涵盖动态库加载机制、环境变量溯源、文件系统检查及高级调试技巧。帮助开发者彻底解决`ld.so: object cannot be preloaded`问题,提升系统安全性和稳定性。

weixin_42546392的博客 226

深入分析 LD_PRELOAD

是 系统的一个环境变量,它影响程序的运行时的链接(Runtime linker),它允许在程序运行前定义优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。1、程序的链接程序的链接可以分为以下三种静态链接库,在 Linux 下文件名后缀为 ,如 。在编译链接时直接将目标代码加入可执行程序。动态链接库,在 Linux 下是 文件,在编译链接时只需要记录需要链接的号,运行程序时才会进行

布袋和尚 1万+

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

系统启动 之 Linux系统启动概述(1)

随着智能终端功能的越来越庞大,与之,硬件配置越来越高,开机时间却越来越长。人们在享受强大功能的同时,对冗长的智能终端的开机时间却越来越缺乏耐心。 为了“取悦”用户,需要提供较好的用户体验,那么就必须使得智能终端尽可能短的进入“可工作”状态。 本文中的“尽可能短的开机时间”,“开机优化”、“开机时间优化”均表示同一个意思。 如果计划对linu...

weixin_30566063的博客 212

PD虚拟机网络初始化失败的权限修复指南

本文针对Parallels Desktop虚拟机常见的“网络初始化失败”问题,提供了详细的权限修复指南。通过分析问题根源,指导用户安全备份并修改关键的`network.desktop.xml`和`dispatcher.desktop.xml`配置文件,以恢复PD虚拟机的网络连接。文章还包含了修复后的验证步骤及预防措施,帮助用户彻底解决并避免此类权限问题。

qqq44的博客 851

LobeHub开源AI应用平台:从部署到定制的全栈实践指南

在现代AI应用开发领域,大语言模型(LLM)的集成与部署是核心技术挑战之一。其原理在于通过API或本地化部署,将预训练模型的强大能力封装为可调用的服务。这项技术的核心价值在于极大地降低了AI应用的开发门槛,使开发者能够快速构建智能对话、内容生成等场景的应用。随着模型即服务(MaaS)模式的普及,一个关键痛点是如何高效地管理多模型、设计友好的用户界面并实现功能扩展。这正是开源项目LobeHub所聚焦的领域,它通过提供可插拔的架构和配置驱动的低代码理念,解决了AI能力落地的“最后一公里”问题。本文将结合Dock

weixin_27210125的博客 753

soc eds能 编译linux,在SoCEDS环境下编译和更新preloader和uboot程序的方法

在SoCEDS环境下编译和更新preloader和uboot程序的方法前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloader和uboot程序!以及如何去更新BOOT SD卡中的preloader和uboot!从Terasic网站下下载的SD image是在13.1环境下编译出来的preloader和u-boot,这里会在14....

weixin_29962351的博客 567

50、压电微泵与技术设备驱动的研究分析

本文研究了压电微泵在弹性微通道中的流体流动特性及技术设备驱动的振动行为。通过建立轴对称流固耦合模型,利用FreeFem++进行数值模拟,分析了不同数量压电致动器和频率对微泵流量的影响,发现多个致动器按特定时序压缩可产生净正向流量,并提出了稳态流量的近似解析公式。同时,针对技术设备驱动系统,探讨了周期性负载引起的强迫振动特性,明确了共振条件及影响因素,并比较了主动、被动和优化设计等振动控制策略。最后展望了实验验证、多物理场耦合与智能控制等未来研究方向,为相关设备的优化设计与高效运行提供了理论支持。

convnet3designer的博客 148

ctfhub-web进阶-[LD_PRELOAD]

ctfhub-web进阶-[LD_PRELOAD] 题目描述: 目标:获取服务器上 /flag 文件中的 flag。需要了解 Linux LD_PRELOAD 环境变量。 CTFHub Bypass disable_function —— LD_PRELOAD 本环境来源于AntSword-Labs <!DOCTYPE html> <html> <head> <title>CTFHub Bypass disable_function —— LD_

o3Ev的博客 2241

智能解译城市进程:遥感影像建筑物提取研究全景与前沿进展(数据集及代码)

随着全球城市化进程的加速,高效、精准地监测城市建筑物分布对城市规划、灾害评估、人口估算及智慧城市建设具有重要意义。传统的人工测绘方法耗时费力,难以满足大范围、动态更新的需求。而遥感影像建筑物提取技术,借助深度学习与计算机视觉,能够自动化识别并提取建筑物轮廓,极大地提升了城市信息获取的效率和精度。首先,建筑物提取是遥感影像解译的核心任务之一。

hanfeng5268的博客 591

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

【程序狂魔】掌握LD_PRELOAD轻松进行程序修改和优化的绝佳方法!

LD_PRELOAD是Linux/Unix系统的一个环境变量,它可以影响程序的运行时的链接,它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖系统的函数库。LD_PRELOAD 超脱于动态链接库的搜索路径先后顺序之外,它可以指定在程序运行前优先加载的动态链接库。我们可以自己实现一个函数,底层调用系统调用,理由LD_PRELOAD优先加载我们的函数。

Lion_Long的博客 5628

VS Code 重大更新:Agent Skills完美支持!

代码不会骗人,但你的 LLM 可能会编个故事——除非你给它一本《技能手册》。——某位深夜调试成功的 Go 工程师。

weixin_44058951的博客 3459

LD_PRELOAD函数劫持

LD_PRELOAD函数劫持 2.3. LD_PRELOAD使用限制这种方式虽然很酷,但却有一些限制。比如对于静态编译的程序是无效的。因为静态编译的程序不需要连接动态库的面的函数。而且,假如文件的SUID或SGID位被置1,加载的时候会忽略LD_PRELOAD(这是ld的开发者出于安全考虑做的)。 三.相关的隐匿技术 3.1 Jynx-K...

WenCoo的博客 3181

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux动态链接器三剑客:LD_PRELOAD、LD_LIBRARY_PATH与LD_DEBUG实战解析

在Linux系统编程和C/C++开发中,动态链接器(ld.so)是程序运行的核心组件,负责在运行时加载和链接共享库。其工作原理涉及符号解析、库搜索路径和运行时绑定等关键技术。理解这些机制对于解决复杂的运行时问题、进行性能优化和系统调试具有重要价值。通过环境变量,开发者可以干预动态链接器的默认行为,实现高级调试和定制化功能。例如,LD_PRELOAD允许预加载共享库以覆盖函数实现,常用于内存调试和性能分析;LD_LIBRARY_PATH可临时修改库搜索路径,便于测试不同版本的依赖库;而LD_DEBUG则能输出

weixin_33563728的博客 217

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

linux命令alien_追溯 Linux 上的库注入

库注入在 Linux 上不如 Windows 上常见,但它仍然是一个问题。下来看看它们如何工作的,以及如何鉴别它们。-- Sandra Henry-stocker(作者)库注入(Library injections)在 Linux 上不如 Windows 上常见,但它仍然是一个问题。下来看看它们如何工作的,以及如何鉴别它们。尽管在 Linux 系统上几乎见不到,但库(Linux 上的共享目标文件)...

weixin_31368913的博客 289

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

man ld.so 的翻译

动态库加载器可以通过运行一些动态链接的程序来间接调用(在这种情况中,不需要向动态库加载器指定任何命令行参数,对于 ELF 文件,动态库链接器的路径存储在将被执行的程序的 .interp section 中)或直接通过 /lib/ld-linux-so.* xx 来调用。 ld.so 与 ld-linux.so* 查找并加载程序依赖的动态库,为程序正常运行准备动态库环境,然后再运行程序。 Linux 中的二进制程序默认都是动态链接的,除非在编译时向 ld 命令指定 -static 选项。 ld.so 处理 a

龙瑜的博客 798

[seed-labs] 环境变量与 Set-UID 实验

软件安全实验四:环境变量与Set-UID实验

[热爱分享]希望大家都能花时间在学习自己喜欢的东西上 2803

动态链接器劫持:从LD_PRELOAD到ld.so.preload的Linux用户态Rootkit剖析

动态链接与加载是Linux用户态程序运行的核心机制,负责在程序启动时将可执行文件与其依赖的共享库(如glibc)连接起来。其工作原理是通过解析ELF文件格式中的动态段,加载所需的共享对象,并完成符号解析和重定位,最终将控制权移交程序的入口点。这项技术的价值在于支撑了现代操作系统的模块化与资源共享,是几乎所有动态链接程序(如bash、sshd)正常运行的基础。然而,攻击者正利用其底层性和普遍性,通过劫持动态链接过程,实现用户态Rootkit的隐秘植入。具体应用场景包括:通过LD_PRELOAD环境变量进行进程

cishan3804的博客 367

PHP安全实战:如何用LD_PRELOAD绕过disable_functions执行系统命令(附详细步骤)

本文深入剖析了利用LD_PRELOAD环境变量机制绕过PHP disable_functions限制的技术原理与实战步骤。通过劫持系统函数并借助mail()等函数启动新进程,攻击者可在特定条件下执行系统命令。文章详细介绍了从编写恶意动态链接库到构建完整PHP利用脚本的完整链条,并探讨了相应的防御与检测策略。

u8v9w0x1y的博客 515

linux手动注入网络数据_追溯 Linux 上的库注入

库注入在 Linux 上不如 Windows 上常见,但它仍然是一个问题。下来看看它们如何工作的,以及如何鉴别它们。-- Sandra Henry-stocker库注入Library injections在 Linux 上不如 Windows 上常见,但它仍然是一个问题。下来看看它们如何工作的,以及如何鉴别它们。尽管在 Linux 系统上几乎见不到,但库(Linux 上的共享目标文件)注入仍是一个...

weixin_35501172的博客 258

Linux中LD_PRELOAD工作原理及使用示例

LD_PRELOAD是 Linux 系统中的一个环境变量,它允许你在程序运行前指定要优先加载的动态链接库(.so 文件)。这个机制是动态链接器(ld-linux.so)提供的功能。大多数C程序使用printf输出时都会被hook到。LD_PRELOAD是一个强大的工具,可以在不修改程序的情况下改变其行为。通过hookprintf监控程序输出添加调试信息修改输出格式实现日志增强这种技术在调试、性能分析、安全审计等场景中非常有用。

千里之行,始于足下 1191

LD_PRELOAD劫持

有趣的 LD_PRELOAD

weixin_63231007的博客 3797

LD_PRELOAD环境变量详解

由于预加载库被最先加载,其中定义的函数会"覆盖"或"拦截"其后所有库(包括标准 C 库。

zhaominyong的专栏 441
上一篇: 常见C内存管理程序
下一篇: Configure,Makefile.am, Makefile.in, Makefile文件之...
朱乐乐在路上
博客等级 码龄17年 77粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值