トップ «前の日記(2013-06-22) 最新 次の日記(2013-06-24)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|

2013-06-23 :-)

_ 午前

0930 起床

1020 おひる。スパゲテイ

1040 コーヒー

IMG_1960

_ 午後

1200 gcc gcc gcc gcc♪

1300 アニメ消化

1600 散歩

IMG_1971

_

1700 gcc gcc gcc gcc♪

2130 飯

_ [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"