Frage

Wenn Shared Libraries kompilieren in der -fPIC Option gcc kompiliert den Code als Position unabhängig. Gibt es einen Grund (Leistung oder aus anderen Gründen), warum Sie nicht alle Codeposition unabhängig kompilieren würden?

War es hilfreich?

Lösung

Es fügt eine Indirektion. Mit Position unabhängigen Code müssen Sie die Adresse Ihrer Funktion laden und dann auf sie zu springen. Normalerweise ist die Adresse der Funktion ist bereits in dem Befehlsstrom.

Andere Tipps

Ja, es gibt Performance-Gründen. Einige Zugriffe effektiv unter einer anderen Schicht Indirektionsebene die absolute Position im Speicher zu erhalten.

Es gibt auch die GOT (Global-Offset-Tabelle), die Offsets der globalen Variablen speichert. Für mich sieht das wie eine IAT-Fixup-Tabelle, die als Position klassifiziert wird abhängig von wikipedia und einigen anderen Quellen.

http://en.wikipedia.org/wiki/Position_independent_code

Da unabhängigen Code vollständig positioniert Implementierung fügt eine Beschränkung auf den Code-Generator, der die Verwendung von schnellen Operationen verhindern kann, oder zusätzliche Schritte hinzufügen, um diese Einschränkung zu erhalten.

Dies könnte ein akzeptabler Kompromiss sein, ohne ein virtuelles Speichersystem Multiprozessing zu bekommen, wo man Prozesse vertrauen nicht den Speichers jeden anderen eindringen und könnte für eine bestimmte Anwendung zu jeder Basisadresse geladen werden muß.

In vielen modernen Systemen die Leistungskompromisse sind unterschiedlich, und ein relocating Loader ist oft weniger teuer (es kostet jeder Zeitcode zuerst geladen wird) als die am besten ein Optimierer tun kann, wenn es freie Herrschaft hat. Auch die Verfügbarkeit der virtuellen Adressräume verbirgt sich der größte Teil der Motivation für die Position der Unabhängigkeit an erster Stelle.

Auch virtuelle Speicher-Hardware in den meisten modernen Prozessoren (von den meisten modernen Betriebssystemen verwendet wird) bedeutet, dass viele Code (alle User-Space-Anwendungen, abgesehen von schrulliger Verwendung von mmap oder dergleichen) muss nicht Stellung unabhängig sein. Jedes Programm hat seinen eigenen Adressraum, die es beginnt bei Null denkt.

position-independent code hat eine Performance-Overhead auf den meisten Architektur, weil sie ein zusätzliches Register erforderlich ist.

Also, das ist für die Leistung Zweck.

Heute-Betriebssystem und Compiler standardmäßig machen den Code als Position unabhängiger Code. Versuchen Sie, ohne die -fPIC Flags kompilieren, wird der Code kompiliert in Ordnung, aber Sie werden nur einen warning.OS die bekommen wie Fenster eine Technik, die als Speicher-Mapping genannt, dies zu erreichen.

scroll top