2017-03-07 4 views
2

Ich lerne gerade etwas über Mach-O-Datei. Es kommt eine Frage, wenn ich Lazy-Symbol & non-faul Symbol lernen: Wer bestimmt ein Symbol zu faul oder nicht faul? und warum?Was macht ein Symbol faul oder nicht faul?

Ich denke, es könnte der Compiler sein, dass ...

UPDATE: ich eine Antwort über meine Frage gefunden, vielleicht ist es die Wahrheit:

Faul durch die Option -z gesteuert Bindung zum Linker, ld. Diese Option verwendet Schlüsselwörter als Argument. die Schlüsselwörter enthalten (unter anderem):

lazy Wenn eine ausführbare Datei oder gemeinsam genutzte Bibliothek zu erzeugen, markieren Sie den dynamischen Linker sagen Funktionsaufruf Auflösung bis zu dem Punkt zu verschieben, wenn die Funktion (Lazy Binding) genannt wird, anstatt zur Ladezeit.

now Wenn eine ausführbare Datei oder gemeinsam genutzte Bibliothek zu erzeugen, markieren sie den dynamischen Linker zu sagen, alle Symbole zu lösen, wenn das Programm gestartet wird, oder wenn die gemeinsam genutzte Bibliothek ist mit dlopen() verwenden, statt Aufschieben Funktion Call Resolution zu der Punkt, an dem die Funktion zuerst aufgerufen wird.

Lazy Bindung ist die Standardeinstellung. Wenn Sie qcc verwenden (wie wir empfehlen), verwenden Sie die Option -W, um die Option -z an ld zu übergeben. Geben Sie beispielsweise -Wl, -zlazy oder -Wl, -znow an.

Referenz: Optimizing the runtime linker

Verwandte Frage: Does Clang/GCC really support a delay loading feature?

Antwort

2

Klingt wie Sie die haben, was verstanden.

Was den warum Teil:

Dinge so spät wie möglich tun: (a) reduziert die Arbeit zu beginnen verauslagten, und (b) vermeidet, dass die Arbeit zusammen, wenn das Ausführungspfad nie genommen wird. Dies gilt nicht nur für den Linker, sondern für jede Ausführung, die Sie verzögern können, bis sie benötigt wird.