2017-12-07 4 views
0

Ich habe ein einfaches Server-Programm mit Socket-Funktionen geschrieben. Bei der Kompilierung mit g++ wird ein undefinierter Symbolfehler für Senden, __xnet_socket, listen, accept, __xnet_bind angezeigt.Auf Solaris, wenn mit g ++ kompiliert, werden socket() und bind() nicht mit dlsym() abgefangen

Warum die Symbole für Socket und Bindung anders sind als andere. Wenn das Programm unter Verwendung von gcc kompiliert wird, tritt dieser "xnet" Unterschied nicht auf. Dieser Verbindungsfehler gilt, wenn er mit libsocket.so verknüpft ist.

Eigentlich schreibe ich eine gemeinsam genutzte Bibliothek, die diese Socket-APIs überlastet und sie unter Verwendung dlsym() abfangen. Wenn diese Bibliothek unter Solaris mit gcc kompiliert wird, durchlaufen diese Aufrufe die Bibliothek. Bei der Kompilierung mit g++ werden die Aufrufe und bind() jedoch nicht abgefangen, sondern alle anderen APIs durchlaufen die Bibliothek.

Hat libxnet.so etwas damit zu tun? Kann Dtrace helfen?

+1

* Wenn es mit g ++ kompiliert wird, gibt es einen undefinierten Symbolfehler zum Senden, __xnet_socket, listen, accept, __xnet_bind. * Das klingt, als ob du nicht mit '-lxnet' verknüpfst. Sende deinen Linkbefehl [s]. –

Antwort

0

Sie müssen mit libsocket (über -lsocket) verknüpfen, damit der Linker diese Funktionen übernimmt. libxnet ist eine Filterbibliothek in 11.3; Die Funktionen wurden von libxnet in libsocket, libnsl und libc verschoben.

Ich habe in der Vergangenheit beim Erstellen von OSS unter Solaris gefunden, dass das Anhängen von -lsocket -lnsl an LDLIBS mich in der Regel mit Leichtigkeit durch die Konfiguration und den Build bringt. Der Linker ist intelligent genug, um unnötige Referenzen aus der Ausgabe zu entfernen.

Verwandte Themen