hard-floatでコンパイル(buildroot + kernel)

前々回から Raspberry Pi 上で動くrootfsをbuildrootを使って作成していますが、今更ですが、コンパイラが soft-float版 になっているのに気がつきました。buildroot の raspberrypi_defconfig を信じきっていたのが徒となったのです。Raspberry Pi は hard-float に対応しているので、宝の持ち腐れになっては本末転倒です。なので、hard-float に対応したコンパイラを使って buildroot をコンパイルする事にしました。

と言っても、buildrootにはarmv6+vfp版のコンパイラは選択項目にありません。なのでクロスコンパイラを用意する必要があります。armv6+vfp版のgccは結構落ちていたりするのでそれを使うのも有りですが、どうせなら自分で作ってしまえと思いクロスコンパイラを作成するところから始めました。まぁ、これがドツボにはまる原因となったのですが。

PC-Linux環境(VMware等でも可)を持っているなら binutils,gcc,glibc,mpfr,gmp,mpc,isl,cloog のソースコードを取得してそれぞれをコンパイルしてやればできあがり……なのですが、それぞれのバージョンを合わせたりパッチをあてたりする必要があったりで大変なのです。そこで、今回は crosstool-NG というツールを使うことにしました。このツールをインストールするとメニューを選択することで目的のクロスコンパイラを作成することができるのです! サポートしていればですが。

まずは crosstool-NG 自体のコンパイルとインストールです。コンパイルに必要なパッケージはもっと少ないのですが、この後の作業の事も考えて一気にインストールしています。

$ sudo apt-get install flex bison automake libtool libncurses5-dev texinfo lzma gawk cvs patch g++ gperf subversion build-essential
$ mkdir ./tools
$ cd ./tools/
$ git clone git://crosstool-ng.org/crosstool-ng
$ cd crosstool-ng/
$ git checkout crosstool-ng-1.20.0
$ ./bootstrap
$ ./configure --prefix=/home/jujurou/tools/crosstool-ng-1.20.0
$ make
$ make install


毎度使うツールでもないのでインストール先をhome下にしました。使うときは指定先にパスを通します。作業用ディレクトリを作成してクロスコンパイラの作成です。

$ export PATH=/home/jujurou/tools/crosstool-ng-1.20.0/bin:$PATH
$ cd ../
$ mkdir gcc-rpi
$ cd ./gcc-rpi/
$ ct-ng menuconfig
$ ct-ng build


menuconfig では次の様に指定しました。
書いてない部分はデフォルトの値にしています。
Linux kernel version はこの後で作成するkernelのバージョンに近い物を選択しています。

Paths and misc options  --->
[*] Try features marked as EXPERIMENTAL
Prefix directory
${HOME}/tools/x-tools/${CT_TARGET}

Target options --->
Target Architecture
(X) arm
[*] Use the MMU
Endianness:
(X) Little endian
Bitness:
(X) 32-bit
Architecture level
armv6zk
Emit assembly for CPU
arm1176jzf-s
Tune for CPU
arm1176jzf-s
Use specific FPU
vfp
Floating point:
(X) hardware (FPU)
Default instruction set mode
(X) arm
[*] append 'hf' to the tuple (EXPERIMENTAL)

Toolchain options --->
Tuple's vendor string
rpi

Operating System --->
Target OS
(X) linux
Linux kernel version
(X) 3.12.24 (longterm)

Binary utilities --->
binutils version
(X) 2.24 (EXPERIMENTAL)

C-library --->
C library
(X) eglibc
eglibc version
(X) 2_18

C compiler --->
[*] Show Linaro versions
gcc version
(X) linaro-4.8-2014.01
[*] C++


ct-ng build を実行すると、各ソースコードを取得して来てコンパイルし、指定先にインストールまでしちゃいます。これにはチョッとビックリしました。私の環境では、/home/jujurou/tools/x-tools/arm-rpi-linux-gnueabihf 下にインストールされました。

念の為、浮動小数点演算を使用したプログラムをコンパイルして、逆アセンブルしてみたところ、vfp用の命令が入っていることを確認出来ました。

841c:       ed1b6b03        vldr    d6, [fp, #-12]
8420: ed9f7b12 vldr d7, [pc, #72] ; 8470
8424: ee267b07 vmul.f64 d7, d6, d7
8428: ed0b7b03 vstr d7, [fp, #-12]


これでarmv6+vfp用のクロスコンパイラの作成完了です。
実際にはこのコンパイラでコンパイルした物をraspbian上で実行して動作することを確認しています。実行時のログとかは取ってませんが…。


クロスコンパイラが準備できたということで、本命のbuildrootをコンパイルします。make menuconfig の選択項目以外は前々回の内容と同じです。

Target options  --->
Target Architecture
(X) ARM (little endian)
Target Architecture Variant
(X) arm1176jzf-s
Target ABI
(X) EABIhf
Floating point strategy
(X) VFPv2
ARM instruction set
(X) ARM

Build options --->
Download dir
$(TOPDIR)/../dl

Toolchain --->
Toolchain type
(X) External toolchain
Toolchain
(X) Custom toolchain
Toolchain origin
(X) Pre-installed toolchain
Toolchain path
/home/jujurou/tools/x-tools/arm-rpi-linux-gnueabihf
Toolchain prefix
arm-rpi-linux-gnueabihf
External toolchain kernel headers series
(X) 3.12.x
External toolchain C library
(X) glibc/eglibc
[*] Toolchain has C++ support?
[*] Enable MMU support
Target Optimizations
-pipe -mtune=arm1176jzf-s -march=armv6zk

System configuration --->
[*] Run a getty (login prompt) after boot
getty options --->
TTY port
ttyAMA0
Baudrate
(X) 115200
TERM environment variable
vt100

Kernel --->
[*] Linux Kernel
Kernel version
(X) Custom Git repository
URL of custom repository
git://github.com/raspberrypi/linux.git
Custom repository version
c256eb9968c8997dce47350d2075e42f1b3991d3
Defconfig name
bcmrpi_quick
Kernel binary format
(X) zImage

Target packages --->
Hardware handling --->
Firmware --->
[*] rpi-firmware
Firmware to boot
(X) default


この設定ではkernelのコンパイルとFirmwareの取得も行う事にしています。ここではまった事が2点あります。1つが hard-float専用コンパイラを使用したが故に発生した事で、もう1つは…buildrootのせいです。

これ、そのままmakeを行うと以下のエラーが出てしまいます。

arm-rpi-linux-gnueabihf-gcc: error: -mfloat-abi=soft and -mfloat-abi=hard may not be used together


これは「soft-floatなんて処理できないぜ」と言っているのです。ま~、コンパイラをmulti-lib対応してませんしね。そもそもsoft-floatを要求するのは誰だ! と思ったら、kernelでした。こいつは厄介で、multi-lib対応しないとダメかな……と思っていたら、何と ld-linux.so.3 というライブラリを用意すれば何とかなるらしいのです。

このあたりの情報を見ると、かなり強引ではありますが、hard-float版のライブラリ(ld-linux-armhf.so.3)へのシンボリックリンクを作成するといった荒技があるみたいです。

ln -s ./ld-linux-armhf.so.3 ./ld-linux.so.3


このようにしておいてmakeをすると程なくしてコンパイル完了となります。
それぞれのファイルをSDカードに入れて起動させると、無事に起動しました。あっ、出力先をttyAMA0に変更するのを忘れないようにしてください。

Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.12.28-quick (jujurou@ubuntu) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG 1.20.0) ) #1 PREEMPT Sun Feb 15 09:15:49 JST 2015
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: BCM2708
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 104648
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=720 bcm2708_fb.fbheight=480 bcm2708.boardrev=0xf bcm2708.serial=0xb9e9487d smsc95xx.macaddr=B8:27:EB:E9:48:7D sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.fiq_fix_enable=1 sdhci-bcm2708.sync_after_dma=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootwait
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[ 0.000000] Memory: 411552K/421888K available (3923K kernel code, 195K rwdata, 1684K rodata, 135K init, 610K bss, 10336K reserved)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xda000000 - 0xff000000 ( 592 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xd9c00000 ( 412 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0581fa4 (5608 kB)
[ 0.000000] .init : 0xc0582000 - 0xc05a3d38 ( 136 kB)
[ 0.000000] .data : 0xc05a4000 - 0xc05d4ca0 ( 196 kB)
[ 0.000000] .bss : 0xc05d4cac - 0xc066d6d8 ( 611 kB)
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] NR_IRQS:394
[ 0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms
[ 0.000000] Switching to timer-based delay loop
[ 0.000000] Console: colour dummy device 80x30
[ 0.000471] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
[ 0.000494] pid_max: default: 32768 minimum: 301
[ 0.000827] Mount-cache hash table entries: 512
[ 0.001564] CPU: Testing write buffer coherency: ok
[ 0.001955] Setting up static identity map for 0xc03daae0 - 0xc03dab3c
[ 0.003530] devtmpfs: initialized
[ 0.018901] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[ 0.019504] regulator-dummy: no parameters
[ 0.019778] NET: Registered protocol family 16
[ 0.024680] DMA: preallocated 4096 KiB pool for atomic coherent allocations
[ 0.025026] cpuidle: using governor ladder
[ 0.025048] cpuidle: using governor menu
[ 0.025448] bcm2708.uart_clock = 0
[ 0.026770] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[ 0.026790] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.026805] mailbox: Broadcom VideoCore Mailbox driver
[ 0.026903] bcm2708_vcio: mailbox at f200b880
[ 0.026984] bcm_power: Broadcom power driver
[ 0.027003] bcm_power_open() -> 0
[ 0.027014] bcm_power_request(0, 8)
[ 0.527719] bcm_mailbox_read -> 00000080, 0
[ 0.527737] bcm_power_request -> 0
[ 0.527749] Serial: AMBA PL011 UART driver
[ 0.527905] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 0.847568] console [ttyAMA0] enabled
[ 0.872958] bio: create slab at 0
[ 0.878275] SCSI subsystem initialized
[ 0.882352] usbcore: registered new interface driver usbfs
[ 0.888042] usbcore: registered new interface driver hub
[ 0.893529] usbcore: registered new device driver usb
[ 0.898992] Advanced Linux Sound Architecture Driver Initialized.
[ 0.906136] Switched to clocksource stc
[ 0.910302] FS-Cache: Loaded
[ 0.913408] CacheFiles: Loaded
[ 0.928427] NET: Registered protocol family 2
[ 0.934149] TCP established hash table entries: 4096 (order: 3, 32768 bytes)
[ 0.941502] TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.948065] TCP: Hash tables configured (established 4096 bind 4096)
[ 0.954489] TCP: reno registered
[ 0.957766] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.963611] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.970230] NET: Registered protocol family 1
[ 0.975018] RPC: Registered named UNIX socket transport module.
[ 0.981031] RPC: Registered udp transport module.
[ 0.985732] RPC: Registered tcp transport module.
[ 0.990459] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.997600] bcm2708_dma: DMA manager at f2007000
[ 1.002302] bcm2708_gpio: bcm2708_gpio_probe c05b0150
[ 1.007719] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB)
[ 1.018629] FS-Cache: Netfs 'nfs' registered for caching
[ 1.024332] NFS: Registering the id_resolver key type
[ 1.029600] Key type id_resolver registered
[ 1.033786] Key type id_legacy registered
[ 1.038185] msgmni has been set to 803
[ 1.043360] io scheduler noop registered
[ 1.047438] io scheduler deadline registered
[ 1.051734] io scheduler cfq registered (default)
[ 1.056860] BCM2708FB: allocated DMA memory 59540000
[ 1.061863] BCM2708FB: allocated DMA channel 0 @ f2007000
[ 1.072563] Console: switching to colour frame buffer device 90x30
[ 1.083115] bcm2708_rng_init=da41a000
[ 1.094895] brd: module loaded
[ 1.102348] loop: module loaded
[ 1.105749] vchiq: vchiq_init_state: slot_zero = 0xda004000, is_master = 0
[ 1.113797] usbcore: registered new interface driver ax88179_178a
[ 1.120269] usbcore: registered new interface driver smsc95xx
[ 1.126253] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 1.332359] Core Release: 2.80a
[ 1.335512] Setting default values for core params
[ 1.340404] Finished setting default values for core params
[ 1.546137] Using Buffer DMA mode
[ 1.549458] Periodic Transfer Interrupt Enhancement - disabled
[ 1.555278] Multiprocessor Interrupt Enhancement - disabled
[ 1.560867] OTG VER PARAM: 0, OTG VER FLAG: 0
[ 1.565223] Dedicated Tx FIFOs mode
[ 1.568965] WARN::dwc_otg_hcd_init:1042: FIQ DMA bounce buffers: virt = 0xda422000 dma = 0x5958c000 len=9024
[ 1.578846] FIQ FSM acceleration enabled for :
[ 1.578846] Non-periodic Split Transactions
[ 1.578846] Periodic Split Transactions
[ 1.578846] High-Speed Isochronous Endpoints
[ 1.595605] WARN::hcd_init:473: FIQ at 0xc02d1190
[ 1.600343] WARN::hcd_init:474: FIQ ASM at 0xc02d1468 length 36
[ 1.606298] WARN::hcd_init:500: MPHI regs_base at 0xda41c000
[ 1.611966] dwc_otg bcm2708_usb: DWC OTG Controller
[ 1.616917] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
[ 1.624190] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
[ 1.629736] Init: Port Power? op_state=1
[ 1.633654] Init: Power Port (0)
[ 1.637190] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.643980] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.651239] usb usb1: Product: DWC OTG Controller
[ 1.655942] usb usb1: Manufacturer: Linux 3.12.28-quick dwc_otg_hcd
[ 1.662233] usb usb1: SerialNumber: bcm2708_usb
[ 1.667715] hub 1-0:1.0: USB hub found
[ 1.671532] hub 1-0:1.0: 1 port detected
[ 1.676989] bcm2708 watchdog, heartbeat=10 sec (nowayout=0)
[ 1.682805] bcm2835-cpufreq: min=700000 max=700000 cur=700000
[ 1.688731] bcm2835-cpufreq: switching to governor powersave
[ 1.694393] bcm2835-cpufreq: switching to governor powersave
[ 1.700201] sdhci: Secure Digital Host Controller Interface driver
[ 1.706423] sdhci: Copyright(c) Pierre Ossman
[ 1.710956] mmc-bcm2835: Unable to initialise DMA channels. Falling back to PIO
[ 1.756191] Load BCM2835 MMC driver
[ 1.759909] sdhci-pltfm: SDHCI platform and OF driver helper
[ 1.765852] usbcore: registered new interface driver usbhid
[ 1.771725] usbhid: USB HID core driver
[ 1.783840] TCP: cubic registered
[ 1.787284] NET: Registered protocol family 17
[ 1.793960] Key type dns_resolver registered
[ 1.807001] regulator-dummy: incomplete constraints, leaving on
[ 1.818172] ALSA device list:
[ 1.821154] #0: bcm2835 ALSA
 1.824650] Waiting for root device /dev/mmcblk0p2...
[ 1.843418] mmc0: host does not support reading read-only switch. assuming write-enable.
[ 1.853720] mmc0: new high speed SDHC card at address 59b4
[ 1.859747] mmcblk0: mmc0:59b4 NCard 29.4 GiB
[ 1.865718] mmcblk0: p1 p2
[ 1.868791] Indeed it is in host mode hprt0 = 00021501
[ 1.938015] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
[ 1.947638] EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities
[ 2.046253] usb 1-1: new high-speed USB device number 2 using dwc_otg
[ 2.052866] Indeed it is in host mode hprt0 = 00001101
[ 2.080440] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 2.096233] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.117555] devtmpfs: mounted
[ 2.120976] Freeing unused kernel memory: 132K (c0582000 - c05a3000)
[ 2.286712] usb 1-1: New USB device found, idVendor=0424, idProduct=9512
[ 2.293446] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.310705] hub 1-1:1.0: USB hub found
[ 2.314787] hub 1-1:1.0: 3 ports detected
[ 2.400570] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered
Starting logging: OK
Initializing random number generator... [ 2.596433] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
done.
Starting network...
[ 2.726595] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 2.733485] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.744307] smsc95xx v1.0.4

Welcome to Buildroot
buildroot login: [ 2.810197] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:e9:48:7d

Welcome to Buildroot
buildroot login:


入っているライブラリを検索すると、こんな感じになりました。

# find / -name "*.so*"
/lib/libc-2.18.so
/lib/libm.so.6
/lib/libpthread-2.18.so
/lib/libresolv-2.18.so
/lib/libc.so.6
/lib/librt.so.1
/lib/libcrypt.so.1
/lib/libpthread.so.0
/lib/modules/3.12.28-quick/modules.softdep
/lib/libnss_files-2.18.so
/lib/libutil-2.18.so
/lib/libnss_dns-2.18.so
/lib/ld-linux-armhf.so.3
/lib/libnss_dns.so.2
/lib/libgcc_s.so.1
/lib/libm-2.18.so
/lib/libnsl.so.1
/lib/libnsl-2.18.so
/lib/ld-2.18.so
/lib/libcrypt-2.18.so
/lib/libdl-2.18.so
/lib/libresolv.so.2
/lib/librt-2.18.so
/lib/libdl.so.2
/lib/libutil.so.1
/lib/libnss_files.so.2
/usr/lib/libstdc++.so.6.0.19-gdb.py
/usr/lib/libstdc++.so.6.0.19
/usr/lib/libstdc++.so.6
/etc/ld.so.conf
/etc/ld.so.cache
/etc/ld.so.conf.d


ld-linux-armhf.so.3 の方が入っているのですね。これからはこれをベースにして構築して行きます。
スポンサーサイト

tag : RaspberryPi

tag : buildroot

tag : Linux

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
01 | 2015/02 | 03
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter