Перейти к содержанию

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


Рекомендуемые сообщения

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

суть кода - перетаскиваю загрузчик в новое место и записываю в 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.

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

пока решаю - копаюсь в загрузочных исходниках ядра, смотрю как там 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)

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...