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
27
「ビルド」とはなにをするか?
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
460
次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム
makotoshimazu
0
24
Introduction of System Software for Persistent Memory (Reading Circle 2014/12/18)
makotoshimazu
0
15
A Survey on Efficient Utilization of Emerging Persistent Memory
makotoshimazu
0
16
スケジューラについての調査 - オペレーティングシステム授業発表
makotoshimazu
0
17
Other Decks in Programming
See All in Programming
LangChainでWebサイトの内容取得やGitHubソースコード取得
shukob
0
120
Hono・Prisma・AWSでGeoなAPI開発
nokonoko1203
5
610
Polars を Kaggle コンペで使ってみた(LMSYS Chatbot Arena)
kohecchi
1
360
What we keep in mind when migrating from Serverless Framework to AWS CDK and AWS SAM
kasacchiful
1
130
令和トラベルにおけるLLM活用事例:社内ツール開発から得た学びと実践
ippo012
0
110
connect-go で面倒くささと戦う / 2024-08-27 #newmo_layerx_go
izumin5210
2
590
rbs-inlineを導入してYARDからRBSに移行する
euglena1215
1
200
New Order in Cascade Sorting Order
mugi_uno
3
2.5k
Prompt Cachingは本当に効果的なのか検証してみた.pdf
ttnyt8701
0
250
座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
4
2.9k
Uncharted packages (Laravel Live Denmark)
freekmurze
0
140
1人で挑むSwiftコンパイラ 〜型システム入門編〜
s_shimotori
0
310
Featured
See All Featured
Six Lessons from altMBA
skipperchong
26
3.3k
Why Our Code Smells
bkeepers
PRO
333
56k
KATA
mclloyd
27
13k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.5k
Writing Fast Ruby
sferik
623
60k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
58k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
We Have a Design System, Now What?
morganepeng
48
7.1k
Happy Clients
brianwarren
96
6.6k
Optimizing for Happiness
mojombo
375
69k
The Invisible Customer
myddelton
119
13k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
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