2014-10-05 70 views
1
#include <stdio.h> 
void DispString(const char* charList) 
{ 
    puts(charList); 
} 
void main() 
{ 
    DispString("Hello, world!"); 
} 

編譯:GCC -c -g test.c的-o test.o目標文件中的函數和參數不正確?

鏈接:gcc的-o測試test.o

很簡單,但是當我用objdump來反彙編目標文件(test.o),得到如下結果:

objdump -d test.o: 

boot.o:  file format elf64-x86-64 


Disassembly of section .text: 

0000000000000000 <DispString>: 
    0: 55      push %rbp 
    1: 48 89 e5    mov %rsp,%rbp 
    4: 48 83 ec 10    sub $0x10,%rsp 
    8: 48 89 7d f8    mov %rdi,-0x8(%rbp) 
    c: 48 8b 45 f8    mov -0x8(%rbp),%rax 
    10: 48 89 c7    mov %rax,%rdi 
    13: e8 00 00 00 00   callq 18 <DispString+0x18> 
    18: c9      leaveq 
    19: c3      retq 

000000000000001a <main>: 
    1a: 55      push %rbp 
    1b: 48 89 e5    mov %rsp,%rbp 
    1e: bf 00 00 00 00   mov $0x0,%edi 
    23: e8 00 00 00 00   callq 28 <main+0xe> 
    28: 5d      pop %rbp 
    29: c3      retq 

對於第23行,它將0傳遞給%edi寄存器,這肯定是錯誤的。它應該通過「你好,世界!」的地址字符串。它叫28 <main+0xe>?行28只是它的下一行,而不是函數DispString(它在行0中)。爲何會發生這種情況?我還研究了最後的test文件,其中所有的值都是正確的。那麼鏈接器怎麼知道在哪裏可以找到這些函數或字符串呢?

+4

您的檔案尚未連結。 '0'表示「稍後將填寫」。 – 2014-10-05 13:57:18

+3

使用'objdump -dr'。 – interjay 2014-10-05 13:58:49

回答

0

您只翻譯文件,因此沒有進行鏈接。一旦鏈接jas完成後,然後DispString()的地址將被主要知道,並且它將跳轉到那裏。正如其中一條評論所建議的那樣,使用objdump和comliled可執行文件。