国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

GNUC庫(kù)----調(diào)試系統(tǒng)問(wèn)題并進(jìn)行修訂

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

  一種調(diào)試 glibc 函數(shù)的好方法是用您自己的版本覆蓋所關(guān)注的函數(shù)。在沒(méi)有 root 許可權(quán)和不必重新編譯 libc 源代碼的情況下就可以完成這個(gè)任務(wù)。想象一下編寫您自己的 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)使用您編寫的庫(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!/n");
    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ǔ)
  編寫 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)境。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 轮台县| 台安县| 明光市| 景宁| 酉阳| 宜春市| 福州市| 同德县| 汉阴县| 犍为县| 玉山县| 越西县| 阿瓦提县| 房产| 萨嘎县| 沂水县| 河北省| 金乡县| 都江堰市| 讷河市| 财经| 武汉市| 屯门区| 昔阳县| 东安县| 西宁市| 大同县| 保德县| 苏尼特右旗| 张家港市| 营口市| 柏乡县| 镇宁| 洛浦县| 大方县| 濮阳县| 玛多县| 鄯善县| 沁水县| 独山县| 开原市|