Подтвердить что ты не робот

Как создать простые двоичные файлы, такие как nasm -f bin с ассемблером GNU GAS?

У меня есть некоторые файлы NASM, которые обычно имеют структуру:

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret

Я собираю их так:

nasm -f bin abc.asm

Я бы хотел написать некоторые из них, используя GAS. Два вопроса:

  • Какие директивы следует использовать в GAS? Я нашел директиву ".org", но GAS, похоже, не имеет директивы ".bits".

  • Что мне передать в gcc или as для создания простого двоичного файла? То есть что делает опция -f bin для NASM.

4b9b3361

Ответ 1

Какие директивы я должен использовать в ГАЗ? Я нашел директиву ".org", но GAS, похоже, не имеет директивы ".bits".

Ассемблер по умолчанию для 64-битных для меня, вы можете использовать --32 или --64 для выбора в командной строке. Посмотрите руководство по as, чтобы узнать, как можно изменить архитектуру внутри кода, если это необходимо (например, .code16 можно использовать для генерации кода реального режима для загрузчика).

Вы, скорее всего, не хотите использовать директиву .org, чтобы указать, где находится код, но, вероятно, захотите использовать ссылку script или указать, где сегменты текста и данных загружаются в командной строке, (org 0x0000000000200000 приводит к двоичному файлу 2+ МБ).

Что мне передать gcc или как создать простой двоичный файл? То есть что делает опция -f bin с NASM.

$ cat test.S
.section .text
.globl _start
_start:
        xor %rax, %rax
        mov test, %rax
        ret

test: .quad 0x1234567812345678


$ as --64 -o test.o test.S
$ ld -Ttext 200000 --oformat binary -o test.bin test.o


$ objdump -D -b binary -m i386:x86-64 test.bin
test.bin:     file format binary
Disassembly of section .data:

0000000000000000 <.data > : 0: 48 31 c0 xor %rax,%rax 3: 48 8b 04 25 0c 00 20 mov 0x20000c,%rax a: 00 b: c3 retq
c: 78 56 js 0x64 e: 34 12 xor $0x12,%al 10: 78 56 js 0x68 12: 34 12 xor $0x12,%al

Ответ 2

objcopy -O binary

Хороший вариант это:

as -o test.o test.S
ld -Ttext 0x7C00 -o test.elf test.o
objcopy -O binary kernel.elf kernel.bin

Преимущество перед ld --Oformat binary состоит в том, что для отладки проще использовать символы:

qemu-system-i386 -hda main.img -S -s &
gdb main.elf -ex 'target remote localhost:1234'

Смотрите также: fooobar.com/info/322017/...

Скрипт компоновщика

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

В противном случае ld будет использовать скрипт по умолчанию (ld --verbose), предназначенный для пользовательского приложения, который не похож на ваше приложение.

Без дополнительной информации, минимальный сценарий, который я могу дать:

SECTIONS
{
    . = 2M;
    .text :
    {
        *(.*)
    }
}

А затем используйте его с -T:

as --64 -o test.o test.S
ld -T linker.ld --oformat binary -o test.bin test.o

Но вы, вероятно, захотите изменить этот сценарий на основе вашего конкретного приложения.

Смотрите также: есть ли способ получить gcc для вывода необработанного двоичного файла?

У меня есть репозиторий с рабочими примерами для некоторых распространенных случаев использования: