私の最終的な目標は、Synology DS107+ である私の NAS 用に rtorrent をコンパイルすることです。クロス コンパイルに慣れるために、helloworld をコンパイルしてみました。これは、私のような初心者にとってはすでに大きなハードルであることが判明しました。
プログラムを実行すると、セグメンテーション違反が発生します。gcc-arm-none-eabiを使用して、Ubuntu x84_64 でコンパイルしました。
ターゲット用にプログラムをコンパイルするには、どのツールが必要ですか? また、「Linux から ARM-ELF へのクロス コンパイル (ARM926EJ-S/MT7108)」も参照し、gcc が _exit が宣言されていないと訴えたため、回避策が必要でした。
以下に、より詳細な情報があります。
/proc/cpuinfo
Processor : ARM926EJ-Sid(wb) rev 0 (v5l)
BogoMIPS : 499.71
Features : swp half thumb fastmult vfp edsp
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 0
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format C
Cache format : Harvard
I size : 32768
I assoc : 1
I line length : 32
I sets : 1024
D size : 32768
D assoc : 4
D line length : 32
D sets : 256
Hardware : MV-88fxx81
Revision : 0000
Serial : 0000000000000000
uname -a
Linux DiskStation 2.6.15 #1637 Sat May 4 05:59:19 CST 2013
armv5tejl GNU/Linux synology_88f5281_107+
dmesg (私にとって有益と思われる head からのスニペット)
Linux version 2.6.15 (root@build2) (gcc version 3.4.3 (CSL 2005Q1B) (Marvell 2006Q3))
#1637 Sat May 4 05:59:19 CST 2013
CPU: ARM926EJ-Sid(wb) [41069260] revision 0 (ARMv5TEJ)
Machine: MV-88fxx81
...
Synology Hareware Version: DS107v20
Memory policy: ECC disabled, Data cache writeback
...
CPU0: D VIVT write-back cache
CPU0: I cache: 32768 bytes, associativity 1, 32 byte lines, 1024 sets
CPU0: D cache: 32768 bytes, associativity 4, 32 byte lines, 256 sets
readelf -h busybox (デバイスから取得)
ELF Header:
Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: ARM
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8de0
Start of program headers: 52 (bytes into file)
Start of section headers: 1319468 (bytes into file)
Flags: 0x602, has entry point, GNU EABI, software FP, VFP
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 3
Size of section headers: 40 (bytes)
Number of section headers: 20
Section header string table index: 19
編集:コマンドライン
オプションを使用しました-march=armv5te -mtune=arm926ej-s -mno-long-calls -msoft-float -static
。また、 mtuneをmcpuに置き換えたmarc oderを省略して実験しました。staticがなければ、not foundと表示されます。また、Debian パッケージのバイナリを試し、armel しました。たとえば、私の HTC Desire S (armv7l) で正常に動作するbusybox-staticも segfault になります。-mfpu=vfp
使用:
arm-linux-gnueabi-gcc
→ セグメンテーション違反arm-none-eabi-gcc
→ セグメンテーション フォールト (または不正な命令、まれにいつ発生するかわかりません)- CodeBench はまだ試していません。
私が試したコードは次のとおりです。
# include <stdlib.h>
void _exit (int x) { while (1) {} } // only needed for arm-none-eabi-gcc
int main (int argc, char* argv[]) {
return 47;
}