第5回 続・C言語をコンパイルする際に指定するオプション

岸 哲夫

 C言語をコンパイルする際に指定するオプションの説明を続ける.
 今回は,
・ハードウェアモデルとコンフィグレーションオプション.補足として,クロスコンパイル環境について
コード生成規約に対するオプション
・実行に影響を与える環境変数
・プログラムにプロトタイプを追加するprotoizeについて
などの事柄について,説明と検証を行う. (筆者)

space
クロスコンパイル環境について

 「クロスコンパイル」というのは,簡単にいえば,ターゲットマシンで実行可能なバイナリをホストマシンで作ることです.

 GCCがターゲットマシンにできる環境については,前回説明したとおりです.

 たとえば,日立のSH-4用のバイナリを作成するには,それ専用のライブラリをリンクしなければなりません.「ターゲット機種とコンパイラバージョンの指定オプション」で行った説明を補足すると,-bオプションの指定の際に-b sh4と指定したときと,指定しないときでリンクするライブラリを変えたり,実行するプリプロセッサ,狭義のコンパイラ,アセンブラ,リンカを変えることが可能です.ただし,通常は間違いを避けるために,クロスコンパイル用GCCは別の名称にして別のディレクトリに置くのが普通です.

 例として,日立のSH-4用クロスコンパイル開発環境を構築してみましょう.

 まずbinutil,GCC,newlibをダウンロードします.

 GCCはバージョン2の最終版であるGCC-2.95.3.tar.gzをhttp://gcc.gnu.org/からダウンロードします.

 binutilは最新版のbinutils-2.13.tar.gzを,http://www.dnsbalance.ring.gr.jp/からダウンロードします.

 newlibは最新版のnewlib-1.10.0.tar.gzをhttp://sources.redhat.com/newlib/からダウンロードします.

 binutilはアセンブラ・リンカその他のツール類を含んでいます.newlibは標準Cライブラリです.RedHatのWebページにありますが,ほかのディストリビューションでも問題ありません.

 まずはbinutilsの作成です.

  $ tar zxvf binutils-2.13.tar.gz
  $ cd binutils-2.13
  $ ./configure --target=sh-hitachi-coff --prefix=/usr/local
  $ make
  $ make install

 以上でbinutilsが作成されました.エラーが起きる場合は環境をチェックしてください.

 次にGCCの作成です.newlibのヘッダを使うので,両方とも解凍します.

  $ tar zxvf gcc-2.95.3.tar.gz
  $ tar zxvf newlib-1.10.0.tar.gz
  $ cd gcc-2.95.3
  $ mkdir work
  $ cd work
  $ ../configure --target=sh-hitachi-coff
      --prefix=/usr/local --with-newlib
      --with-headers=/newlib-1.10.0/

newlib/libc/include

  $ make LANGUAGES="c"
  $ make install LANGUAGES="c"

 これでクロスコンパイル用GCCが作成されました.エラーが起きた場合,やはり環境をチェックしてください.

 次にnewlibの作成です.

  $ cd newlib-1.10.0
  $ mkdir work
  $ cd work
  $ ../configure --target=sh-hitachi-coff --prefix=/usr/local
  $ make
  $ make install

 これでクロスコンパイル環境が作成されました.

  main()
  {
   printf("hello world!!\n");
  }

 このように単純な“hello world”をtestsh.cとして保存します.

  $ sh-hitachi-coff-gcc testsh.c

 このようにするとa.outが作成されます.これはSHのcoff環境で動作します.

 では,アセンブラコードで比較してみましょう(リスト1リスト2).

〔リスト1〕SH用にコンパイルしたもの(testsh.s)
        .file   "test.c"
        .data
gcc2_compiled.:
___gnu_compiled_c:
        .text
        .align 2
LC0:
        .ascii "hello world!!\12\0"
        .align 2
        .global _main
_main:
        mov.l   r8,@-r15
        mov.l   r14,@-r15
        sts.l   pr,@-r15
        mov     r15,r14
        mov.l   L3,r8
        jsr     @r8
        nop
        mov     r15,r1
        mov.l   L4,r2
        mov     r2,r4
        mov.l   L5,r8
        jsr     @r8
        nop
L2:
        mov     r14,r15
        lds.l   @r15+,pr
        mov.l   @r15+,r14
        mov.l   @r15+,r8
        rts     
        nop
L6:
        .align 2
L3:
        .long   ___main
L4:
        .long   LC0
L5:
        .long   _printf

〔リスト2〕通常のGCCによるコンパイル(test.s)
        .file   "test.c"
        .version        "01.01"
gcc2_compiled.:
                .section        .rodata
.LC0:
        .string "hello world!!\n"
.text
        .align 4
.globl main
        .type    main,@function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        subl    $12, %esp
        pushl   $.LC0
        call    printf
        addl    $16, %esp
        leave
        ret
.Lfe1:
        .size    main,.Lfe1-main
        .ident  "GCC: (GNU) 2.96 20000731 	(Red Hat Linux 7.3 2.96-110)"

  $ cp testsh.c test.c
  $ sh-hitachi-coff-gcc -S testsh.c
  $ gcc -S test.c

 このように,testsh.sのコードはインテルアーキテクチャとは異質のものです.

 クロスコンパイル環境を構築すれば,SigmarionやLinuxザウルスSL-A300のためのバイナリを作成することも可能です.ちなみに,SigmarionはCPUにSH-4,SL-A300はXScaleをそれぞれ使用しているので,コンフィグレーションを適切にセットすれば問題なく動作するでしょう.

 クロスコンパイルの詳細については,GCCのインストールの回で詳しく説明します.


NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
◆クロスコンパイル環境について
コード生成規約に対するオプション
実行に影響を与える環境変数
プログラムにプロトタイプを追加するprotoizeについて, またプロトタイプを削除するunprotoizeについて

Copyright 2003 岸 哲夫

Copyright 1997-2017 CQ Publishing Co.,Ltd.