bekomme den Fehler „Neukompilieren mit -fPIC“

bekomme den Fehler „Neukompilieren mit -fPIC“

Nach ./configuredem Asterisk in CentOS gebe ich den Befehl make ein, erhalte jedoch den folgenden Fehler

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

Ich habe dies versucht ./configure CFLAGS=-fPIC, erhalte jedoch den gleichen Fehler wie oben.

Antwort1

An diesem Punkt in Asterisk versuchen Sie, eine dynamische Bibliothek zu erstellen. Da diese dynamische Bibliothek an jedem Speicherort geladen werden kann, muss alles verschiebbar sein. Das -fPICFlag steht für Position Independent Code, der Code wird so gestaltet, dass er unabhängig vom Ladeort ist – er kann überall geladen werden.

Als Teil dieses dynamischen Asterisk-Library-Builds wird versucht, den Lua-Interpreter einzubinden. Da es sich um eine dynamische Lib handelt, muss alles PIC-kompiliert werden. Aber Sie verwenden eine statische Lib von Lua, dienichtmit -fPIC erstellt. Dies wird abgelehnt, da die Lua-Objekte in der statischen Bibliothek nicht verschoben werden können.

Übrigens:deshalb -fPIChilft es nicht, etwas zum Asterisk-Build hinzuzufügen. Es sind nicht Ihre Asterisk-Codeobjekte, die inkompatibel sind (was von -fPIC betroffen sein kann), sondern liblua.a, insbesondere die von liblua.a getragenen Objekte (z. B. lapi.o). Außerdem erstellen Sie an diesem Punkt eine dynamische Bibliothek, und ich bin sicher, dass Sie bereits verschiebbare Codeflags wie -fPIC für die Asterisk-Objekte haben, die Sie an diesem Punkt zusammenführen möchten.

Ich sehe drei Lösungen.

  • Eine Möglichkeit besteht darin, Lua aus Ihrem Build zu entfernen. Wenn Sie es nicht unbedingt benötigen und eher denken, dass „es später Spaß machen könnte, damit zu spielen“, können Sie es möglicherweise tun, ohne die gewünschten Funktionen zu verlieren.

  • Eine andere Möglichkeit besteht darin, eine dynamische Version von liblua zu erhalten, liblua.soauf die in Ihrem Asterisk-Build verwiesen werden kann. Ich kenne Ihre Distribution nicht und kann Ihnen daher nicht sagen, wie Sie diese erhalten.

  • Die andere, noch nervigere Möglichkeit besteht darin, Lua und liblua.a mit -fPIC neu zu erstellen. Sie hätten möglicherweise Kompatibilitätsprobleme aufgrund inkonsistenter Build-Flags (was Sie erstellt haben und was sich sonst noch auf der Festplatte befindet), daher denke ich, dass es die bessere Option ist, eine liblua.so zu finden, die zu Ihrem aktuell erstellten Lua passt.

Wenn Sie liblua.so finden, sollten Sie sich hierfür das Linker-Flag „-rpath“ ansehen, insbesondere „-Wl,-rpath,/Pfad/zu/lua/libs“.

verwandte Informationen