2016-04-30 10 views
1

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?

Antwort

2

Wahrscheinlich das Standard-Linker-Skript LD verursacht eine Art erzwungene Ausrichtung. Ich würde ein grundlegendes Linker-Skript mit dem Ursprungspunkt erstellen und ihm mitteilen, welche Abschnitte (die Ausrichtung angeben) und in welcher Reihenfolge Abschnitte angezeigt werden sollen.

linker.ld

SECTIONS 
{ 
    . = 0xb77431d9; 
    .text . : SUBALIGN(0) 
    { 
     *(.text) 
    } 
} 

Dieses Skript die SUBALIGN Richtlinie verwendet, die Ausrichtung des .text Abschnitt außer Kraft zu setzen, wie es in dem Eingabeobjekt erscheint. Von der GNU Linker Dokumentation hat es diesen Effekt:

3.6.8.4 Zwangseingangs Alignment

Sie können mithilfe SUBALIGN Eingabeabschnitt Ausrichtung innerhalb eines Ausgabeabschnitt erzwingen. Der angegebene Wert überschreibt jede von Eingabeabschnitten angegebene Ausrichtung, unabhängig davon, ob sie größer oder kleiner ist.

Dann nutzen:

as --32 -o test.o test.s 
ld -T linker.ld -m elf_i386 --oformat binary -o test.bin test.o 

Der Ausgang ich hier ist:

ndisasm -b 32 -o 0xb77431d9 test.bin 
B77431D9 E8E2FFFFFF  call dword 0xb77431c0 

Wenn ein Abschnitt in einer Objektdatei (en) nicht verarbeitet bekommen Durch die Abschnitte im Linker-Skript werden die Eingabeabschnitte weiterhin ausgegeben.Alle nicht verarbeiteten Eingabeabschnitte werden am Ende in der Reihenfolge ausgegeben, in der sie vom Linker gefunden wurden.

+0

Dies funktioniert nicht wirklich. Das Aufrufziel ändert sich folgendermaßen: Es sollte "0xb77431c0" sein, aber stattdessen erscheint "0xb77431bd". – Ruslan

+0

Ihre Antwort hilft zwar, löst das Problem aber nicht vollständig. Ich habe ein bisschen verbessert und die Arbeitslösung veröffentlicht. – Ruslan

+0

Oh, ich habe vergessen, was Sie ursprünglich in der ursprünglichen NASM codiert. –

1

Inspiriert von answer by Michael Petch (v3) habe ich einen Weg gefunden, um die Arbeits Linker-Skript, um den Ausgangsabschnitt zu subalign:

SECTIONS 
{ 
    . = 0xb77431d9; 
    .text . : SUBALIGN(0) 
    { 
     *(.text) 
    } 
} 

Jetzt habe ich folgendes Ergebnis:

$ as --32 -o test.o test.s 
$ ld -m elf_i386 -T linker.ld --oformat binary -o test.bin test.o 
$ ndisasm -b 32 -o 0xb77431d9 test.bin 
B77431D9 E8E2FFFFFF  call dword 0xb77431c0 

Dies ist genau das, die gewünschte Ausgabe mit dem korrekten Aufrufziel und ohne Fremdausrichtung.

Verwandte Themen