2017-06-13 16 views
0

前文:この質問はオラクルに関するないが、代わりに私はGCC-4とgcc-6の基本的な違いを理解したいと思います位置独立コードの処理。gccの-fPIC -fPIE:GCC-4 betweenn違いとgcc-6

私はDebianで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は、利用可能なよりですので、私は遅かれ​​早かれ、これ以上の古いライブラリをリンクすることはできないのでしょうか?)

答えて

0

ほとんどの場合はgcc-6リンカは、デフォルトでは位置の独立した実行可能ファイルを作成します。問題は、-no-パイリンカフラグを追加することによって、次のように再現して解決することができます:確かに

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 

、-no-パイエラーなしで作品をリンクOracleで使用さgccのオプション、へを追加した後。

0

ブロエニの溶液は問題なく動作します。私はそれを動作させるために作られたいくつかの追加手順:

インストール時には、私はファイルを最初の行には

/opt/oracle/product/12.2.0/db1/bin/orald 

を編集し、オラクルからのデフォルトのリンカツールを変更し、私はGCCリンカーを使用することを余儀なくされ、追加します-no-パイオプション:

#if [ -z "$BASH_VERSION" -o -n "$ORALD_USE_GCC" ] ; then 
    exec gcc -no-pie "[email protected]" 
    exit 1 
#fi 

タグ:オラクル12cは、Debianのストレッチ

関連する問題