2013-04-18 18 views
7

Ich habe ein Autotools C-Projekt.Wie kompiliere ich eine Binärdatei, die sowohl mit libcrypto.so.0.9.8 als auch libcryto.so.1.0.0 funktioniert?

Wie kompiliere ich eine Binärdatei, die sowohl mit libcrypto.so.0.9.8 als auch libcryto.so.1.0.0 funktioniert? (d. h. Ubuntu 9.10 und 12.04)

Abhängig vom Alter des Betriebssystems, auf dem ich den Build erstelle, benötigt die Binärdatei die eine oder die andere Version.

Gibt es eine Möglichkeit, es egal zu machen, oder sind die Unterschiede zwischen den libcryto-Versionen unüberwindbar?

+1

Soweit ich weiß, wird es aus eigener Erfahrung funktionieren, wenn Sie keine 1.0 Features (wie Zeitstempel) verwenden. Alles, was Sie tun müssen, ist eine Abhängigkeit von libssl-dev. Aber seit der Soname geändert hat, bedeutet eine Änderung in der Schnittstelle, müssen Sie es testen ... – Felipe

+0

@Felipe - Nein, die Hauptversionsnummer Änderung ist der Kern des Problems, die ausführbare Datei erfordert entweder 0.9.8 oder 1.0.0 , abhängig von der Betriebssystemversion, auf der es erstellt wurde. d. h. wo immer der libcrypt.so-Symlink auf die Build-Zeit zeigte. – fadedbee

+0

Ah, ich glaube ich habe es verstanden. Sie kompilieren Ihr Programm irgendwo (in 0.9.8 oder 1.0.0), und dann müssen Sie es irgendwo anders ausführen (wieder in entweder 0.9.8 oder 1.0.0).Ihre Build-Umgebung unterscheidet sich von Ihrer Laufzeitumgebung und beide können variieren, korrigieren? – Felipe

Antwort

3

Meiner Meinung nach möchten Sie eine Funktion von libcrypto.so.0.9.8 und einige von libcryto.so.1.0.0 verwenden. Wenn die meisten Funktionen von 1.0.0 benötigt werden oder bevorzugt werden, verlinken Sie diese mit libcrypto.so.1.0.0.

Und Sie benötigen möglicherweise eine Funktion von libcrypto.so.0.9.8 oder Sie haben andere gute Gründe, libcrypto.so.0.9.8 zu verwenden.

Meiner Ansicht nach, wenn Sie von der Bibliothek verknüpfen, erhalten Sie Linker Fehler (doppelte Symbole, da beide der Bibliothek die gleichen Symbole enthält).

Wenn Sie 0.9.8 verwenden müssen, dann laden Sie es dynamisch mit dlopen und erhalten Sie die Funktion Rückruf, die Sie mit dlsym verwenden möchten.

Dies kann wie folgt erreicht werden:

void * handle; 
/*reqd_callback is the callback of required function.*/ 
reqd_callback cb; 

handle = dlopen ("libcrypto.so.0.9.8", RTLD_LAZY); 
cb  = (reqd_callback)dlsym(handle, "reqd_function"); 
//Call the cb 
cb (parameters); 

//Close the library. 
dlclose(handle); 

Ich denke, das Ihren Zweck lösen kann. Wenn die Präferenz umgekehrt ist, invertiere die Bibliothek beim Verknüpfen und beim Laden durch das Programm.

+0

Danke, ich habe das bereits vor deiner Antwort implementiert, aber du bekommst das Bounty :-) Ich versuche zuerst libcrypto.so, dann libcrypto.so.1.0.0, dann libcrypto.so.0.9.8 und schließlich libcrypto. so.0.9.8e (RHEL 5). Ich brauche nur ein paar Hash-Funktionen in allen Versionen, auf die ich gestoßen bin. Dies gibt mir mehr als 5 Jahre Kompatibilität (wenn auf Etch gebaut) über RHEL/CentOS/Debian/Ubuntu/Fedora. Ich überprüfe Code für die dynamisch verknüpften Funktionen, nur für den Fall, dass sie in der zukünftigen Version von libcrypto geändert werden. P.S. http://www.virtsync.com – fadedbee

2

Können Sie eine weiche Verbindung herstellen, die auf libcrypto.so.0.9.8 oder libcryto.so.1.0.0 "zeigt". Geben Sie ihm einen generischen Namen und verwenden Sie diesen, dann wird die Version der Bibliothek, auf die der Link verweist, aufgenommen. Bei der App-Installation setzen Sie Ihren Softlink so, dass er auf die verfügbare Bibliotheksversion verweist. Ihre Software könnte bis zu 1.0.0 getestet werden, wenn die lib abwärtskompatibel genug ist, d. H. Sie verlassen sich nicht auf etwas in 1.0.0, das nicht in 0.9.8 ist, Ihr ok.

2

Sie können ssl-0.9.8 (nicht 1.x, da es einige Dinge enthält, die auf der älteren Version nicht funktionieren) neu erstellen und die Zeile im Makefile ändern, in der die finale gemeinsame Bibliotheksverknüpfung ausgeführt wird SONAME

recompile es mit dem SONAME geändert von libssl.so.0.9.8

libssl.so.0 es wird wie etwas aussehen: -Wl,-soname,libssl.so.0.9.8 Änderung es zu: -Wl,-soname,libssl.so.0

jetzt beim kompilieren Gegen diese Bibliothek werden die Binaries, die dagegen gebaut werden, nach libssl.so.0 suchen (which h ist als Symlink in beiden Versionen enthalten)

+0

RHEL 5.X hat keinen libcrypto.so Symlink. Es hat nur libcrypto.so.6 und libcrypto.so.0.9.8e iirc. – fadedbee

+0

Ich mochte die frühere Version dieser Antwort sehr. Wenn RHEL 5 nicht den libcrypto.so-Symlink hätte, hätte ich das akzeptiert. – fadedbee

+0

Ich habe libcrypto nicht erwähnt, weil die ursprüngliche Frage nach ssl gestellt wurde. Wenn Sie dies tun und direkt auf "-lssl", aber nicht auf "-lcrypto" verweisen (lassen Sie es zur Laufzeit dynamisch finden), dann zeigt objdump -x nur einen BENUTZTEN SONAME für ssl und da crypto eine Abhängigkeit ist, wird es wird dynamisch geladen, basierend auf dem NÄCHSTEN in welcher installierten libssl, die einen symbolischen Link für libssl.so.0 hat – technosaurus