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
文件,其中所有的值都是正確的。那麼鏈接器怎麼知道在哪裏可以找到這些函數或字符串呢?
您的檔案尚未連結。 '0'表示「稍後將填寫」。 – 2014-10-05 13:57:18
使用'objdump -dr'。 – interjay 2014-10-05 13:58:49