Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
「ビルド」とはなにをするか?
Search
Makoto Shimazu
April 15, 2015
Programming
84
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「ビルド」とはなにをするか?
EEIC後期実験「大規模ソフトウェアを手探る」の授業用スライド。
分割コンパイル・ビルドツール・静的リンク・動的リンクについて。
Makoto Shimazu
April 15, 2015
More Decks by Makoto Shimazu
See All by Makoto Shimazu
TSKaigi 2024 - 新サービス Progate Path の演習で TypeScript を採用して見えた教材観点からの利点と課題
makotoshimazu
1
1.2k
次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム
makotoshimazu
0
68
Introduction of System Software for Persistent Memory (Reading Circle 2014/12/18)
makotoshimazu
0
56
A Survey on Efficient Utilization of Emerging Persistent Memory
makotoshimazu
0
51
スケジューラについての調査 - オペレーティングシステム授業発表
makotoshimazu
0
65
Other Decks in Programming
See All in Programming
AHC070解法紹介
eijirou
0
140
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.4k
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
160
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
730
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
360
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
320
mrbgem 三角測量 開発
ogom
0
150
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
200
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
1
680
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
170
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
How Software Deployment tools have changed in the past 20 years
geshan
2
34k
Evolving SEO for Evolving Search Engines
ryanjones
0
300
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
RailsConf 2023
tenderlove
30
1.6k
Site-Speed That Sticks
csswizardry
13
1.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
WCS-LA-2024
lcolladotor
0
840
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
Between Models and Reality
mayunak
4
470
How STYLIGHT went responsive
nonsquared
100
6.3k
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