Ich versuche, GNU as
als generischer Assembler ähnlich wie nasm
zu verwenden. Ich mache eine Vorlage Quelle wie folgt aus:Wie spezifiziert man die ELF-Sektion in GNU als?
.section .text
.globl _start
.intel_syntax noprefix
_start:
call 0xb77431c0 # the instruction I want to assemble
Und dann laufe ich den Befehl wie folgt zusammensetzen:
as --32 -o test.o test.s
ld -m elf_i386 -Ttext 0xb77431d9 --oformat binary -o test.bin test.o
Alle funktioniert gut mit binutils 2.24. Aber es scheint, dass as
von binutils 2.22 (die in Ubuntu Precise) richtet .text
Abschnitt an die 4-Byte-Grenze, so dass statt der erwarteten Abbau ich falsch Ergebnisse erhalten:
# expected and working in binutils 2.24
$ ndisasm -b 32 -o 0xb77431d9 test.bin
B77431D9 E8E2FFFFFF call dword 0xb77431c0
# actual in binutils 2.22
$ ndisasm -b 32 -o 0xb77431d9 test.bin
B77431D9 90 nop
B77431DA 90 nop
B77431DB 90 nop
B77431DC E8DFFFFFFF call dword 0xb77431c0
Das Problem ist in der as
Befehl (dh nicht ld
): readelf -S
gibt mir die folgenden für die Ergebnisse von as
2.22:
$ readelf -S test.o | grep ' \.text'
[ 1] .text PROGBITS 00000000 000034 000005 00 AX 0 0 4
Und für 2,24 ich habe
$ readelf -S test.o | grep ' \.text'
[ 1] .text PROGBITS 00000000 000034 000005 00 AX 0 0 1
So ist das Problem in der Tat Ausrichtung von .text
Abschnitt. Ich habe versucht, .align 0
und .align 1
an verschiedenen Stellen in der Quelle zu platzieren, aber es hat die Ausgabe nicht geändert.
So meine Frage jetzt: Wie explizit Abschnitt Ausrichtung für ELF Ziel in GNU Assembler?
Dies funktioniert nicht wirklich. Das Aufrufziel ändert sich folgendermaßen: Es sollte "0xb77431c0" sein, aber stattdessen erscheint "0xb77431bd". – Ruslan
Ihre Antwort hilft zwar, löst das Problem aber nicht vollständig. Ich habe ein bisschen verbessert und die Arbeitslösung veröffentlicht. – Ruslan
Oh, ich habe vergessen, was Sie ursprünglich in der ursprünglichen NASM codiert. –