2015-12-29 5 views
5

私はビルド中のライブラリを持っています。 私のMakefileのar rcs lib/libryftts.a $^GCCは実行可能なバイナリの代わりに共有オブジェクトを作成します

gcc -shared $^ -o lib/libryftts.so

:私はのいずれかを実行したときに、私のオブジェクトのすべてが連続してコンパイルとリンク。私も正常にインストールすることができます/usr/local/lib 私はnmでファイルをテストすると、すべての機能があります。

test: ELF 64-bit LSB shared object代わりのtest: ELF 64-bit LSB executable私が期待するよう: 私の問題は、私はgcc testing/test.c -lryftts -o test && file ./testまたはgcc testing/test.c lib/libryftts.a -o test && file ./test を実行すると、それは言うことです。私は間違って何をしていますか?

+0

'main'を含む' test.c'はありますか? @EugeneSh。 –

+0

はい、それはメインを含んでいます。 –

+2

奇妙な音。しかし、おそらく問題を診断するためにもっと多くの情報が必要です。最小のテストケースを作成し、問題を引き起こすために使用された正確なコードとビルドコマンドを投稿することをお勧めします。また、最後のコンパイル行を 'gcc -v'で実行して、gccが実際にどのようなコマンドとオプションを使用しているのかを正確に確認することもできます。 – kaylum

答えて

13

私は間違っていますか?

何もありません。

GCCがデフォルトで-pieバイナリをビルドするように設定されているようです。これらのバイナリは実際にはの共有ライブラリ(タイプET_DYN)ですが、通常の実行可能ファイルと同じように実行されます。

バイナリを実行して(動作する場合は)心配する必要はありません。

それとも、gcc -no-pie ...とあなたのバイナリをリンクすることができ、それはfileELF 64-bit LSB executableを言うだろうれるタイプET_EXECの非PIE実行可能ファイルを生成する必要があります。

+0

'gcc ... -v'を実行すると、設定で-pieが見えました。これは私が見ていたものを修正しました。情報をありがとう! –

+0

[Code :: Blocks](http://www.codeblocks.org/)でコンパイルしている人(私のような人)には、**リンカの設定→その他のリンカオプションに '-no-pie'を追加する必要があります* *、_not_ **コンパイラ設定→他のコンパイラオプション** - 個々のCファイルをコンパイルするときに '-no-pie'を追加しますが、最終実行ファイルをビルドするときは追加しません。 – GoBusto

+1

'-no-pie'を使用する場合は、' -fno-pie'を使用してより効率的なコードを取得する必要があります。 (https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allow-in-x86-64-linuxを参照) –

関連する問題