3

Linux 2.6.35 を搭載した ARM システムで prelink を実行しています。私は Glibc 2.12.2 を使用しています。ライブラリとアプリケーションの実行可能ファイルを事前にリンクしたいと考えています。ただし、glibc に直接依存しているものはリンクできないようです。prelink を で実行しようとすると/lib、次のエラーが発生します。

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

これを修正する方法、または prelink に存在するもの以外のすべてを prelink するように説得する方法はあります/libか? のブラックリスト機能については認識して/etc/prelink.confいますが、そのディレクトリにある依存関係が見つからないため、プレリンクでエラーが発生します。

編集:

これが私のprelink.confです

~ # 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

Freescale の i.MX51 プラットフォームを使用しています。ARM Cortex-8 です。開発キットに付属の GCC/G++ バージョンですべてをコンパイルしたので、ELF バイナリは 32​​ ビットであると想定しています。

編集:

-h フラグを -l に変更し、システム ライブラリをリストの先頭に移動しました。それでも同じエラーが発生します。

クロス ビルディング マシンではなく、デバイスで prelink を実行しています。

LD_LIBRARY_PATH には /lib と /usr/lib が含まれます

prelink を次のように実行してみました: prelink -a prelink -amR

どちらの方法でも同じ結果が得られました。

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

4

1 に答える 1

2

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

これは、write_dsoのprelinkによって呼び出されます

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

write_dso他のいくつかの場所と一緒にprelinkのmain.cupdate_dsoで呼び出されるによって呼び出されます。

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

どのprelinkコマンドを実行していますか?

prelink.cacheは何ですか?

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

ファイルユーティリティが教えてくれます。

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

gcc -V教えてくれます。と一緒ld -Vprelink -V

あなたは何LD_LIBRARY_PATHですか?

setorコマンドで通知されenvます。

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

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

プリリンク構成に行がないのはなぜ-lですか?-hビルドルートのライブラリディレクトリにシンボリックリンクがある場合、行はシンボリックリンクをたどりますが、これは希望どおりではない可能性がありますか?また、通常、/libおよび/usr / libエントリは、ここの例のようにprelink.confの最初に配置されます。

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

可能な修正については、詳細情報がないと言うのは難しいですが、プレリンクに渡された誤ったスイッチ、またはプレリンクキャッシュまたは構成ファイルの同じディレクトリにある32ビットまたは64ビットライブラリの混合に関連している可能性があります。

リンクとプレリンクに関する詳細情報が利用可能です

于 2012-03-31T21:28:46.167 に答える