Mach-O-symbol stubs (IOS)
Ich versuche zu verstehen, wie Mach-o-Dateien arbeiten und ein gutes Geschäft gemacht haben Fortschritte mit den verfügbaren online-Ressourcen (insbesondere der Apple-Seite hier: http://developer.apple.com/library/mac/#documentation/developertools/conceptual/MachORuntime/Reference/reference.html), aber ich traf eine Straßensperre auf das Verständnis, wie symbol stubs arbeiten.
Mit "otool -l" sehe ich den folgenden Abschnitt:
Section
sectname __symbolstub1
segname __TEXT
addr 0x00005fc0
size 0x00000040
offset 20416
align 2^2 (4)
reloff 0
nreloc 0
flags 0x80000408
Aber wenn ich mir die Daten aus der Binär-Datei in einem hex-editor sehe ich die folgenden 4 bytes wiederholte wieder und wieder:
00005FC0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FD0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FE0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FF0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
Diese sieht etwas wie ein LDR erhöht PC um einen festen Betrag, aber ich sehe nicht ein, warum die Menge ist die gleiche für jeden Eintrag in der Symboltabelle.
Wenn jemand kann Licht auf, warum dies so ist, oder geben Sie keine Ressourcen, die erhalten diesem niedrigen Niveau, lassen Sie es mich bitte wissen.
Dank!
- Ich denke, ich habe herausgefunden, was Los ist, jedes der 4-byte-Einträge in der Tabelle verweist auf einen Datenbereich unten, die hat eine DCD-Anweisung speichert die Position des Funktionsaufrufs. Aber ich bin noch ein bisschen verwirrt, warum diese zusätzliche Ebene der Dereferenzierung erforderlich ist, also wenn jemand das " follow info, ich würde es zu schätzen wissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich beschreibe die situation mit der aktuellen iOS, es ist etwas anders in den alten Versionen.
Symbol stubs in der Tat laden in den PC eine Funktion Zeiger. Für den standard "faul" (on-demand) Einfuhren, der Zeiger befindet sich in der
__lazy_symbol
Abschnitt und zeigt zunächst auf eine Helfer-routine in der__stub_helper
Abschnitt, z.B.:Die Funktion
dyld_stub_binding_helper
ist die Faust eines in der__stub_helper
Abschnitt und im wesentlichen ist nur ein Trampolin, um diedyld_stub_binder
Funktion in dyld, übergeben es was ich Anruf "- symbol info-offset" - Wert. Dieser Wert ist ein offset innerhalb der lazy binding info stream (Spitzen, von den LC_DYLD_INFO oder LC_DYLD_INFO_ONLY load-Befehl), die eine Art von bytecode stream mit Befehlen für die dyld. Typische Sequenz für einen faulen import sieht wie folgt aus:hier dyld würde Folgendes tun:
ein dylib Nummer NNNN in der Liste von dylibs aufgeführt in den laden
Befehle.
Die Adresse geschrieben zu werden passiert der
_AudioServicesAddSystemSoundCompletion$lazy_ptr
slot. Also, das nächste mal die_AudioServicesAddSystemSoundCompletion
aufgerufen wird, springt es direkt in die Funktion importiert, ohne den Umweg über dyld.N. B.: Sie sollten nicht Blick auf die offset-05fc0 in der Datei gleich. Die
addr
Feld wird die virtuelle Adresse, die Sie suchen sollten, die mit segment-Befehl und sehen Sie, was VA beginnt es und was ist der offset einer Datei, dann die Mathematik. In der Regel die __TEXT-segment fängt bei 1000.Jedoch, das eigentliche symbol stubs sehen wie Sie eingefügt haben, wahrscheinlich haben Sie eine Fett-mach-o-mit der fat-header unter die ersten 1000 bytes, so dass die offsets line-up.
LC_DYSYMTAB
ist nicht effektiv von dyld, aber immer noch erforderlich ist, bestehen für Mach-O laden überprüft. So ist es enthalten beliebige Daten und ausführbaren würde immer noch funktionieren.