web-dev-qa-db-ja.com

g ++コンパイルエラー:共有オブジェクトを作成するときに「.rodata」を使用できません。 -fPICで再コンパイルする

私はコマンドを使用しています:
_g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a_

Debian 9でC++プログラムをコンパイルします。しかし、次のエラーメッセージが表示されます。/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status

私はすでにスレッドを見ました: 「。rodata.str1.8に対する再配置R_X86_64_32は共有オブジェクトの作成時に使用できません」でコンパイルが失敗します

ただし、_-fPIC_引数を追加しようとしましたが、奇妙なことに「-fPICで再コンパイル」と同じエラーメッセージが表示されます

任意のアイデアをいただければ幸いです。私は大学のRedHatシステムでこれをコンパイルしようとしましたが、そこでうまく動作します。依存関係が欠落している可能性があると考えていますが、答えが見つかりませんでした。

前もって感謝します

13
Polymer

Gccは位置に依存しない実行可能ファイルを生成しようとしているように見えるので、次のことを行わないでください。

g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a

g++は、システムでデフォルトで位置に依存しない実行可能ファイルを生成するようです。他のシステムでは、-pieが必要です。 -no-pieを使用すると、「通常の」(位置依存)実行可能ファイルが作成されます。

20
davmac
/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' \
can not be used when making a shared object; recompile with -fPIC

このリンカエラーは、静的ライブラリcsdocument.oのオブジェクトファイルlib/lib.aが位置独立コードではないため、PIEプログラムとリンクできないことを示しています。したがって、lib/lib.aのソースファイルを-fPICで再コンパイルし、静的ライブラリを再構築してから、PIEプログラムにリンクする必要があります。ライブラリのソースを管理できない場合は、サプライヤーにPICビルドをリクエストしてください。

(他の人は、なぜ共有ライブラリではないのでPIEターゲットを構築する必要があるのか​​疑問に思っています。Debian9では、GCCは デフォルトではPIE実行可能ファイル を生成します。 17.04時点のUbuntu)

7
Mike Kinghan

これを追加するとうまくいきました。

g++ --std=c++11 -no-pie

コンパイルフラグに-fPICも追加しました。

0
nithin krishna