Das Problem wird dadurch verursacht, dass Sie die Disassemblierung einer Objektdatei betrachten, nicht die endgültige ausführbare Datei oder das gemeinsame Objekt.
Wenn der Assembler die Objektdatei erstellt, ist die endgültige Adresse des bl
-Ziels noch nicht festgelegt (dies hängt von den anderen Objektdateien ab, die damit verknüpft werden). Also setzt der Assembler die Adresse auf 0, fügt aber auch eine Verschiebung hinzu, die dem Linker mitteilt, wohin dieser bl
in der endgültigen Datei gehen soll. (Sie können die Umzugsinformationen in objdump
sehen, indem Sie den Schalter -r
hinzufügen.)
Beim Linking verarbeitet der Linker die Verschiebung, berechnet die endgültige Adresse der Zielfunktion und patcht den Befehl so, dass die Zieladresse ausgerichtet wird. Wenn Sie die endgültige, verknüpfte ausführbare Datei disassemblieren, sehen Sie einen anderen Opcode.
Tags und Links linux arm disassembly