gnu ld(cygwin)命令没有正确链接

时间:2015-08-07 23:20:29

标签: assembly x86 cygwin ld

我有两个文件 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)

0 个答案:

没有答案