2016-10-12 9 views
1

ツールセットTizenでzlibをビルドしようとしています。ビルドプロセスの一環として、ソースファイルはarm-linux-gnu-eabi-gcc -cでオブジェクトにコンパイルされ、libtoolのアーカイブに統合されますが、libtoolには失敗し、.oファイルのそれぞれがis not an object file (not allowed in a library)に渡されると不平を言います。オブジェクトファイルではなくELFを生成する静的ライブラリを作成できません

検査の結果、arm-linux-gnu-eabi-gcc -cは、私が以前に見たことのないオブジェクトファイルではなくELFファイルを生成していることがわかりました。 -c -vをコンパイラに渡すと、リンカが呼び出されていないことがわかります。なぜELF形式ですか?

arm-linux-gnu-eabi-gcc -Sの後にarm-linux-gnu-eabi-asを呼び出してみると、アセンブラ自体がELFファイルを生成していることがわかりました。ここ

は、例えば次のとおり

% echo "int main(void) { return 0; }" > main.c 
% arm-linux-gnueabi-gcc main.c -S -o main.s 
% arm-linux-gnueabi-as main.s -o main.o 
% file main.o 
main.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped 

Tizenツールセットは、4つのコンパイラ({I386、アーム}及び{4.6,4.9})を含みます。 4人とも同じように行動します。

少なくともarm-linux-gnueabi-gccは、それに多くの.o ELFファイルを渡すことができ、正しくリンクされているように見えます。しかし、私はまだlibtoolで静的ライブラリにアーカイブできるように、実際のオブジェクトファイルを生成する必要があります。助言がありますか? ELFおよびオブジェクトファイルは、排他的ではなく、およびLinux 上のすべてのオブジェクトファイルがELFです:。

答えて

1

は、あなたは非常にが混乱している

、ELFファイルではなく、オブジェクト・ファイルを生成していますつまり、これは期待どおりに動作しています。 ET_REL(再配置可能オブジェクトファイル)、ET_DYN(共有ライブラリ)とET_EXEC(実行ファイル):

ELFファイルは別の型を持つことができます。私はまだ、彼らは問題がlibtoolは、非ネイティブELF.oを認識しない可能性があるlibtoolの

と静的ライブラリにアーカイブできるように、実際のオブジェクト・ファイルを生成できるようにする必要があり

ファイルをアーカイブライブラリに入れることができます。

一般に、libtoolは、問題に関係なく、ほとんどの場合、が間違っているです。そのstated goalは、「一貫性のある移植可能なインターフェイスの背後にある共有ライブラリを使用することの複雑さを隠す」ことです。私の経験では、すべてのプラットフォームでその目標を達成することは劇的に失敗します。

確かにあなたがだけがアーカイブライブラリに.oファイルの束を入れたい場合は、それを行うための正しい方法は何の問題もないはずである単に*-linux-gnueabi-arを使用することです。

+0

'libtool'に関する興味深い考え。私は自分で使ったことはありませんが、多くのプロジェクトはそれを使用しているようですが、私はここで 'zlib 'がそれを望んでいるので単純に使用しています。 –

+0

私はオブジェクトが 'ELF'ファイルであることを知っていたと思いますが、ビルドプロセスでの吹き飛ばしで忘れてしまっていました。ご説明ありがとうございます。私は環境変数 'AR'が適切に定義されていることを保証することで問題を解決し、' libtool'はあなたが参照した非ネイティブ 'ar'を呼び出すことができました。 –

関連する問題