Как генерировать простые двоичные файлы, такие как NASM-f bin, с помощью GNU Gas assembler?

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

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret

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

nasm -f bin abc.asm

Я хотел бы написать некоторые из них, используя газ вместо этого. Два вопроса:--6-->

  • какие директивы я должен использовать в Газе? Я нашел '.директивой org', но на газ не похоже '.директива битов.

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

2 ответов


какие директивы я должен использовать в Газе? Я нашел '.директивой org', но на газ не похоже '.директива битов.

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

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

что я должен передать 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

0000000000000000 <.>: 0: 48 31 c0 исключающее %Ракс,%Ракс 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


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'

см. также:https://stackoverflow.com/a/32960272/895245

скрипт линкера

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

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

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

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

и затем использовать его с -T:

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

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

Читайте также: есть ли способ получить gcc для вывода raw двоичный?

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