Udělejte to, co vám kompilátor říká, abyste udělali, tj. překompilujte pomocí -fPIC
. Chcete-li zjistit, co tento příznak dělá a proč jej v tomto případě potřebujete, přečtěte si Možnosti generování kódu příručky GCC.
Stručně řečeno, termín kód nezávislý na pozici (PIC) odkazuje na generovaný strojový kód, který je agnostický s adresou paměti, tj. nevytváří žádné předpoklady o tom, kde byl načten do RAM. Do sdílených objektů (SO) by měl být zahrnut pouze kód nezávislý na pozici, protože by měly mít schopnost dynamicky měnit své umístění v paměti RAM.
Nakonec si o tom můžete přečíst na Wikipedii taky.
V mém případě k této chybě došlo, protože make
příkaz očekával načtení sdílených knihoven (*.so
soubory) ze vzdáleného adresáře označeného LDFLAGS
proměnná prostředí. Omylem tam byly dostupné pouze statické knihovny (*.la
nebo *.a
soubory).
Můj problém tedy nespočíval v programu, který jsem kompiloval, ale ve vzdálených knihovnách, které se snažil načíst. Nepotřeboval jsem tedy přidávat žádný příznak (řekněme -fPIC
) ke kompilaci přerušené chybou přemístění. Spíše jsem překompiloval vzdálenou knihovnu, aby byly sdílené objekty dostupné.
V podstatě se jedná o maskovanou chybu nenalezen soubor.
V mém případě jsem musel odstranit špatně umístěný --disable-shared
přepněte do configure
vyvolání požadovaného programu, protože sdílené i statické knihovny byly vytvořeny jako výchozí.
Všiml jsem si, že většina programů staví oba typy knihoven současně, takže ten můj je pravděpodobně rohový případ. Obecně se může stát, že budete spíše muset povolit sdílené knihovny v závislosti na výchozích nastaveních.
Abych prozkoumal vaši konkrétní situaci s přepínači kompilace a výchozími nastaveními, přečetl bych si shrnutí, které se zobrazuje s ./configure --help | less
, obvykle v sekci Volitelné funkce. Často jsem zjistil, že toto čtení je spolehlivější než instalační příručky, které nejsou aktualizovány, zatímco se vyvíjejí závislé programy.
Opraveno pomocí -no-pie
možnost ve fázi linkeru:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...