亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1391 | 回復(fù): 0
打印 上一主題 下一主題

linux elf文件格式學(xué)習心得 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-09-18 14:39 |只看該作者 |倒序瀏覽
最近在做下載模塊,遇到一個問題,需要把待下載的文件信息(文件名,文件類型等)帶在文件中用于下載傳輸時解析。
具體詳細設(shè)計不在這里講了,我只把遇到的問題貼下來。有2種解決方案:
1. 寫一個fileConf文件記錄所有的信息,用mktail工具把下載文件和fileconf文件合并在一起。下載到目標機上之后把fileconf解析出來。
2. linux可執(zhí)行文件和*.so文件是linux elf文件,需要編譯的時候把appInfo編譯到elf的section中。

以上2種方法各有好處,基于應(yīng)用的考慮,我們選擇更好的第二種但是這樣就需要解析elf文件。elf文件的格式不在此壘述,網(wǎng)上有很多文章,我把我的實驗過程記錄了下來:
1. 編輯一個test.c文件:

#include

int helloworld()
{
    printf("hello world\n");
    return 0;
}

int main()
{
    helloworld();
    return 0;
}

2. make編譯生成elf可執(zhí)行文件test

3. #arm-linux-readelf -a test > a.txt
   a.txt中就可以直觀的查看test這個elf文件的格式

4. #arm-linux-objdump -d test
   把elf文件用反匯編查看其運行的匯編代碼,其中:
   0000837c :
    837c:       e92d4800        push    {fp, lr}
    8380:       e28db004        add     fp, sp, #4      ; 0x4
    8384:       e59f0014        ldr     r0, [pc, #20]   ; 83a0
    8388:       ebffffcb        bl      82bc
    838c:       e3a03000        mov     r3, #0  ; 0x0
    8390:       e1a00003        mov     r0, r3
    8394:       e24bd004        sub     sp, fp, #4      ; 0x4
    8398:       e8bd4800        pop     {fp, lr}
    839c:       e12fff1e        bx      lr
    83a0:       0000844c        .word   0x0000844c

就是int helloworld()的反匯編出來的指令。
我們看到83a0:這行, 這行提供了word存放的地址,也就是hello world這條打印語句存放的地址是44c

5. 用二進制編輯器打開test,查找到地址0x0000044c剛好存放的就是hello world打印語句。

因此我們可以通過這樣的方式把信息存為一條打印語句,且也能被解析出來。

如果在文件中加入全局變量,如:char *pString="abcdefghi";
那么abcdefghi是存放在.rodata這個section里面的,也可以找到其對應(yīng)的地址,并查看解析。

我們也可以自己添加一個section,方法在這篇博客中:
http://www.lupaworld.com/?uid-151392-action-viewspace-itemid-128306

遺留問題:
1. 對應(yīng)與動態(tài)連接庫,我們就沒有辦法解析了,如果不加-fpic編譯選項還可以,加上這個opt的話,.world的地址是不確定的
編譯方式如下,讀者可以自行研究:
#arm-linux-gcc -g -c -fPIC -o test.o test.c
#arm-linux-gcc -shared -o testso.so test.o
#arm-linux-readelf -a testso.so > a.txt
#arm-linux-objdump -d testso.so

2. 對于全局變量,這種方法也不可靠,在一個大型工程里面,全局變量存放的值可能被打斷為幾段存放,這個就是不可靠因素。

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/99283/showart_2055312.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP