Jump to content
Sign in to follow this  
AccessD

ругается линкер

Recommended Posts

примитивный загрузчик.

суть кода - перетаскиваю загрузчик в новое место и записываю в 0x7c00 первый сектор нулевого цилиндра нулевой головки, после чего перехожу туда и гружусь.

Цитата:

.code16

.text

.globl _start

_start:

movw $0x0, %ax

movw %ax, %cs

movw %ax, %ss

movw %ax, %ds

movw %ax, %es

movw %ax, %ds

movw $0x7c00, %si

movw %si, %sp

movw $0x600, %di

cld

mov $0x100, %cx

repne

movsw

movw $0x600, %ax

add $cont, %ax

push %ax

ret

cont:

movw $0x7c00, %bx

movb $0x2, %ah

movb $0x1, %al

movb $0x1, %cl

movb $0x0, %ch

movb $0x80, %dl

movb $0x0, %dh

int $0x13

ljmp $0x0, $0x7c00

всё просто, собираю объектник

accessd@deck:~/src> gcc -c boot.s

а вот при линковке линкер выдаёт:

accessd@deck:~/src> ld -o boot.bin boot.o

boot.o: In function `_start':

(.text+0x1f): relocation truncated to fit: R_386_16 against `.text'

чего он выпендривается? всё примитивно, причём такой же код при помощи as86 + ld86 собирается и линкуется без проблем, но я привык к AT&T синтаксису и хочу сделать это при помощи gas.

Может, кто знает,как побороть это?

Share this post


Link to post
Share on other sites

понял, в чём дело - у gas'а проблемы с реальным режимом, тут надо подходить очень осторожно, так как gas может изменить инструкции с 16 разрядной адресацией на 32 разрядные. загнал объектник в дизассемблер, а там фигня какая-то, не удивительно, что линкеру не нравится.

Share this post


Link to post
Share on other sites

пока решаю - копаюсь в загрузочных исходниках ядра, смотрю как там gas используется в реальном режиме. а после сборки объектника as86, ld86 не линкует, сообщая, что magic number не правильный.

с gas'ом такой фокус - адреса чёрт знает во что превратились, некот.команды превратились в белиберду:

Цитата:

Disassembly of section .text:

00000000 <_start>:

0: 31 c0 xor %eax,%eax

2: 8e c8 movl %eax,%cs

4: 8e d0 movl %eax,%ss

6: 8e d8 movl %eax,%ds

8: 8e c0 movl %eax,%es

a: 8e d8 movl %eax,%ds

c: be 00 7c 89 f4 mov $0xf4897c00,%esi

11: bf 00 06 fc b9 mov $0xb9fc0600,%edi

16: 00 01 add %al,(%ecx)

18: f2 a5 repnz movsl %ds:(%esi),%es:(%edi)

1a: b8 00 06 05 22 mov $0x22050600,%eax

1f: 00 50 c3 add %dl,0xffffffc3(%eax)

00000022 <cont>:

22: bb 00 7c b4 02 mov $0x2b47c00,%ebx

27: b0 01 mov $0x1,%al

29: b1 01 mov $0x1,%cl

2b: b5 00 mov $0x0,%ch

2d: b2 80 mov $0x80,%dl

2f: b6 00 mov $0x0,%dh

31: cd 13 int $0x13

33: ea .byte 0xea

34: 00 7c 00 00 add %bh,0x0(%eax,%eax,1)

в принципе, такой код несложно написать сразу в машинном виде - этакий шел-код, но хочется разобраться.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...