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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3789 | 回復(fù): 9
打印 上一主題 下一主題

問(wèn)一個(gè)關(guān)于編譯和鏈接的問(wèn)題,謝謝! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-11-16 17:52 |只看該作者 |倒序?yàn)g覽
本帖最后由 qiangtoucao121 于 2011-11-16 17:54 編輯

這里有一個(gè)例子,很簡(jiǎn)單
#include <stdio.h>

int myadd(int i, int j)
{
     int z = i + j;
     return z;
}

int main()
{
     int i,j;
     i = 1;
     j = 2;
     int m = i + j;
     int n;
     n = myadd(i,j);

     printf("the sum of i + j = %d \n", m);
     printf("the sum of i + j = %d by call myadd.\n", n);
}

我現(xiàn)在執(zhí)行:
gcc test.c -o test
objdump -d test

觀察main函數(shù)
00000000004004df <main>:
  4004df:       55                      push   %rbp
  4004e0:       48 89 e5                mov    %rsp,%rbp
  4004e3:       48 83 ec 10             sub    $0x10,%rsp
  4004e7:       c7 45 f0 01 00 00 00    movl   $0x1,-0x10(%rbp)
  4004ee:       c7 45 f4 02 00 00 00    movl   $0x2,-0xc(%rbp)
  4004f5:       8b 45 f4                mov    -0xc(%rbp),%eax
  4004f8:       8b 55 f0                mov    -0x10(%rbp),%edx
  4004fb:       8d 04 02                lea    (%rdx,%rax,1),%eax
  4004fe:       89 45 f8                mov    %eax,-0x8(%rbp)
  400501:       8b 55 f4                mov    -0xc(%rbp),%edx
  400504:       8b 45 f0                mov    -0x10(%rbp),%eax
  400507:       89 d6                   mov    %edx,%esi
  400509:       89 c7                   mov    %eax,%edi
  40050b:       e8 b4 ff ff ff          callq  4004c4 <myadd>  
  400510:       89 45 fc                mov    %eax,-0x4(%rbp)
  400513:       b8 48 06 40 00          mov    $0x400648,%eax
  400518:       8b 55 f8                mov    -0x8(%rbp),%edx
  40051b:       89 d6                   mov    %edx,%esi
  40051d:       48 89 c7                mov    %rax,%rdi
  400520:       b8 00 00 00 00          mov    $0x0,%eax
  400525:       e8 8e fe ff ff          callq  4003b8 <printf@plt>
  40052a:       b8 60 06 40 00          mov    $0x400660,%eax
  40052f:       8b 55 fc                mov    -0x4(%rbp),%edx
  400532:       89 d6                   mov    %edx,%esi
  400534:       48 89 c7                mov    %rax,%rdi
  400537:       b8 00 00 00 00          mov    $0x0,%eax
  40053c:       e8 77 fe ff ff          callq  4003b8 <printf@plt>
  400541:       c9                      leaveq
  400542:       c3                      retq   
  400543:       90                      nop
  400544:       90                      nop
  400545:       90                      nop
  400546:       90                      nop
  400547:       90                      nop
  400548:       90                      nop
  400549:       90                      nop
  40054a:       90                      nop
  40054b:       90                      nop
  40054c:       90                      nop
  40054d:       90                      nop
  40054e:       90                      nop
  40054f:       90                      nop

然后,我再執(zhí)行如下
gcc -c test.c
objdump -d test.o

再觀察main函數(shù)
000000000000001b <main>:
  1b:   55                      push   %rbp
  1c:   48 89 e5                mov    %rsp,%rbp
  1f:   48 83 ec 10             sub    $0x10,%rsp
  23:   c7 45 f0 01 00 00 00    movl   $0x1,-0x10(%rbp)
  2a:   c7 45 f4 02 00 00 00    movl   $0x2,-0xc(%rbp)
  31:   8b 45 f4                mov    -0xc(%rbp),%eax
  34:   8b 55 f0                mov    -0x10(%rbp),%edx
  37:   8d 04 02                lea    (%rdx,%rax,1),%eax
  3a:   89 45 f8                mov    %eax,-0x8(%rbp)
  3d:   8b 55 f4                mov    -0xc(%rbp),%edx
  40:   8b 45 f0                mov    -0x10(%rbp),%eax
  43:   89 d6                   mov    %edx,%esi
  45:   89 c7                   mov    %eax,%edi
  47:   e8 00 00 00 00          callq  4c <main+0x31>
  4c:   89 45 fc                mov    %eax,-0x4(%rbp)
  4f:   b8 00 00 00 00          mov    $0x0,%eax
  54:   8b 55 f8                mov    -0x8(%rbp),%edx
  57:   89 d6                   mov    %edx,%esi
  59:   48 89 c7                mov    %rax,%rdi
  5c:   b8 00 00 00 00          mov    $0x0,%eax
  61:   e8 00 00 00 00          callq  66 <main+0x4b>
  66:   b8 00 00 00 00          mov    $0x0,%eax
  6b:   8b 55 fc                mov    -0x4(%rbp),%edx
  6e:   89 d6                   mov    %edx,%esi
  70:   48 89 c7                mov    %rax,%rdi
  73:   b8 00 00 00 00          mov    $0x0,%eax
  78:   e8 00 00 00 00          callq  7d <main+0x62>
  7d:   c9                      leaveq
  7e:   c3                      retq   


如上,主要是紅色部分的區(qū)別,我的問(wèn)題是,為什么不鏈接就無(wú)法顯示所調(diào)用的函數(shù)名,而只是主函數(shù)名+偏移量,原因是什么?
如果我在反匯編存在的庫(kù)文件的時(shí)候,出現(xiàn)和未鏈接一樣的情況,我用什么辦法得到主函數(shù)到底調(diào)用了哪個(gè)函數(shù),請(qǐng)高手指點(diǎn),萬(wàn)分感謝!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-11-17 09:00 |只看該作者
此論壇不給力啊,斑竹大人呢?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-11-17 12:55 |只看該作者
第一點(diǎn),《程序員的自我修養(yǎng)》第四章4.2節(jié)靜態(tài)鏈接過(guò)程中的符號(hào)解析與重定位中,有詳細(xì)的描述。簡(jiǎn)單點(diǎn)說(shuō),就是鏈接的時(shí)候,需要合并各個(gè)目標(biāo)文件中的段,比如最常見(jiàn)的data、text、bss等,所以在鏈接前,編譯器是不知道調(diào)用函數(shù)在虛擬內(nèi)存中的實(shí)際位置的,編譯器只能暫時(shí)把這些函數(shù)的地址臨時(shí)當(dāng)作0。


第二點(diǎn),LZ你自己也說(shuō)了,你反編譯的只是一個(gè)庫(kù),要想得知main函數(shù)調(diào)用了哪些函數(shù),必須得到包含main的那個(gè)目標(biāo)文件,目標(biāo)文件里應(yīng)該包含各種符號(hào)表,連接器應(yīng)該就是根據(jù)這些符號(hào)表確定被調(diào)用函數(shù)的最終地址的,這也是我猜的,所以沒(méi)法提供更詳細(xì)的信息,你可以去參考下連接器是怎么做的,或者自己分析目標(biāo)文件的格式。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-11-17 12:58 |只看該作者
那個(gè)符號(hào)表應(yīng)該就叫做重定位表,那本書(shū)的第四章看完,就什么都明白了

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-11-17 17:47 |只看該作者
回復(fù) 4# sqfasd


    謝謝這位兄弟,你說(shuō)的那本書(shū)我以前前段時(shí)間看過(guò),未鏈接的文件比如我上面的test.o和我這個(gè)庫(kù)文件,在它的.text區(qū)間是可以看見(jiàn)myadd,等符號(hào)的,我不需要知道所調(diào)用函數(shù)的實(shí)際地址,我現(xiàn)在只需要知道函數(shù)名而已,這個(gè)就是我奇怪的地方。
   我把利用那個(gè)庫(kù)文件生成的.ko文件進(jìn)行了反匯編,還是只有主函數(shù)+偏移地址的形式,無(wú)法得到相關(guān)的函數(shù)名,我現(xiàn)在非常希望得到函數(shù)名,問(wèn)題就在這里

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-11-18 00:55 |只看該作者
本帖最后由 sqfasd 于 2011-11-18 00:58 編輯

回復(fù) 5# qiangtoucao121

這個(gè)可能要你自己去分析了,因?yàn)閛bjdump不會(huì)幫你做,可以試試readelf,這個(gè)可以幫你分析目標(biāo)文件中表和段的信息,找出偏移量對(duì)應(yīng)的函數(shù)名就可以了


Relocation section '.rel.text' at offset 0x340 contains 2 entries:
Offset     Info    Type            Sym.Value  Sym. Name
00000021  00000702 R_386_PC32        00000000   add
0000003c  00000802 R_386_PC32        0000000b   func

20:   e8 fc ff ff ff          call   21 <func+0x16>
3b:   e8 fc ff ff ff          call   3c <main+0xf>

看,還是有規(guī)律的,用grep或awk處理你需要的信息吧。


又試了下,用objdump -r選項(xiàng)也是可以解析出重定位表的

objdump -r test.o

test.o:     file format elf32-i386

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
00000021 R_386_PC32        add
0000003c R_386_PC32        func

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-11-18 08:53 |只看該作者
你的回復(fù)很有幫助,我再看看,非常感謝!!

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2011-11-18 09:15 |只看該作者
你的可以,我的不行 真是奇怪

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-11-18 09:19 |只看該作者
下面是readelf的結(jié)果
Relocation section '.rela.text' at offset 0x670 contains 5 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000048  000900000002 R_X86_64_PC32     0000000000000000 myadd - 4
000000000050  00050000000a R_X86_64_32       0000000000000000 .rodata + 0
000000000062  000b00000002 R_X86_64_PC32     0000000000000000 printf - 4
000000000067  00050000000a R_X86_64_32       0000000000000000 .rodata + 18
000000000079  000b00000002 R_X86_64_PC32     0000000000000000 printf - 4

下面是objdump的結(jié)果
RELOCATION RECORDS FOR [.text]:
OFFSET           TYPE              VALUE
0000000000000048 R_X86_64_PC32     myadd-0x0000000000000004
0000000000000050 R_X86_64_32       .rodata
0000000000000062 R_X86_64_PC32     printf-0x0000000000000004
0000000000000067 R_X86_64_32       .rodata+0x0000000000000018
0000000000000079 R_X86_64_PC32     printf-0x0000000000000004

而objdump面的結(jié)果我上面有說(shuō)明:
47:   e8 00 00 00 00          callq  4c <main+0x31>
61:   e8 00 00 00 00          callq  66 <main+0x4b>
78:   e8 00 00 00 00          callq  7d <main+0x62>

還是可以的 就是相差1,呵呵 再內(nèi)核模塊上面再試一試,看看有沒(méi)有問(wèn)題

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-11-18 09:33 |只看該作者
簡(jiǎn)單的問(wèn)題解決了,復(fù)雜的問(wèn)題又來(lái)了,不過(guò)估計(jì)暫時(shí)還沒(méi)有問(wèn)題解決
000000000001352a R_X86_64_32S      ifio_2b833.601e4c97925221a121e16eedfa1d5840182.2.3.1.123
0000000000013531 R_X86_64_PC32     ifio_2b833.601e4c97925221a121e16eedfa1d5840182.2.3.1.123-0x0000000000000004
0000000000013538 R_X86_64_PC32     ifio_2b833.601e4c97925221a121e16eedfa1d5840182.2.3.1.123+0x0000000000000004
000000000001353d R_X86_64_PC32     ifio_7653c.c920cb5012983c87a18a599e03ac78cdbe9.2.3.1.123-0x0000000000000004

如上所示,有一些函數(shù),為了在鏈接的時(shí)候能夠準(zhǔn)確定位,對(duì)相同的函數(shù)名進(jìn)行了異化處理,這個(gè)現(xiàn)在就不想深入分析了,除非對(duì)gcc的命名規(guī)則非常熟悉,暫時(shí)就不深入了,謝謝這位兄弟的提醒,讓我這邊很省了不少事情
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP