2017-01-29 4 views
1

Ich habe eine Funktion implementiert in i386 Assembly über mehrere .s Dateien verteilt. Das Ergebnis der Funktion ist abhängig von der Reihenfolge der Maschinencode verkettet ist, zum Beispiel:Wie verhindert man, dass GNU ld die Objektdateien neu anordnet?

$ gcc -m32 -Wl,-N -W -Wall -Werror -s -O2 -o calladd calladd.c add10.s double.s add1.s ret.s && ./calladd a b; echo $? 
27 
$ gcc -m32 -Wl,-N -W -Wall -Werror -s -O2 -o calladd calladd.c add10.s add1.s double.s ret.s && ./calladd a b; echo $? 
28 

ich immer den Code in ret.s zuletzt haben wollen (weil es enthält die ret Anweisung), und ich möchte, variieren die Reihenfolge der anderen .s Dateien.

Wie kann ich sicherstellen, dass GNU ld den Code .s Dateien in der Reihenfolge ausgibt, die ich ihnen angegeben habe? Es scheint standardmäßig zu funktionieren, aber ich möchte, dass die Lösung resistenter ist, d. H. Die Neuanordnung dieser .s-Dateien explizit deaktiviert wird, selbst wenn die Neuordnung für andere Dateien aktiviert wird. Welche Befehlszeilenflags sind relevant?

Vorzugsweise möchte ich es ohne ein Linker-Skript tun.

Meine Beispieldateien sind:

# calladd.c: 
extern int add10(int) __attribute__((regparm(1))); 
int main(int argc, char **argv) { (void)argv; return add10(argc); } 

# add10.s: 
.text 
.globl add10 
add10: 
addl $10, %eax 

# add1.s: 
.text 
.globl add1 
add1: 
addl $1, %eax 

# double.s: 
.text 
.globl double 
double: 
addl %eax, %eax 

# ret.s: 
.text 
ret 
+0

Ich glaube nicht, dass dies getan werden kann. Ich empfehle Ihnen, den C-Präprozessor zu verwenden, um die Dateien vor der Assemblierung zu verketten – fuz

+0

@fuz: Vielen Dank für Ihren Kommentar. In meiner realen Situation ist es nicht möglich, '.s' Dateien zu manipulieren, denn sobald ich Code neu anordnen muss, habe ich nur die' .o' Dateien. – pts

+1

Sie könnten 'ld -r' verwenden, um die Objektdateien zu verbinden und hoffen, dass das wie erwartet funktioniert. – fuz

Antwort

2

Basierend auf den Kommentar von @RossRidge: GNU ld nicht Quelldateien standardmäßig neu anordnen, vertrauen nur darauf. Um zusätzliche Bytes zu vermeiden, die wegen der Ausrichtung eingefügt werden, verwenden Sie nicht .align oder etwas ähnliches in den .s Dateien, und legen Sie sie in den gleichen Abschnitt .text.

Verwandte Themen