2

WIN 7 マシンに mips32 アーキテクチャ用の codesourcery クロス コンパイル ツールチェーンをインストールしました。最初に、MIPS32 に基づくルーター用の単純な「factorial」バイナリをコンパイルしたいと考えています。インターネットで少し検索したところ、MIPS32 ビッグエンディアンに基づいていることがわかりました。

#cat /proc/cpuinfo
system type             : 96338W2
processor               : 0
cpu model               : BCM6338 V1.0
BogoMIPS                : 239.20
wait instruction        : no
microsecond timers      : yes
tlb_entries             : 32
extra interrupt vector  : yes
hardware watchpoint     : no
unaligned access        : 1269919
VCED exceptions         : not available
VCEI exceptions         : not available

# cat /proc/version
Linux version 2.6.8.1 (root@WangHaiTao) (gcc version 3.4.2) #1 Wed Sep 2 10:13:53 CST 2009

ルーターの LIB ディレクトリには以下が含まれます。

ld-uClibc.so.0 libc.so.0 libcrypt.so.0 libcrypto.so.0.9.7 libdl.so.0 libm.so.0 libnvram.so libpsi.so libpsixml.so libresolv.so.0 libssl. so.0.9.7 libutil.so.0 libwlbcmcrypto.so libwlbcmshared.so libwlctl.so モジュール

ツールチェーン情報: (ホスト WIN 7 システム上)

C:\code>mips-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
COLLECT_LTO_WRAPPER=f:/program files/codesourcery/sourcery_codebench_lite_for_mi
ps_gnu_linux/bin/../libexec/gcc/mips-linux-gnu/4.6.3/lto-wrapper.exe
Target: mips-linux-gnu
Configured with: /scratch/cmoore/2012.03-63-linux-lite/src/gcc-4.6-2012.03/confi
gure --build=i686-pc-linux-gnu --host=i686-mingw32 --target=mips-linux-gnu --ena
ble-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with
-arch-32=mips32r2 --with-arch-64=mips64r2 --with-float=hard --with-mips-plt --en
able-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{save-t
emps: -fverbose-asm} -D__CS_SOURCERYGXX_MAJ__=2012 -D__CS_SOURCERYGXX_MIN__=3 -D
__CS_SOURCERYGXX_REV__=63 %{O2:%{!fno-remove-local-statics: -fremove-local-stati
cs}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}
}}' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu -
-enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2012.03-63' --wi
th-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=
/opt/codesourcery --with-sysroot=/opt/codesourcery/mips-linux-gnu/libc --with-bu
ild-sysroot=/scratch/cmoore/2012.03-63-linux-lite/install/host-i686-mingw32/mips
-linux-gnu/libc --with-libiconv-prefix=/scratch/cmoore/2012.03-63-linux-lite/obj
/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --with-gmp=/scratch/cmoore
/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr
--with-mpfr=/scratch/cmoore/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-
linux-gnu-i686-mingw32/usr --with-mpc=/scratch/cmoore/2012.03-63-linux-lite/obj/
host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --with-ppl=/scratch/cmoore/
2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr -
-with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with
-cloog=/scratch/cmoore/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux
-gnu-i686-mingw32/usr --with-libelf=/scratch/cmoore/2012.03-63-linux-lite/obj/ho
st-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --disable-libgomp --enable-po
ison-system-directories --with-build-time-tools=/scratch/cmoore/2012.03-63-linux
-lite/obj/tools-i686-pc-linux-gnu-2012.03-63-mips-linux-gnu-i686-mingw32/mips-li
nux-gnu/bin --with-build-time-tools=/scratch/cmoore/2012.03-63-linux-lite/obj/to
ols-i686-pc-linux-gnu-2012.03-63-mips-linux-gnu-i686-mingw32/mips-linux-gnu/bin
Thread model: posix
gcc version 4.6.3 (Sourcery CodeBench Lite 2012.03-63)



次のコンパイルパラメータを試しました:

  1. mips-linux-gnu-gcc -mips32 -muclibc -o factorial factorial.c

MIPSボックスで出力バイナリを実行すると、「ライブラリ 'libgcc_s.so.1'をロードできません」と出力されました。

  1. mips-linux-gnu-gcc -muclibc -mips32 -static-libgcc -s -o factorial factorial.c

出力を実行すると、「sigsegv」が出力されます。

ここで何が問題なのですか?どのコンパイラ パラメータを入力すればよいですか? 私を助けてください。

4

2 に答える 2

3

ファイルシステムに libgcc_s.so.1 がありますか? そうでない場合、ツールチェーンには、ファイル システムにコピーするフォルダーがあります。それを行う。

その場合は、LD_LIBRARY_PATH が正しく設定されていることを確認してください。

編集: 一般的な問題の解決

実行可能ファイルを作成するときは、ライブラリにリンクします。これらのライブラリは、実行可能ファイルを実行する環境にも存在する必要があります。したがって、一般的に組み込みシステムでは、3 つのものが一致する必要があります。

  1. カーネルヘッダー
  2. ツールチェーン
  3. ファイルシステム

ここにそれらがどのように関連しているかがあります

カーネルヘッダーは、最終的に何らかの形でプログラムに #include として使用されます。そのため、ツールチェーンが使用するヘッダーは、実際に実行されているものと一致する必要があり、ファイル システムに存在します。

ツールチェーンは、実行可能ファイルを作成できるように、リンク先のライブラリで構成されます [libc などを考えてください]。これらは、ファイルシステムであるランタイム環境に存在するものと同じでなければなりません

ツールチェーンは、カーネルに適した形式を作成する必要があります。実行形式。

したがって、一般に、実行しようとしているときにファイルシステムにファイルがない場合は、SDK またはツールチェーンから取得する必要があります。ファイルシステムにある場合は、ツールチェーンにそこから使用するように指示できます。

何らかの理由でファイルシステムにライブラリがない場合に問題を回避する 1 つの方法は、静的な実行可能ファイルをビルドすることです。しかし、自分が何をしているのかを知っていることを確認する必要があります。

EDIT:あなたが直面している特定の問題ファイルシステムが読み取り専用の場合、すでにすべてがそこにあり、開発するためのSDKが提供されています。それがない場合でも、ツールチェーンにファイルシステムのライブラリを使用させることで開発できます [-I、-L と考えてください]。

編集 2: ファイル システムは ucLibc のようです。あなたのツールチェーンは、libc に対して構築されているようです。あなたのミスマッチがあります。

現在、開発 SDK のない読み取り専用ファイル システムがあるようです。したがって、以下が機能するかどうかはわかりません。ツールチェーンは、ファイル システムのファイルのみを使用するように構成し、ucLibc 用に構成する必要があります。ルーター担当者が、開発に必要なすべてのファイルが rilesystem で利用可能であることを確認していれば、それで十分です。それ以外の場合は、sdk が必要です。説明については、上記の編集を参照してください。

于 2012-08-29T21:40:47.373 に答える
0

私はこれをうまくコンパイルしました

#include <iostream>
using namespace std;

int main() {
  cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
  return 0;
}

mips-linux-gnu-g++ -muclibc -mips32  main.cpp -o main
于 2013-03-01T18:20:29.137 に答える