Linux下的LD_PRELOAD環境變量與庫打樁

Linux下的LD_PRELOAD環境變量與庫打樁

LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫,一方面,我們可以以此功能來使用自己的或是更好的函數(比如,你可以使用Google開發的tcmalloc來提升效率),而另一方面,我們也可以向別人的程序注入程序,從而達到特定的目的。

我們下面以一個 foepn() 函數的例子來展示一下如何實現運行時庫打樁。

正常庫函數調用

首先,我們建立一個測試目錄并在該目錄下創建一個文本文件:

mkdir demo && cd demo
touch test.txt

然后,我們在測試目錄下準備一個測試程序,在其中用 foepn() 函數打開我們剛剛創建的文本文件,這個過程應該是成功的,因為我們確實有這樣一個文本文件:

// perload_test.c#include <stdio.h>int main(){printf("Calling the fopen() function \n");FILE *fd = fopen("test.txt", "r");if (!fd) {printf("fopen() returned NULL\n");return 1;}printf("fopen() suceeded\n");return 0;
}

我們編譯運行這個 preload_test.c

gcc preload_test.c -o preload_test
./preload_test
# 輸出:
# Calling the fopen() function
# fopen() suceeded

如我們所預期的,打開文件成功。

運行時庫打樁

我們首先準備我們自己想要庫打樁的函數 foepn(),在這個函數中無論怎么樣都會返回錯誤:

// myfopen.c#include <stdio.h>FILE *fopen(const char *path, const char *node) {printf("Always failing fopen in myfopen()\n");return NULL;
}

將它編譯成一個共享庫 myfopen.so

gcc -shared -fpic myfopen.c -o myfopen.so

然后將其添加到 LD_PRELOAD 環境變量:

export LD_PRELOAD=/home/song/demo/myfopem.so

現在我們在來運行一下剛才編譯的 preload 程序(無需重新編譯):

./preload
# 輸出:
# Calling the fopen() function
# Always failing fopen in myfopen()
# fopen() returned NULL

雖然目錄下確實有這個文本文件可以被打開,但是由于執行的是我們自己的 fopen() 函數,無論如何都會返回錯誤。這樣就成功地使用我們自己的 fopen() 函數完成了運行時庫打樁,在運行時,會優先執行環境變量 LD_PRELOAD 中指定的庫打樁函數。

警告:測試完之后記得 unset LD_PRELOAD,否則你會發現你什么文件也打不開了,因為系統級的 fopen() 函數已經被我們打樁替換掉了,不信的話可以在unset之前隨便vim一個文本試一下。所以,使用庫打樁機制時一定要慎重,否則可能造成不堪設想的后果。

庫打樁的應用

庫打樁機制有很多有意思的應用場景

  • 通過添加某些語句,可以追蹤自己的程序對某些庫函數的調用情況
  • 我們可以以此功能來使用自己的或是更好的函數(比如,你可以使用Google開發的tcmalloc來提升效率)
  • 可以向別人的程序注入程序,從而達到特定的目的

Ref:

https://fengmuzi2003.gitbook.io/csapp3e/di-07-zhang-lian-jie

https://www.bilibili.com/video/BV1RK4y1R7Kf?p=7

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2019年藍橋杯第一題

第一題 標題&#xff1a;組隊&#xff08;本題總分&#xff1a;5 分&#xff09; 作為籃球隊教練&#xff0c;你需要從以下名單中選出 1 號位至 5 號位各一名球員&#xff0c; 組成球隊的首發陣容。 每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位…

深度學習編譯:MLIR初步

深度學習編譯MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照實現方式大體分為兩類&#xff1a;解釋型推理引擎和編譯型推理引擎。 解釋型推理引擎 一般包含模型解析器&#xff0c;模型解釋器&#xff0c;模型優化器。 模型解析器負責讀取和解析模型文件&#xff…

深入淺出LLVM

深入淺出LLVM 轉自&#xff1a;https://www.jianshu.com/p/1367dad95445 什么是LLVM&#xff1f; LLVM項目是模塊化、可重用的編譯器以及工具鏈技術的集合。 美國計算機協會 (ACM) 將其2012 年軟件系統獎項頒給了LLVM&#xff0c;之前曾經獲得此獎項的軟件和技術包括:Java、A…

藍橋杯真題訓練 2019.2題

2019第二題 標題&#xff1a;年號字串&#xff08;本題總分&#xff1a;5 分&#xff09; 小明用字母 A 對應數字 1&#xff0c;B 對應 2&#xff0c;以此類推&#xff0c;用 Z 對應 26。對于 27 以上的數字&#xff0c;小明用兩位或更長位的字符串來對應&#xff0c;例如 AA…

一分鐘系列:什么是虛擬內存?

一分鐘系列&#xff1a;什么是虛擬內存&#xff1f; 轉自&#xff1a;https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg 注&#xff1a;一分鐘系列的篇幅都不長&#xff0c;適合吃飯蹲坑、地鐵公交上食用&#xff5e; 內存對于用戶來說就是一個字節數組&#xff0c;我們可…

藍橋杯真題訓練 2019.3題

標題&#xff1a;數列求值 &#xff08;本題總分&#xff1a;10 分&#xff09;### 給定數列 1, 1, 1, 3, 5, 9, 17, …&#xff0c;從第 4 項開始&#xff0c;每項都是前 3 項的和。求 第 20190324 項的最后 4 位數字。 【答案提交】 這是一道結果填空的題&#xff0c;你只需…

11-Kafka

1 Kafka Kafka是一個分布式流式數據平臺&#xff0c;它具有三個關鍵特性 Message System: Pub-Sub消息系統Availability & Reliability&#xff1a;以容錯及持久化的方式存儲數據記錄流Scalable & Real time 1.1 Kafka架構體系 Kafka系統中存在5個關鍵組件 Producer…

虛擬內存精粹

虛擬內存精粹 標題&#xff1a;虛擬內存精粹 作者&#xff1a;潘建鋒 原文&#xff1a;HTTPS://strikefreedom.top/memory-management–virtual-memory 導言 虛擬內存是當今計算機系統中最重要的抽象概念之一&#xff0c;它的提出是為了更加有效地管理內存并且降低內存出錯的概…

藍橋杯真題訓練 2019.4題

標題&#xff1a; 數的分解&#xff08;本題總分&#xff1a;10 分&#xff09; 【問題描述】 把 2019 分解成 3 個各不相同的正整數之和&#xff0c;并且要求每個正整數都不包 含數字 2 和 4&#xff0c;一共有多少種不同的分解方法&#xff1f; 注意交換 3 個整數的順序被視…

深度學習自動編譯和優化技術調研

深度學習自動編譯和優化技術調研 轉自&#xff1a;https://moqi.com.cn/blog/deeplearning/ 作者&#xff1a;墨奇科技全棧開發 在墨奇科技&#xff0c;我們需要將一些包含深度神經網絡&#xff08;DNN&#xff09;的 AI 算法移植到邊緣端的設備&#xff0c; 這些設備往往使用 …

三元組數據處理系統

include<stdio.h> include<stdlib.h> define OK 1 define ERROR 0 define OVERFLOW -2 typedef int Status; typedef float ElemType; typedef ElemType *Triplet; // 聲明Triplet為ElemType指針類型 //三元組的初始化 Status initTriplet(Triplet &T, E…

Copy-On-Write COW機制

Copy-On-Write COW機制 轉自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光頭才能變強 在讀《Redis設計與實現》關于哈希表擴容的時候&#xff0c;發現這么一段話&#xff1a; 執行BGSAVE命令或者BGREWRITEAOF命令的過程中&#xff0c…

實驗報告:抽象數據類型的表現和實現

實驗報告&#xff1a;抽象數據類型的表現和實現 實驗內容 基本要求&#xff1a; 設計實現抽象數據類型“三元組”&#xff0c;要求動態分配內存。每個三元組由任意三個實數的序列構成&#xff0c;基本操作包括&#xff1a;創建一個三元組&#xff0c;取三元組的任意一個分量&…

關于x86、x86_64/x64、amd64和arm64/aarch64

關于x86、x86_64/x64、amd64和arm64/aarch64 轉自&#xff1a;https://www.jianshu.com/p/2753c45af9bf 為什么叫x86和x86_64和AMD64? 為什么大家叫x86為32位系統&#xff1f; 為什么軟件版本會注明 for amd64版本&#xff0c;不是intel64呢&#xff1f; x86是指intel的開…

實驗報告: 線性表的基本操作及應用

實驗報告&#xff1a; 線性表的基本操作及應用 實驗內容 基本要求&#xff1a; &#xff08;1&#xff09;實現單鏈表的創建&#xff1b;&#xff08;2&#xff09;實現單鏈表的插入&#xff1b;&#xff08;3&#xff09;實現單鏈表的刪除 &#xff08;4&#xff09;實現單鏈…

TVM:源碼編譯安裝

TVM&#xff1a;Linux源碼編譯安裝 筆者環境&#xff1a; OS&#xff1a;Ubuntu 18.04 CMake&#xff1a;3.10.2 gcc&#xff1a;7.5.0 cuda&#xff1a;11.1 編譯安裝過程總覽 本文將簡介 tvm 的編譯安裝過程&#xff0c;包含兩個步驟&#xff1a; 通過C代碼構建共享庫設置相…

第2章線性表的基本使用及其cpp示例(第二章匯總,線性表都在這里)

2.1線性表的定義和特點 【類型定義&#xff1a; *是n個元素的有限序列 *除了第一個元素沒有直接前驅和最后一個沒有直接后驅之外&#xff0c;其余的每個元素只有一個直接前驅和直接后驅&#xff1b; &#xff08;a1,a2…an&#xff09; 【特征&#xff1a; *有窮性&#xff1…

TVM:通過Python接口(AutoTVM)來編譯和優化模型

TVM&#xff1a;通過Python接口&#xff08;AutoTVM&#xff09;來編譯和優化模型 上次我們已經介紹了如何從源碼編譯安裝 tvm&#xff0c;本文我們將介紹在本機中使用 tvm Python 接口來編譯優化模型的一個demo。 TVM 是一個深度學習編譯器框架&#xff0c;有許多不同的模塊…

TVM:在樹莓派上部署預訓練的模型

TVM&#xff1a;在樹莓派上部署預訓練的模型 之前我們已經介紹如何通過Python接口&#xff08;AutoTVM&#xff09;來編譯和優化模型。本文將介紹如何在遠程&#xff08;如本例中的樹莓派&#xff09;上部署預訓練的模型。 在設備上構建 TVM Runtime 首先我們需要再遠程設備…

2.2線性表的順序表

2.2.1線性表的順序表示和實現------順序映像 【順序存儲】在【查找時】的時間復雜度為【O(1)】&#xff0c;因為它的地址是連續的&#xff0c;只要知道首元素的地址&#xff0c;根據下標可以很快找到指定位置的元素 【插入和刪除】操作由于可能要在插入前或刪除后對元素進行移…