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
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
@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
Sie könnten 'ld -r' verwenden, um die Objektdateien zu verbinden und hoffen, dass das wie erwartet funktioniert. – fuz