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










