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
35
「ビルド」とはなにをするか?
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
870
次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム
makotoshimazu
0
45
Introduction of System Software for Persistent Memory (Reading Circle 2014/12/18)
makotoshimazu
0
27
A Survey on Efficient Utilization of Emerging Persistent Memory
makotoshimazu
0
24
スケジューラについての調査 - オペレーティングシステム授業発表
makotoshimazu
0
29
Other Decks in Programming
See All in Programming
Deep Dive into ~/.claude/projects
hiragram
9
1.5k
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
130
WindowInsetsだってテストしたい
ryunen344
1
200
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
620
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
580
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
1
120
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
430
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
850
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
490
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
900
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
560
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Invisible Side of Design
smashingmag
300
51k
Speed Design
sergeychernyshev
32
1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Why You Should Never Use an ORM
jnunemaker
PRO
57
9.4k
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