6

Linux が組み込まれた「Seagate Central」NAS があります。

$ cat /etc/*release
MontaVista Linux 6, (.dev-snapshot-20130726)

この NAS で自分のアプリケーションを実行しようとすると、dmesg または /var/log/messages に通知がなく「強制終了」されます

$ cat /proc/cpuinfo
Processor       : ARMv6-compatible processor rev 4 (v6l)
BogoMIPS        : 279.34
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb02
CPU revision    : 4

Hardware        : Cavium Networks CNS3420 Validation Board
Revision        : 0000
Serial          : 0000000000000000

私のツールチェーンは

Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi

そして私のコンパイルスイッチは

-march=armv6k -mcpu=mpcore -mfloat-abi=softfp -mfpu=vfp

どのプロセスがアプリケーションを強制終了しているか、またはどの設定を変更する必要があるかを調べるにはどうすればよいですか?

PS: 単純な HelloWorld アプリケーションを作成しましたが、これも機能していません!

$ ldd Hello
$       not a dynamic executable


readelf -a Hello
=> http://pastebin.com/kT9FvkjE

readelf -a zip
=> http://pastebin.com/3V6kqA9b

更新 1

ハードフロートを使用して新しいバイナリをコンパイルしました

 Readelf output
 http://pastebin.com/a87bKksY

しかし、成功しません;(

私のアプリケーションの実行を妨げているのは、実際には「ロック」トピックだと思います。どのアプリケーションが私のものを殺したのかを知るにはどうすればよいですか? または、そのような機能を無効にするにはどうすればよいですか?

4

4 に答える 4

3

次のコンパイラ スイッチを使用します。

-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000

ツールチェーンに関するこのリンクも参照してください。

組み込みバイナリの 1 つ ( /usr/bin/nanoなど) に対してreadelf -aを実行すると、セクション ヘッダーの適切なテキスト セグメント オフセットと、プログラム ヘッダーのページ サイズ/配置を確認できます。上記のコンパイラ フラグは、自己コンパイルされたプログラムを組み込みバイナリの構造と一致させ、動作するようにテストされています。ARM gcc のデフォルトが 0x8000 であるのに対し、Seagate Central NAS は 0x10000 のページ サイズ/オフセットを使用しているようです。

編集:すでにreadelfを実行したようです。あなたのペーストビンショー

HelloWorld:[ 1] .interp           PROGBITS        00008134 000134 000013 00   A  0   0  1
       zip:[ 1] .interp           PROGBITS        00010134 000134 000013 00   A  0   0  1

値 10134-134=10000 (16 進数) は、正しいテキスト セグメント リンカー オプションを生成します。さらに下 (LOAD...) は配置指定子で、HelloWorld では 0x8000 ですが、zip ビルトインでは 0x10000 です。私の経験では、ソフトフロートは問題を引き起こしませんでした。

于 2014-07-06T15:50:33.970 に答える
1

出力が表示されますか?

アプリケーションは動的にリンクされていますか?

その場合は、verbose オプションを指定してダイナミック リンカーを実行します (プラットフォームのダイナミック リンカーの名前を確認する必要があります。Arch Linux の場合は ですldd)。

ldd --verbose 'your_program_name'

依存関係(共有ライブラリなど)が不足しているかどうかがわかります

走るreadelf -a 'your_program_name'

に記載されているファイルがRequesting program interpreter: /lib/ld-linux.so.2存在することを確認してください。この場合、そのファイル名は/lib/ld-linux.so.2

これで問題を解決できない場合は、質問にldd --verbose 'your_program_name'andの完全な出力を投稿してください。readelf -a 'your_program_name'

もう 1 つの問題は、NAS ソフトウェアが外部プログラムを強制終了することです。なぜそうなるのかはわかりませんが、ここでは大企業 (Seagate) について話しているのですが、彼らは時々世界がどのように機能するかについて奇妙な考えを持っています...

readelf のペーストビンを見た後、編集します。

私が見たところ、Hello 実行可能ファイルは zip 実行可能ファイルとは 2 つの点で異なります。

  • 動的にリンクされていないため、検索する問題が大量に発生します。

  • 2 つのプログラムの作成方法には違いがあります。zip はソフトフロートを使用せず、Hello は使用します。soft-float の依存関係は、次のコンパイラ スイッチのいずれかまたは両方が原因であると思われます。-mfloat-abi=softfp -mfpu=vfp

Hello フラグ: 0x5000202、エントリ ポイントあり、バージョン 5 EABI、ソフト フロート ABI

zip フラグ: 0x5000002、エントリ ポイント、Version5 EABI あり

私はどちらかから始めます:

  • Hello ビルドから soft-float オプションを削除するか、次のようにします。
  • ソフトフロート エミュレーション ライブラリがマシン上にあることを確認してください。これがどのライブラリに依存するのかはわかりませんが、MontaVista のソフトウェアに最後に触れたときにそれらを提供していたことを覚えています。MontaVista に触れてから 8 年以上が経過しているため、少し古い記憶の霧に覆われています。
于 2013-10-29T08:23:03.380 に答える