2017-03-13 1 views
4

Ich baue Code, der ein gemeinsames Objekt (.so) sein muss.Kompiliere ein gemeinsames Objekt (.so) mit statischem Glibc

Das Problem, dass die libc auf meiner Baumaschine möglicherweise neuer als die veröffentlichten Maschinen ist, also möchte ich mit ihr statisch verknüpfen, um Kompatibilitätsprobleme zu vermeiden. (Mein Programm verwendet memcpy, was offensichtlich eine GLIBC_2.14-Sache ist, wenn es so niedrig wie 2,5 gehen kann).

Die Kompilierung mit -shared und -static funktioniert nicht, da crtbeginT.o nicht mit -fPIC kompiliert wurde.

Edit: Wahrscheinlich nicht ein Duplikat von GCC linking libc static and some other library dynamically, revisited? seit dieser Frage über die Hauptelf sprechen libc statisch und dies ist über ein gemeinsames Objekt libc statisch verknüpfen.

+0

Könnten Sie Ihre gcc Optionen hinterlassen bitte. – KimKulling

+1

Es macht keinen Sinn, das zu tun, was du beschreibst, weil du am Ende eine Anwendung haben würdest, die deine Bibliothek mit zwei verschiedenen Versionen von glibc gleichzeitig nutzt - eine über deine Bibliothek und eine andere für die eigene direkte glibc Abhängigkeiten. Das stellt genau die Art von Problem dar (ich nehme an), das du vermeiden willst, so dass du nichts gewinnst, indem du so vorgehst, wie du es vorschlägst. –

+7

Aus Erfahrung werden Sie, weit, viel weniger Zeit dafür aufwenden, indem Sie z. eine VirtualBox-VM mit der erforderlichen alten Distribution/Version mit dem älteren glibc, der zu Ihren "publishing" -Maschinen passt und Ihre Releases auf dieser VM erstellt (Sie können immer noch auf Ihrer neueren Entwicklungsdistribution entwickeln/testen), als Sie versuchen, die glibc-Kompatibilität zu bekämpfen Probleme. Dies umso mehr, wenn Sie eine gemeinsam genutzte Bibliothek erstellen, die Teile einer neueren glibc enthält, die in einen Prozess geladen wird, der mit einer älteren glibc verknüpft ist. Tu das einfach nicht. – nos

Antwort

7

Sie möchten glibc in Ihrer gemeinsam genutzten Bibliothek statisch verknüpfen.

Sie sollten dies nicht tun.

Wenn Sie versuchen, werden Sie mit einer C++ One Definition Rule (ODR) Verletzung enden. Dies liegt daran, dass einige Teile von glibc von der "alten" Version Ihres Zielrechners stammen und einige von der "neuen" Version Ihrer Bibliothek. Das Ergebnis ist ein nicht definiertes Verhalten.

Die richtige Lösung ist einfach: Erstellen Sie mit einem älteren glibc (so alt wie Ihr ältestes Ziel für die Bereitstellung). Oder erstellen Sie mehrere Male, einmal für jede Version von glibc, die Sie benötigen (wenn Sie wirklich neue glibc-Funktionen benötigen). Selbst wenn Sie glauben, dass Sie eine neue Glibc-Funktion benötigen, sollten Sie nur das Kopieren und Einfügen dieser Funktion in Ihre Bibliothek unter einem anderen Namen in Erwägung ziehen, um Kollisionen zu vermeiden.

Bezüglich Memcpy insbesondere finden Sie unter: https://stackoverflow.com/a/8823419/4323 - und für eine manuelle fix: https://stackoverflow.com/a/5977518/4323

+0

Nun, dann hat es keinen Sinn, nach dem Unmöglichen zu suchen. Ich werde eine VM einrichten, Danke. –

+2

Das statische Verknüpfen von glibc birgt auch die Gefahr, dass eine Version von glibc ausgeführt wird, die nicht mit der Systemaufrufschnittstelle des zugrunde liegenden Laufzeitkernels übereinstimmt. –

Verwandte Themen