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"
[ツッコミを入れる]





