2012-03-27 6 views
3

Linux 2.6.35のARMシステムでprelinkを実行しています。私はGlibc 2.12.2を使用しています。ライブラリとアプリケーションの実行ファイルをあらかじめリンクしたいと思います。しかし、glibcに直接依存するものはリンクできないようです。 prelinkのは/lib上で実行しようとすると、それにエラーアウト:Prelink error:レイアウトエラー:データのセクションサイズが小さすぎる

Could not write /lib/libc-2.12.2.so: Layout error: section size too small for data 

は私がこの問題を解決するか、おそらく/libに存在するものを除いて、すべてをprelinkをprelinkのを説得するためにそこに方法は何ですか?私は/etc/prelink.confのブラックリスト機能を認識していますが、そのディレクトリにある依存関係を見つけることができないため、prelinkはエラーになります。

編集:

ここでは私のprelink.confは、私は、フリースケールi.MX51により、プラットフォームの午前

 
~ # cat /etc/prelink.conf 
-h /usr/local/Qt-4.7.4/lib 
-h /usr/lib 
-h /lib 
-h /usr/local/dbus/lib 
-h /usr/local/sqlite/lib 
-h /usr/local/ncurses/lib 
-h /usr/local/expat/lib 
-h /usr/local/ssl/lib 

です。これはARM Cortex-8です。開発キットに付属しているGCC/G ++バージョンですべてをコンパイルしたので、ELFバイナリは32ビットと仮定します。

編集:

私はのを-lする-hフラグを変更し、リストの先頭にシステムLIBSを移動しました。私はまだ同じエラーが発生します。

私は装置上でプレリンクを実行していますが、私のクロスビルディングマシンでは実行していません。

LD_LIBRARY_PATHに/ libに含まれているとは/ usr/libに

しようとしました実行しているprelinkのよう: prelinkの-a prelinkの-amR

と同じ結果に両方の方法を得ました。

私はgcc 4.4.6クロスコンパイラを実行しています。 私はld 1.12.1 ldを実行しています。

+2

avaliableである、あなたは[ように専門家を見つけることが可能性が高くなります]あなた自身のプログラムを構築しているときは特にそうです。だから私は移行のためにこの質問にフラグを立てています(再投稿しないでください)。 – Gilles

+0

いいえ、問題ありません。この質問は実際にコードを書くことを伴わないので、私はSOモッズがここにそれを移したいと思った。私はそこにチャンスがあったと思ったが、ルールによってプレーしたいと思った。助けてくれてありがとう。 –

答えて

2

エラーLayout error: section size too small for dataは、https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230という行でlibelfで呼び出されます。

これはwrite_dso

if (elf_update (dso->elf, ELF_C_WRITE) == -1) 
    return 2; 

write_dsoにprelinkのことで呼び出されますが、いくつかの他の場所と一緒にプリリンクのmain.cに呼び出さupdate_dsoによって呼び出されます。

これは、再配置されるセクションデータのサイズが、再配置されるセクションサイズよりも大きいために発生します。

実行中のprelinkコマンドは何ですか?

prelink.cacheは何ですか?

バイナリ/ライブラリELF32またはELF64はありますか?

ファイルユーティリティが通知します。

gccのバージョン、binutilのバージョン、libelfとprelinkのバージョンは何ですか?

gcc -Vが表示されます。 ld -Vおよびprelink -Vに沿って。

LD_LIBRARY_PATHとは何ですか?

setまたはenvというコマンドが表示されます。

glibcはどのオプションでコンパイルされましたか?特に-fPICに関しては?

デバイス自体でプリリンクを実行していますか?クロスコンパイル環境で使用しますか?

プリリンク設定に-l行が表示されないのはなぜですか? -hの行は、ビルドルートにライブラリのディレクトリにシンボリックリンクがある場合に必要なものではないかもしれないシンボリックリンクをたどりますか?通常、/ libと/ usr/libのエントリは、prelink.confの中で、最初にhereのように表示されます。

仮想メモリを変換するには、prelinkを-mスイッチで実行していますか? /libのすべてをブラックリストに載せれば、/ libのライブラリにリンクしているライブラリやバイナリをあらかじめリンクすることはできないと思います。同様に、/lib/libc-2.12.2.soをブラックリストに登録しておくと、あらかじめリンクされているファイルには、そのライブラリもあらかじめリンクされている必要があるため、リンクされているものにリンクします。

さらに詳しい情報がなくても、言いにくいですが、プレリンクに渡された不正なスイッチや、プレリンクキャッシュや構成ファイルの同じディレクトリにある32ビットまたは64ビットのライブラリを混在させることに関連している可能性があります。ソースからソフトウェアを構築することは、ここにトピックですがリンクし、prelinkの上

の詳しい情報は、

+0

ありがとうございます。私が数日で開発マシンに戻ると、私はこれに答えることができます。 –

+0

あなたが求めているほとんどの情報で質問を更新しました。私はこのプラットフォーム用のglibcをビルドしませんでした。それは私がフラッシュするために燃えるルートファイルシステム上に来る。コンパイルされた-fPICオプションをどのように決定するのですか? –

+0

申し訳ありませんが、システムは編集内容を通知しないため、更新したことに気付かなかった。私はこれを後で見て、あなたにお返しします。 –

関連する問題