Ich füge eine Thread-lokale Variable zu einigen Objektdateien hinzu, die immer direkt mit ausführbaren Dateien verknüpft sind. Diese Objekte werden niemals in einer gemeinsam genutzten Bibliothek enthalten sein (und es ist sicher anzunehmen, dass dies für die absehbare Zukunft gelten wird). Das bedeutet, dass das Flag -fPIC für diese Objekte nicht benötigt wird, richtig?Ist es möglich, Nicht-PIC-Objekte in eine ausführbare Datei mit PIC-Objekten zu verknüpfen?
Unsere Codebasis hat standardmäßig das Flag -fPIC für alle Objekte. Viele davon sind in Shared Libraries enthalten, daher ist die Verwendung von -fPIC sinnvoll. Dieses Flag weist jedoch auf ein Problem beim Debuggen der neuen lokalen Thread-Variable wegen GDB crashes while stepping over thread local variable with -fPIC hin. Wenn ich -fPIC aus diesen wenigen Objektdateien mit der neuen lokalen Threadvariablen entferne, kann ich richtig debuggen.
Ich kann keine verbindlichen Aussagen finden, dass das Mischen von Nicht-PIC-Objekten mit PIC-Objekten in einer ausführbaren Datei in Ordnung ist. Meine bisherigen Tests zeigen, dass es in Ordnung ist, aber es fühlt sich nicht koscher an, und die Online-Diskussion ist im Allgemeinen "nicht PIC und nicht PIC" aufgrund der gemeinsamen Bibliothek Fall.
Ist es in diesem Fall sicher, Nicht-PIC-Objekte in eine mit PIC-Objekten und Bibliotheken erstellte ausführbare Datei zu verknüpfen? Vielleicht gibt es eine verbindliche Aussage von GCC-Dokumenten zu diesem Thema, aber ich kann es nicht finden.
EDIT: Binär Patching gcc, um diesen Fehler zu vermeiden, ist keine kurzfristige Lösung. Das Umschalten des Compilers unter Linux ist keine mögliche Lösung.
Ich denke, das sollte in Ordnung sein. Das Mischen von '-fPIC'-Code mit Nicht-PIC-Code in einer ausführbaren Datei hat die Schattenseiten von PIC (zusätzliche Indirektion für Globals/Funktionen), aber die ausführbare Datei ist nicht PIC.Sie erhalten also eine effizientere ausführbare Datei, indem Sie PIC-Objekte für Ihre gemeinsam genutzten Bibliotheken erstellen und dann die gleiche Quelle ohne PIC für die Version neu kompilieren, die in einer Nicht-PIC-Binärdatei enthalten ist. Beachten Sie, dass positionsunabhängige ausführbare Dateien eine Sache sind, und OS X erfordert sie für x86-64, aber Linux/Windows nicht. Es würde eine Adressraum-Layout-Randomisierung sogar für ausführbare Dateien und nicht nur für Bibliotheken ermöglichen. –
Nicht als Antwort, weil es nicht etwas ist, das ich ausprobiert habe. Ich verstehe, wie PIC in Bezug auf die Asm-Ausgabe arbeitet, aber ich kann etwas übersehen. –