GNU/Linux >> Znalost Linux >  >> Linux

Kompilace se nezdaří s přemístěním R_X86_64_32 proti `.rodata.str1.8' nelze použít při vytváření sdíleného objektu

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 ...

Linux
  1. Příkaz lvremove selže s chybou „LVM – nelze odstranit otevřený logický svazek“

  2. CentOS/RHEL:Příkaz Mount selže s „mount:neobsahuje štítky SELinux“

  3. Jak zobrazit všechny sdílené knihovny používané spustitelnými soubory v Linuxu?

  1. Chyba Linuxu při načítání sdílených knihoven:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář

  2. dynamic_cast selže při použití s ​​dlopen/dlsym

  3. Odebrat sdílenou paměť posix, když se nepoužívá?

  1. Ssh uvnitř Ssh selže s „stdin:Is Not A Tty“?

  2. Kompilace dynamické sdílené knihovny s g++

  3. Lze mprotect() použít ke změně oprávnění .rodata?