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