Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「ビルド」とはなにをするか?
Search
Makoto Shimazu
April 15, 2015
Programming
0
32
「ビルド」とはなにをするか?
EEIC後期実験「大規模ソフトウェアを手探る」の授業用スライド。
分割コンパイル・ビルドツール・静的リンク・動的リンクについて。
Makoto Shimazu
April 15, 2015
Tweet
Share
More Decks by Makoto Shimazu
See All by Makoto Shimazu
TSKaigi 2024 - 新サービス Progate Path の演習で TypeScript を採用して見えた教材観点からの利点と課題
makotoshimazu
1
700
次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム
makotoshimazu
0
35
Introduction of System Software for Persistent Memory (Reading Circle 2014/12/18)
makotoshimazu
0
19
A Survey on Efficient Utilization of Emerging Persistent Memory
makotoshimazu
0
21
スケジューラについての調査 - オペレーティングシステム授業発表
makotoshimazu
0
21
Other Decks in Programming
See All in Programming
いりゃあせ、PHPカンファレンス名古屋2025 / Welcome to PHP Conference Nagoya 2025
ttskch
1
240
HTML/CSS超絶浅い説明
yuki0329
0
210
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
0
220
GitHub CopilotでTypeScriptの コード生成するワザップ
starfish719
28
6.1k
Immutable ActiveRecord
megane42
0
120
【PHP】破壊的バージョンアップと戦った話〜決断と説得
satoshi256kbyte
0
100
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
190
Amazon Nova Reelの可能性
hideg
0
260
カンファレンス動画鑑賞会のススメ / Osaka.swift #1
hironytic
0
200
AWS re:Invent 2024個人的まとめ
satoshi256kbyte
0
150
Запуск 1С:УХ в крупном энтерпрайзе: мечта и реальность ПМа
lamodatech
0
990
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Visualization
eitanlees
146
15k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Six Lessons from altMBA
skipperchong
27
3.6k
Why Our Code Smells
bkeepers
PRO
335
57k
Scaling GitHub
holman
459
140k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
380
Code Review Best Practice
trishagee
65
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Automating Front-end Workflow
addyosmani
1367
200k
Transcript
ばいなり! τ研 M2 島津 2015/10/15 ソ ー ス コ ー
ド ?
具体的内容 こんぱいる! ビルドツールってなにするの? (make, ninja, rake, autotools, cmake, gyp…) 静的ライブラリ(.a)ってなに?
▪ arコマンド 共有ライブラリ(.so)ってなに? ▪ LD_LIBRARY_PATH ▪ ldd 2
こんぱいる! ってどういうこと? 2つのイメージ(予想) 本当にやっていること ▪ どっちかっていうと前者 ▪ 後者は、いちいつ打つのが面倒だからコマンド一発で出来るように簡単に している $(CC) $(CFLAGS)
-c –o $(OBJDIR)/hoge.o hoge.c $ ./configure --prefix=../hogedir $ make –j16 ぶわー $ make install $ gcc hello.c $ ./a.out hello. 3
こんぱいる!のイメージ図 ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $
gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c 実行ファイル 4
こんぱいる!のやることの手順 オブジェクトファイルの生成 (狭義のコンパイル) ▪ .c -> .o ▪ .oはすでにコンパイル済み(機械語)のプログラムが入っている バイナリの生成 (リンク)
▪ .oにあるプログラムをリンクする main.oとhello.oの関数を一つのファイルにまとめる 関数名を見て、ジャンプする命令のアドレスを決める (cf. アーキテクチャのI型の命令) $ gcc –c hello.c $ gcc –c main.c $ ls hello.c hello.o main.c main.o $ gcc –o wei.bin main.o hello.o 5
ビルドツールの必要性 ファイルが多くなると・・・? ▪ たとえば、chromiumだったら20000ファイルを超える! ▪ 全部のファイルに対してコマンドラインを書いてシェルスクリプトを書く? ▪ つらみしか感じない いい感じにしてくれるツールが? ▪
ビルドツール 6 ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $ gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c 実行ファイル
ビルドツール – make, ninja, rake… make, ninja, rake ▪ ”依存関係”を解決しながらコマンドを実行してくれるツール
▪ ”依存”するファイルが更新されると、そのコマンドが実行される ▪ 変えたファイルに関係するコマンドだけしか実行されない! ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $ gcc –o main.bin main.o hello.o pyoo.o hello.c main.c pyoo.c 実行ファイル 7
makeの例 makeコマンドの設定ファイル:makefile ▪ こんな感じで書けば、main.o/hello.o/pyoo.oを使ってwei.binが生成できる ▪ もっと詳しい使い方はいろいろ調べてみてください! ▪ (個人的には次に説明する gypをつかってmakefileやninjaのファイルを生成するのがマイブームで す)
8 wei.bin: main.o hello.o pyoo.o gcc -o $@ $^ %.o: %.c gcc -c $<
メタビルドシステム - autotools, cmake, gyp… ビルドに必要なファイルを生成するシステム ▪ makefileやsln(Visual Studio向けプロジェクトファイル)、xcodeなど ▪
cmakeやgypなどではクロスプラットフォーム向けに書いたりもできる やってくれること ▪ 環境に応じていい感じのmakefileなどを作ってくれる ▪ autotoolsだと、configureしたときに環境に応じたヘッダファイルも生成してくれ る ▪ これらにより、同じプログラムをいろんな環境で簡単に動かせる よくある使い方 $ ./configure –prefix=/home/denjo/gnuplot_install makefileなどを生成! $ make gccつかったコマンドをいい感じに実行! $ make install いい感じの場所にファイルをコピー! 9
ビルドシステムのまとめ 結局のところなにをやっているのか? ▪ gccやclangを動かしている ▪ そのための便利ツールがmakeやninja ▪ それを準備するための便利ツールがautotoolsやcmakeやgyp よくわからない挙動をした場合には・・・ ▪
立ち戻ってgccなどのオプションがいい感じになっているかをチェックする ▪ どうせコマンド実行しているだけなので、表示されたコマンドを手で実行してみ るのも手 覚えておくと便利な環境変数 ▪ C_INCLUDE_PATH, CPP_INCLUDE_PATH, LIBRARY_PATH ▪ デフォルト以外のincludeパスやライブラリの検索元(後述)を追加できる 10
ライブラリ ライブラリとは? ▪ 一言で言うと、オブジェクトファイルの塊 ▪ 利用しやすいように、オブジェクトファイルを一つのファイルにまとめたもの(ex. libc) 11 ソースコード (*.c,
*.cpp) オブジェクトファイル (*.o) 実行ファイル $ gcc –c hello.c $ gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c main.c hello.c pyoo.c ライブラリ(*.a)
ライブラリの操作 使い方 ▪ arコマンドで作成 ▪ コンパイル時には.oと同じようにファイルを指定して使うか、-lhogeのようにする 12 $ gcc –c
hello.c $ gcc –c pyoo.c $ ar rsv libhello.a hello.o pyoo.o $ ls libhello.a hello.c hello.o main.c pyoo.c pyoo.o $ gcc –c main.c $ gcc –o main.bin main.o –lhello –L. libhello.a hello.c hello.o main.bin main.c main.o pyoo.c pyoo.o -lと-Lという2つのオプションは覚えておくとよい。 -lがライブラリ名を指定していて、-Lはライブラリの検索元を指定している。
静的ライブラリの問題点 コードサイズの肥大化 ▪ 静的ライブラリは、バイナリがすべてのコードを持つ ▪ たくさんのプログラムが同じライブラリを使っていた場合... 13 main1.c main2.c
共有ライブラリ(.so, shared objects) ライブラリの共通化 ▪ 実行時に同じライブラリを使うようにする ▪ これが共有ライブラリ 14 main1.c
main2.c
実際の使い方 動き ▪ サーチパス(/etc/ld.so.confやLD_LIBRARY_PATH)から勝手にsoファイルを 探してくる lddコマンド:依存している共有ライブラリを見れる ▪ 実行時に探したいパスを追加するときには、ビルド時にオプションを追加 -Wl,-rpath=$PWDや-Wl,-R $PWDとか
コマンド 15 $ cd lib $ gcc -fPIC –c hello.c $ gcc -fPIC –c pyoo.c $ gcc –shared –fPIC –o libhello.so hello.o pyoo.o $ ls libhello.so hello.c hello.o pyoo.c pyoo.o $ cd .. $ gcc –Wl,-R $PWD/lib –o main.bin main.c –lhello –Llib $ ls lib main.c main.bin ディレクトリ構成 +- main.c +- lib +- hello.c +- pyoo.c -fPICはとりあえず呪文ということで・・・ (興味あったら聞いてください)
共有ライブラリのサーチパス 実行時にいちいちファイルを探す…どこから? ▪ 確認1: lddコマンドを使ってみる ▪ 確認2: /etc/ld.so.confを見てみる (見るとinclude /etc/ld.so.conf.dをしているので、実際には
/etc/ld.conf.so.dを見る) ▪ 確認3: gccのオプションに-vをつけてみる 16 main1.c main2.c 実行時に探す
よくあるシチュエーション ライブラリをビルドしてインストールしたいけど、 自前でビルドしたものと元からはいってるものをちゃんとわけたい! ▪ ./configure –-prefix=… をつかってインストール先を設定 ▪ LIBRARY_PATHとLD_LIBRARY_PATHの2つの環境変数を設定 LIBRARY_PATH:
プログラムのビルド時につかうライブラリの位置 LD_LIBRARY_PATH: プログラムの実行時に含めるサーチパス 17 いろいろありそうなタイトルを付けたけど、 個人的に思い当たるのはこれだけだった・・・
まとめ ビルドツールとは ▪ gcc, clangなどをいい感じに実行してくれる便利ツール ▪ C_INCLUDE_PATH/CPP_INCLUDE_PATH/LIBRARY_PATHを使って 読み込むディレクトリを指定できる ライブラリとは ▪
オブジェクトファイルを1つにまとめたもの ▪ 静的ライブラリを使うと最終的にできるバイナリにすべてが含まれる ▪ 共有ライブラリを使うと、実行時に検索・リンクが行われる ▪ LD_LIBRARY_PATHを使って、サーチパスを追加できる 18
おまけ 僕(島津)の環境の例 ▪ 自前でビルドしたものは/home/shimazu/local以下におく つまりprefixは $HOME/local にしてる ▪ インクルードパスやライブラリのパスを環境変数で追加 ▪
参考になれば幸いです。 19 export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$HOME/local/include export C_INCLUDE_PATH=$C_INCLUDE_PATH:$HOME/local/include export LIBRARY_PATH=$LIBRARY_PATH:$HOME/local/lib:$HOME/local/lib/x86_64-linux-gnu export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$HOME/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH ディレクトリ構成 /home/shimazu +- local +- bin +- lib +- include ...
(ちょっとだけ)soのバージョンの話 ▪ libxxx.soは最新のlibxxx.so.Nへのリンク ▪ libxxx.so.Nは最新のlibxxx.so.N.Mへのリンク ▪ プログラム側で利用するのはlibxxx.so.N ▪ libxxx.so.Nはsonameと呼ばれる ▪
libxxx.soはlinker nameと呼ばれる ▪ libxxx.so.N.M.Xはreal name 20
細かい話(あまり重要ではない) 関数の呼び出しをオペランドでできない→テーブルからジャンプ ▪ PLT, GOT(簡単に話す?) 21