8

組み込み(カスタム)ARMベースのLinuxシステム用にいくつかのCコードをコンパイルしようとしています。必要なもののように見えたので、arm-linux-gnueabi-gcc-4.4という名前のクロスコンパイラーを使用してUbuntuVMをセットアップしました。このgccを使用してコードをコンパイルすると、次のようなバイナリが生成されます。

$ file test1
test1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.31,
BuildID[sha1]=0x51b8d560584735be87adbfb60008d33b11fe5f07, not stripped

組み込みLinuxでこのバイナリを実行しようとすると、

$ ./test1
-sh: ./test1: not found

権限で十分です。バイナリ形式に何か問題があると想像することしかできないので、参考としていくつかの動作中のバイナリを調べました。

$ file referenceBinary
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped

いくつかの違いがあるように見えますが、正確に修正する必要があるものと、それを修正する方法を導き出す知識がありません。誰かがどの違いが重要であるかを説明できますか?

私が見たもう1つのことは、依存関係です。

$ ldd test1
    libc.so.6 => not found (0x00000000)
    /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

(興味深いことに、これはバイナリを実行できませんが、ターゲットシステムで機能します。)組み込みシステムには使用可能なものしかありませlibc.so.0ん。リンクしたいlibcバージョンをコンパイラーに伝える必要があると思いますが、私が理解しているように、gccは付属のバージョンに対してリンクしているだけです。これは正しいですか?私はそれについて何ができますか?

編集:これが私が使用するMakefileです:

CC=/usr/bin/arm-linux-gnueabi-gcc-4.4
STRIP=/usr/bin/arm-linux-gnueabi-strip          
CFLAGS=-I/usr/arm-linux-gnueabi/include             
LDFLAGS=-nostdlib
LDLIBS=../libc.so.0

SRCS=test1.c
OBJS=$(subst .c,.o,$(SRCS))

all: test1

test1: $(OBJS)
    $(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
    $(STRIP) main

depend: .depend

.depend: $(SRCS)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(OBJS)

include .depend
4

1 に答える 1

5

おそらくあなたがすべきことはlibc6、組み込みシステムにインストールすることです。同様の問題についてこのスレッドを読んでください。投稿#5の解決策は、次のものをインストールすることでした。

libc6_2.3.6.ds1-13etch9_arm.deb
linux-kernel-headers_2.6.18-7_arm.deb
libc6-dev_2.3.6.ds1-13etch9_arm.deb

もう1つのオプションはlibc、組み込みシステムからVMに取得し、それをgccリンカーに渡して-staticオプションを使用することです。

この解決策は、上記のスレッドでも言及されています。静的リンクについて詳しくは、こちらをご覧ください。

他に試すべきこと:

このスレッド-mabi=apcs-gnuでは、フラグを使用している場合は、makefileからフラグを削除することを提案しています。

この記事-nostdlibでは、コマンドラインからコンパイルする場合にfeedintgccにフラグを設定することをお勧めします。

arm-none-eabi-gccまたは、コンパイラの使用に切り替えることもできます。これに関するリファレンスは、ここここにあります。

于 2012-09-20T12:21:20.833 に答える