C

C言語の移植性は、Cランタイムやlibcによって担保されている

ビルド(build)のプロセス

[ ソースコード ] → プリプロセス → コンパイルアセンブル → リンク → [ 実行ファイル ]

[ 対象] ver_check.c

#include <stdio.h>

int main(int argc, char const *argv[])
{
  printf("%ld\n", __STDC_VERSION__);
  return 0;
}

1) プリプロセッサーによるプリプロセス(コンパイルする前の前処理)

[ #include命令により指定したファイルの内容をソースコードの中に差し込むことで、#include<stdio.h>が無くなり、代わりにstdio.hというファイルの内容に差し替えられた ]

$ gcc -E ver_check.c > ver_check.txt

ver_check.txt

# 1 "ver_check.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 362 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "ver_check.c" 2
.....
.....
.....
# 412 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 2 3 4
# 2 "ver_check.c" 2

int main(int argc, char const *argv[])
{
  printf("%ld\n", 201112L);
  return 0;
}

2) コンパイル(前処理されたソースをアセンブリ言語に変換)

$ gcc -S ver_check.c

ver_check.s

 .section    __TEXT,__text,regular,pure_instructions
    .build_version macos, 10, 14    sdk_version 10, 14
    .globl  _main                   ## -- Begin function main
    .p2align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## %bb.0:
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register %rbp
    subq    $32, %rsp
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    leaq    L_.str(%rip), %rdi
    movl    $201112, %esi           ## imm = 0x31198
    movb    $0, %al
    callq   _printf
    xorl    %ecx, %ecx
    movl    %eax, -20(%rbp)         ## 4-byte Spill
    movl    %ecx, %eax
    addq    $32, %rsp
    popq    %rbp
    retq
    .cfi_endproc
                                        ## -- End function
    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz  "%ld\n"


.subsections_via_symbols

3) アセンブルアセンブリ言語のソースを機械語のプログラムに変換)

-cオプションをつけて、機械語(ver_check.oのオブジェクトファイル)が生成する。この段階では、実行ファイルとして実行するための情報やC言語で書いたプログラムを動かすための情報は具備していない(Cランタイム、libcなど)

$ gcc -c ver_check.s

4) リンク(C言語で書いたプログラムを動かすためのCランタイム、libcなどの必要なライブラリをリンクして実行ファイルを生成)

$ ls -l ver_check.o
-rwxr-xr-x  1 xxxxx  staff  784  9 24 07:22 ver_check.o
$ find /Library/Developer/CommandLineTools -name "crt1*"
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.o
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.10.5.o
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.10.6.o

$ ld ver_check.o /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.o -lSystem
$ ld ver_check.o /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.10.5.o -lSystem
$ ld ver_check.o /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/crt1.10.6.o -lSystem

$ ls -l a.out
-rwxr-xr-x  1 xxxxx  staff  8696  9 24 08:14 a.out
$ ./a.out 
201112
$ ld -e _main ver_check.o -lSystem
$ ./a.out
201112