2013-06-23 :-)
_ [gcc][文字列][string]gcc の string
gcc 4.5.3 i386
#include <stdio.h> #define STR1 "HELLO" #define STR2 "HELLO" int main(int ac, char** av ) { char* s1 = STR1; char* s2 = STR2; if(s1 == s2) { puts("match"); } else { puts("unmatch"); } return 0; }
% gcc hello1.c % ./a.out match
アレ...? (;゚д゚)
アドレスを比較するので、unmatch になると思ったんだけど、違うのか。
たしかに rodata には "HELLO" が 1 つしかないから一緒くたにされてるようだ。へーへー
.file "hello1.c" .section .rodata .LC0: .string "HELLO" .LC1: .string "match" .LC2: .string "unmatch" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp movl $.LC0, 28(%esp) movl $.LC0, 24(%esp) movl 28(%esp), %eax cmpl 24(%esp), %eax jne .L2 movl $.LC1, (%esp) call puts jmp .L3 .L2: movl $.LC2, (%esp) call puts .L3: movl $0, %eax leave ret .size main, .-main .ident "GCC: (NetBSD nb2 20110806) 4.5.3"
_ [gcc][ARM][クロスコンパイル][クロスコンパイラ]gcc の ARM クロスコンパイル
環境
ホスト NetBSD 6.0 i386
gcc
いやほんとよく分からない。
gcc のマニュアルには「オプションあるよ」と書いてあるんだけど( ARM Options - Using the GNU Compiler Collection (GCC) ) -march すると怒られる。
% gcc -march=armv7 hello1.c hello1.c:1:0: error: bad value (armv7) for -march= switch
-march=i386 はエラーにならないので、gcc はターゲットごとにコンパイラを作らないといけないのかしら。
ググったら tsutsuii さんのスライド( NetBSD移植 いまむかし )にヒットしたのでとりあえず tools を作ってみる。
cd /usr/src ./build.sh -m evbarm tools : tooldir.NetBSD-6.0-i386/bin/nbmkubootimage ===> Tools built to /usr/src/obj/tooldir.NetBSD-6.0-i386 ===> build.sh ended: Sun Jun 23 13:43:44 JST 2013 ===> Summary of results: build.sh command: ./build.sh -m evbarm tools build.sh started: Sun Jun 23 13:30:41 JST 2013 NetBSD version: 6.0 MACHINE: evbarm MACHINE_ARCH: arm Build platform: NetBSD 6.0 i386 HOST_SH: /bin/sh TOOLDIR path: /usr/src/obj/tooldir.NetBSD-6.0-i386 DESTDIR path: /usr/src/obj/destdir.evbarm RELEASEDIR path: /usr/src/obj/releasedir Updated makewrapper: /usr/src/obj/tooldir.NetBSD-6.0-i386/bin/nbmake-evbarm Tools built to /usr/src/obj/tooldir.NetBSD-6.0-i386 build.sh ended: Sun Jun 23 13:43:44 JST 2013 ===> .
とりあえずコンパイルしようとしたら怒られた。リンクできねーよ! と。ですよねー
% /usr/src/obj/tooldir.NetBSD-6.0-i386/bin/arm--netbsdelf-gcc hello1.c /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find crt0.o: No such file or directory /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find crtbegin.o: No such file or directory /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find -lgcc /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find -lgcc_s /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find -lc /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find -lgcc /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find -lgcc_s /usr/obj/tooldir.NetBSD-6.0-i386/bin/../lib/gcc/arm--netbsdelf/4.5.3/../../../../arm--netbsdelf/bin/ld: cannot find crtend.o: No such file or directory collect2: ld returned 1 exit status
日本のどこかに ARM 用の crt0 を待っているひとがいるかもしれないんだけどよく分からないから ./build.sh build までやって、どうやってるのか眺めてみることにした。
cd /usr/src ./build.sh -m evbarm build
待つこと 2, 3 時間。
こんな行を見つけた( 長いので空白を改行に置換 )
/usr/src/obj/tooldir.NetBSD-6.0-i386/bin/arm--netbsdelf-gcc --sysroot=/usr/src/obj/destdir.evbarm -nostdlib -r -Wl,-dc -o sh.ro alias.o cd.o echo.o error.o eval.o exec.o ex pand.o histedit.o input.o jobs.o mail.o main.o memalloc.o miscbltin.o mystring.o options.o parser.o redir.o show.o trap.o output.o var.o test.o kill.o syntax.o arith.o arith _lex.o builtins.o init.o nodes.o printf.o
ARM
つまりこうすりゃいいらしい。
/usr/src/obj/tooldir.NetBSD-6.0-i386/bin/arm--netbsdelf-gcc --sysroot=/usr/src/obj/destdir.evbarm hello1.c
中身を見る。
file a.out a.out: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for NetBSD 6.0, not stripped
ナルホディウス
_ Hello World!.s
ケッキョキ
なにがやりたかったかというと、ARM 向けにアセンブルすると何か変わるのかという。
align が追加されておる。( ref. データ型のアラインメントとは何か,なぜ必要なのか? )
.file "hello1.c" .section .rodata .align 2 .LC0: .ascii "HELLO\000" .align 2 .LC1: .ascii "match\000" .align 2 .LC2: .ascii "unmatch\000" .text .align 2 .global main .type main, %function main: @ args = 0, pretend = 0, frame = 16 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #16 str r0, [fp, #-24] str r1, [fp, #-28] ldr r3, .L4 str r3, [fp, #-16] ldr r3, .L4 str r3, [fp, #-20] ldr r2, [fp, #-16] ldr r3, [fp, #-20] cmp r2, r3 bne .L2 ldr r0, .L4+4 bl puts b .L3 .L2: ldr r0, .L4+8 bl puts .L3: mov r3, #0 mov r0, r3 sub sp, fp, #12 ldmfd sp, {fp, sp, pc} .L5: .align 2 .L4: .word .LC0 .word .LC1 .word .LC2 .size main, .-main .ident "GCC: (NetBSD nb2 20111202) 4.5.3"
[ツッコミを入れる]