0

前文: この質問はOracle に関するものではなく、位置独立コードの処理における gcc-4 と gcc-6 の根本的な違いを理解したいと思います。

そこで、Debian stretchで Oracle 12c のインストールを試すことにしました。

gcc-6 とのリンク段階で、次のようなエラー メッセージが発行されます。

/usr/bin/ld: /opt/oracle/product/12.2.0/lib/libpls12.a(pci.o):
  relocation R_X86_64_32S against `.rodata.str1.4' can not be used when making a shared object;
  recompile with -fPIC.

ただし、gcc-4.9 を使用するようにコンパイラを切り替えると、すべてのリンクが問題なく行われます。

したがって、私の2つの質問:

  • gcc バージョン 4 と 6 の間で -fPIC と -fPIE のデフォルトに変更はありますか? バージョン 6 はデフォルトで 2 つのオプションを使用しているようです。
  • 私にとってもっと重要なこと: gcc バージョン 6 には、位置に依存しないコードの生成にバージョン 4 の動作を使用するオプションがありますか? (または、gcc-4 が利用できなくなったため、遅かれ早かれ古いライブラリにリンクできなくなるのでしょうか?)
4

2 に答える 2

0

ほとんどの場合、gcc-6 リンカはデフォルトで位置に依存しない実行可能ファイルを作成します。この問題は次のように再現でき、リンカー フラグ -no-pie を追加することで解決できます。

UNIX # gcc-6 -g -Wall -fno-pic -c helloworld.c -o helloworld.o

UNIX # gcc-6 -g -Wall helloworld.o -o helloworld
/usr/bin/ld: helloworld.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

UNIX # gcc-6 -g -Wall -no-pie helloworld.o -o helloworld

実際、 Oracle が使用する gcc オプションに-no-pieを追加すると、リンクはエラーなしで機能します。

于 2017-08-22T14:14:11.903 に答える