我有两个文件 a)kernel_entry.asm(32位汇编代码)
[ bits 32]
[ extern _start ]
call _start
jmp $
用
编译kernel_entry.o : kernel_entry.asm
<tab>nasm $< -o $@ -f coff
b)kernel.c(函数名称开始)
void start()
{
print_char(); // irrelevant for this question
}
用
编译kernel_main.o: kernel.c
<tab>gcc -static -nostartfiles $< -L /home/me/OS/driver/ekran -l ekran -o $@
kernel.o : kernel.c
<tab>gcc -ffreestanding -c $< -o $@
而且kernel_entry.asm的主要工作只是跳转到启动功能。当我使用makefile中的以下命令链接这两个文件时
kernel.tmp: kernel_entry.o kernel_main.o
<tab>ld -o $@ -Ttext 0x1000 kernel_entry.o kernel_main.o
我有问题,kernel_entry无法跳转到正常启动功能。所以我用
检查了kernel.tmp文件objdump -d kernel.tmp
,输出部分如下。
kernel.tmp: pei-i386 file format
Disassembly of section .text:
00001000 <.text>:
1000: e8 fe ff ff ff call 1003 <.text+0x3>
1005: eb fe jmp 1005 <.text+0x5>
1007: 90 nop
00001008 <_start>:
1008: 55 push %ebp
1009: 89 e5 mov %esp,%ebp
100b: 83 ec 18 sub $0x18,%esp
100e: c7 44 24 0c 0f 00 00 movl $0xf,0xc(%esp)
....
....
从上面可以看出,地址1000处的代码没有跳转到启动功能(在地址1008处),而是跳转到地址1003而不是什么都没有。
现在,我只通过直接跳转到kernel_entry.asm代码中的地址1008来解决这个问题。
这可能是什么原因?
提前谢谢......
这是单独离开kernel.c之后的代码(在没有链接到任何库之后)
kernel.tmp: pei-i386 file format
Disassembly of section .text:
00001000 <.text>:
1000: e8 fe ff ff ff call 1003 <.text+0x3>
1005: eb fe jmp 1005 <.text+0x5>
1007: 90 nop
00001008 <_start>:
1008: 55 push %ebp
1009: 89 e5 mov %esp,%ebp
100b: 5d pop %ebp
100c: c3 ret
100d: 90 nop
100e: 90 nop
100f: 90 nop
1010: ff (bad)
1011: ff (bad)
1012: ff (bad)
1013: ff 00 incl (%eax)
1015: 00 00 add %al,(%eax)
1017: 00 ff add %bh,%bh
1019: ff (bad)
101a: ff (bad)
101b: ff 00 incl (%eax)
101d: 00 00 add %al,(%eax)
...
00001020 <__CTOR_LIST__>:
1020: ff (bad)
1021: ff (bad)
1022: ff (bad)
1023: ff 00 incl (%eax)
1025: 00 00 add %al,(%eax)
...
00001028 <__DTOR_LIST__>:
1028: ff (bad)
1029: ff (bad)
102a: ff (bad)
102b: ff 00 incl (%eax)
102d: 00 00 add %al,(%eax)