麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

覆蓋GNU C庫(kù)

2019-11-17 05:14:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  2002 年 4 月
一種調(diào)試 glibc 函數(shù)的好方法是用您自己的版本覆蓋所關(guān)注的函數(shù)。在沒(méi)有 root 許可權(quán)和不必重新編譯 libc 源代碼的情況下就可以完成這個(gè)任務(wù)。想象一下編寫(xiě)您自己的 open() 版本該有多激動(dòng)啊!

假如您沒(méi)有應(yīng)用程序的源代碼并且由于 C 的 GNU 庫(kù)(glibc)函數(shù)正將某些錯(cuò)誤信息返回給該應(yīng)用程序而使它失敗,那么您該怎么辦? 因?yàn)?glibc 是開(kāi)放源碼,所以您當(dāng)然可以獲得其源代碼、對(duì)它進(jìn)行更改、重新構(gòu)建和安裝。 然而,這不適合那些膽怯的人,因?yàn)殡m然 API 有很好的文檔說(shuō)明,但 GNU C 庫(kù)的內(nèi)部組織卻沒(méi)有。 查找正確的函數(shù)原型只是眾多挑戰(zhàn)中的第一個(gè)。 它還是一個(gè)很大的包,所以第一次編譯時(shí),它將花一些時(shí)間(glibc 2.2.2 有 8552 個(gè)文件和 1775440 行代碼,包括注釋)。

更好的方法
比重新構(gòu)建 glibc 更好的方法是選擇性地覆蓋一個(gè)函數(shù)。許多現(xiàn)代的 Unix 都支持預(yù)裝入用戶定義庫(kù)這一概念。 這些庫(kù)可以是完整的替代(即,glibc 的專用版本)也可以是子集 — 甚至是一個(gè)函數(shù)。 首先,通過(guò)設(shè)置 LD_LIBRARY_PATH 來(lái)包含庫(kù)的專用版本,您可以使用 glibc 的專用 版本。可通過(guò)使用 LD_PRELOAD 環(huán)境值來(lái)使用您編寫(xiě)的庫(kù)例程的子集。LD_LIBRARY_PATH 和 LD_PRELOAD 都是由動(dòng)態(tài) ELF 鏈接器/裝入器控制的。 它使用第一個(gè)匹配來(lái)滿足任何符號(hào)名。通過(guò)預(yù)裝入您自己的庫(kù)或函數(shù)版本,您“短路”了正常路徑,這樣就答應(yīng)您覆蓋它。

這里是一個(gè)示例 makefile,它覆蓋 glibc 函數(shù) setresgid():
覆蓋 setresgid() 的 Makefile


#
# Makefile
#

all: libs setresgid-tester

#
# Make a shared Library
#
libs: libfuncs.c
gcc -shared -Wl,-soname,libfuncs.so.1 -o libfuncs.so.1.0 libfuncs.c
ln -s libfuncs.so.1.0 libfuncs.so.1
ln -s libfuncs.so.1 libfuncs.so

#
# Here is a program that calls setresgid() for testing
#
setresgid-tester: setresgid-tester.c
gcc -o setresgid-tester setresgid-tester.c

文件 libfuncs.c 包含我的 setresgid() 專用版本。 實(shí)現(xiàn)它以支持與原始 setresgid() 相同的參數(shù)數(shù)目時(shí)要小心,并在其它方面完成與原始 setresgid() 相同的操作,盡管我的版本欺騙該應(yīng)用程序并始終返回 0。

關(guān)注的第二個(gè)文件是 setresgid-tester.c。它通過(guò)調(diào)用 setresgid() 試驗(yàn)新函數(shù)。

這是動(dòng)態(tài)庫(kù)的源代碼:
替換庫(kù)


/*
Put all the functions you want to override here
*/
#include
#include
#include

int errno;

int
setresgid(rgid, egid, sgid)
gid_t rgid,egid,sgid;
{
errno=1;
printf("It me the shim, Hi there!
");
return(0);

}

您還需要一個(gè)簡(jiǎn)單方法來(lái)測(cè)試您的 setresgid() 專用版本。可以使用 strace 或 ltrace 來(lái)監(jiān)視進(jìn)程運(yùn)行。這是普通測(cè)試示例的源代碼:
普通測(cè)試示例


/*
setresgid() system/library call tester
*/
#include
#include
main(){
setresgid(0,0,0);
}

現(xiàn)在,編譯該庫(kù),設(shè)置 LD_PRELOAD shell 變量,然后運(yùn)行測(cè)試應(yīng)用程序。您可能還需要設(shè)置 LD_LIBRARY_PATH。
運(yùn)行測(cè)試應(yīng)用程序


eXPort LD_PRELOAD=libfuncs.so
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./setresgid-tester
It's me the shim, Hi there!

還可以通過(guò)使用 ldd 列出動(dòng)態(tài)鏈接庫(kù)來(lái)確認(rèn)是否正在使用專用庫(kù):
確認(rèn)專用庫(kù)的使用


[jay@prion ld_preload]$ ldd setresgid-tester
libfuncs.so => libfuncs.so (0x40018000)
libc.so.6 => /lib/libc.so.6 (0x40022000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


結(jié)束語(yǔ)
編寫(xiě) GNU C 庫(kù)函數(shù)的專用版本是調(diào)試系統(tǒng)問(wèn)題或進(jìn)行快速修正的好方法。 使用 LD_PRELOAD shell 變量,可以選擇性地用您自己的專用版本來(lái)覆蓋系 統(tǒng) C 庫(kù)函數(shù)。這種技術(shù)可用于 linux 和 Solaris 環(huán)境。
關(guān)于作者
Jay Allen 是 IBM linux for Service Providers Lab(LSPL)的程序員。可以通過(guò) [email protected] 與 Jay 聯(lián)系。


到頁(yè)首
您對(duì)這篇文章的看法如何?
真棒!(5) 好文章 (4) 一般;尚可 (3) 需提高 (2) 太差! (1)

意見(jiàn)?


(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 2001, All Right Reserved
關(guān)于 IBM 隱私條約 法律條款 聯(lián)系 IBM

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 18欧美性xxxx极品hd | 国产精选久久久 | 中文字幕在线观看成人 | 在线观看国产一区二区三区 | 欧美性生活免费视频 | 一级电影免费看 | 免费观看一区 | 国产精品成人一区二区三区电影毛片 | 成人三级视频网站 | 在线看一区二区三区 | 91精品国产毛片 | 在线观看免费污视频 | 久久久久久久久久综合 | 视频一区二区视频 | 国产精品jk白丝蜜臀av软件 | 欧美成人一二三区 | 成人福利电影在线观看 | 国产精品视频在线观看免费 | 成片免费观看视频大全 | 一级黄色av电影 | 欧美一级美国一级 | 欧美精品免费一区二区三区 | 中文字幕精品一二三四五六七八 | 国内久久久久 | 九色免费视频 | 泰剧19禁啪啪无遮挡大尺度 | 中文字幕免费一区 | 日日草视频 | 欧美18—19sex性hd | 黄色片网站免费在线观看 | 精品一区二区三区在线观看视频 | 久久久久久久一区二区三区 | 成人午夜免费看 | 91精品国产乱码久久久久久久久 | 日本在线播放一区二区三区 | 国产精品一 | 国产成人免费精品 | 国产精品久久久久久久hd | 国产成人77亚洲精品www | 久久精品中文字幕 | 一级一级一级毛片 |