llvm學(xué)習(xí)日記十五:符號重命名

一、目的:

分析 LLVM 自帶的符號重寫Pass

二迹栓、分析執(zhí)行流程:

  • LLVM原生的文件
    lib/Transforms/Utils/SymbolRewriter.cpp
  1. 入口首先有 RewriteSymbolPass 類對象創(chuàng)建,該構(gòu)造函數(shù)內(nèi)首先解析輸入的map文件好港;


    image.png
  2. 一路跟蹤 parse 函數(shù)灿巧,可以看到解析文件內(nèi)容边酒;


    image.png
  3. 讀取內(nèi)容將對象指針存儲到容器中:
    ExplicitRewriteFunctionDescriptor 表示顯示名稱替換,就是全名替換挟憔;
    PatternRewriteFunctionDescriptor 表示正則名稱替換憎妙;


    image.png
  4. 文件解析完后库正,進(jìn)入 runOnModule 開始執(zhí)行;


    image.png
  5. 循環(huán)list對象 Descriptors 厘唾,棧結(jié)構(gòu)褥符;


    image.png
  6. 符號替換,看起來并不復(fù)雜抚垃,核心邏輯使用setName將source替換為Target:
    Comdat組件被 rewriteComdat 提前處理喷楣,老實(shí)說,Comdat 的來源和作用并不是很理解鹤树,官網(wǎng)以及一些網(wǎng)站的解釋還是不懂铣焊,有大佬可以留言解釋一下。QAQ


    image.png
  7. 兩個命令行參數(shù):

static cl::list<std::string> RewriteMapFiles("rewrite-map-file",
                                             cl::desc("Symbol Rewrite Map"),
                                             cl::value_desc("filename"),
                                             cl::Hidden);
INITIALIZE_PASS(RewriteSymbolsLegacyPass, "rewrite-symbols", "Rewrite Symbols",
                false, false)

rewrite-map-file 需要跟一個yaml格式的文件罕伯,顯示指明了需要重命名的符號

三曲伊、調(diào)試運(yùn)行:

  1. 在xcode中可以直接使用opt調(diào)試,命令行參數(shù)如下:


    image.png
  2. 我這里使用llvm自帶的例子追他,參數(shù)輸入ll文件和map文件坟募,map文件的格式在cpp文件里有注釋解釋:

// Currently, the following descriptor types are supported:
//
// - function:          (function rewriting)
//      + Source        (original name of the function)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
//      + Naked         (boolean, whether the function is undecorated)
// - global variable:   (external linkage global variable rewriting)
//      + Source        (original name of externally visible variable)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
// - global alias:      (global alias rewriting)
//      + Source        (original name of the aliased name)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
  1. 查看生成的IR:
    可以看到map文件配置的函數(shù)名都被更改了,


    image.png

四邑狸、示例懈糯,自己寫一個測試下:

  • c文件:
#include <stdio.h>

int a = 100;

static int add(int x, int y)
{
    return x + y;
}

int sub(int x, int y)
{
    return x - y;
}

int main()
{
    printf("%d\n", add(3, 4));
    printf("%d\n", sub(5, 4));
    printf("%d\n", a);
    return 0;
}
  • 生成IR:
    clang -c test_symbolobf.c -o test_symbolobf.ll -emit-llvm -S

  • 配置yaml文件:


    image.png
  • 使用opt:
    ../bin/opt -rewrite-symbols -rewrite-map-file /xxx/test_symbolobf/test_symbolobf_map.yaml /xxx/test_symbolobf/test_symbolobf.ll -o /xxx/test_symbolobf/test_symbolobf.ll.bc

  • bc to ll:
    llvm-dis /xxx/test_symbolobf/test_symbolobf.ll.bc

  • 查看新生成IR,正常:


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末单雾,一起剝皮案震驚了整個濱河市赚哗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硅堆,老刑警劉巖屿储,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渐逃,居然都是意外死亡扩所,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門朴乖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人助赞,你說我怎么就攤上這事买羞。” “怎么了雹食?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵畜普,是天一觀的道長。 經(jīng)常有香客問我群叶,道長吃挑,這世上最難降的妖魔是什么钝荡? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舶衬,結(jié)果婚禮上埠通,老公的妹妹穿的比我還像新娘。我一直安慰自己逛犹,他們只是感情好端辱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虽画,像睡著了一般舞蔽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上码撰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天渗柿,我揣著相機(jī)與錄音,去河邊找鬼脖岛。 笑死朵栖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸡岗。 我是一名探鬼主播混槐,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轩性!你這毒婦竟也來了声登?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揣苏,失蹤者是張志新(化名)和其女友劉穎悯嗓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卸察,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脯厨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坑质。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片合武。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涡扼,靈堂內(nèi)的尸體忽然破棺而出稼跳,到底是詐尸還是另有隱情,我是刑警寧澤吃沪,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布汤善,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏红淡。R本人自食惡果不足惜不狮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望在旱。 院中可真熱鬧摇零,春花似錦、人聲如沸颈渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俊嗽。三九已至雾家,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍豁,已是汗流浹背芯咧。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竹揍,地道東北人敬飒。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像芬位,于是被迫代替她去往敵國和親无拗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容