Как генерировать простые двоичные файлы, такие как 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 двоичный?
у меня есть репозиторий с рабочими примерами для некоторых распространенных случаев использования: