GNU/Linux >> Linux の 問題 >  >> Linux

再配置でコンパイルが失敗する R_X86_64_32 に対する `.rodata.str1.8' は、共有オブジェクトを作成するときに使用できません

コンパイラが指示することを実行します。つまり、-fPIC で再コンパイルします。 .このフラグの機能と、この場合にフラグが必要な理由については、コード生成オプションをご覧ください。

簡単に言えば、位置に依存しないコードという用語 (PIC) は、メモリ アドレスに依存しない生成されたマシン コードを指します。つまり、RAM にロードされた場所について何の仮定も行いません。 RAM 内の位置を動的に変更できる必要があるため、位置に依存しないコードのみが共有オブジェクト (SO) に含まれることになっています。

最後に、Wikipedia でそれについて読むことができます


私の場合、このエラーは make が原因で発生しました コマンドは共有ライブラリを取得することを期待していました (*.so ファイル) LDFLAGS で示されるリモート ディレクトリから 環境変数。誤って、静的ライブラリしか利用できませんでした (*.la または *.a ファイル)。

したがって、私の問題は、コンパイルしていたプログラムにはありませんでしたが、取得しようとしていたリモート ライブラリにありました。そのため、フラグを追加する必要はありませんでした (-fPIC ) 再配置エラーによって中断されたコンパイルに。むしろ、共有オブジェクトが使用できるようにリモート ライブラリを再コンパイルしました。

基本的に、ファイルが見つからないというエラーが偽装されています。

私の場合、間違った --disable-shared を削除する必要がありました configure に切り替える 共有ライブラリと静的ライブラリの両方がデフォルトで構築されているため、必要なプログラムの呼び出し。

ほとんどのプログラムが両方のタイプのライブラリを同時に構築していることに気付いたので、私の場合はおそらくまれなケースです。一般に、デフォルトによっては、共有ライブラリを有効にする必要がある場合があります。

コンパイル スイッチとデフォルトで特定の状況を調べるには、./configure --help | less で表示される概要を読み上げます。 、通常はオプション機能のセクションにあります。依存関係プログラムが進化しても更新されないインストール ガイドよりも、この読み方が信頼できることがよくあります。


-no-pie で修正 リンカー段階のオプション:

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

Linux
  1. Ssh Inside Sshは「stdin:Is Not A Tty」で失敗しますか?

  2. lvremove コマンドがエラー「LVM – 開いている論理ボリュームを削除できません」で失敗する

  3. mprotect() を使用して .rodata の権限を変更できますか?

  1. CentOS/RHEL:マウント コマンドが「mount:does not contain SELinux labels」で失敗する

  2. g++ を使用した動的共有ライブラリのコンパイル

  3. 共有ライブラリの読み込み中の Linux エラー:共有オブジェクト ファイルを開けません:そのようなファイルまたはディレクトリはありません

  1. read(2) は EOF でないときにゼロを返すことができますか?

  2. 警告:静的ライブラリに対する共有ライブラリのリンクは移植可能ではありませんの意味は何ですか?

  3. &を使用してバックグラウンドで実行すると、Python スクリプトの Nohup が機能しない