スポンサーリンク

GNUのGCCコンパイラでは、最適化レベル -O0 - -O3とサイズ重視の-Os、さらにバイナリのストリップ機能があります。
最適化レベルによって、生成されるバイナリのサイズが変わってきます。
ストリップ(strip)によってオブジェクトファイルのシンボルを削除することによってもファイルサイズは変わってきます。

gcc version 3.4.6 [FreeBSD] 20060305には最適化レベルには
-O0
-O1
-O2
-O3
-Os
があります。

gccに-Wl,-sをつけることでldコマンドにstripの指示を出すことができます。

今回は、lsコマンドのコンパイルオプションで最適化レベルの設定を変更したり、stripの有り無しで、できあがるバイナリサイズを比較してみました。

コンパイルコマンドは下記の通りです。
cc -lutil cmp.c ls.c print.c util.c
cc -Os -lutil cmp.c ls.c print.c util.c
cc -O0 -lutil cmp.c ls.c print.c util.c
cc -O1 -lutil cmp.c ls.c print.c util.c
cc -O2 -lutil cmp.c ls.c print.c util.c
cc -O3 -lutil cmp.c ls.c print.c util.c
cc -Wl,-s -lutil cmp.c ls.c print.c util.c
cc -Os -Wl,-s -lutil cmp.c ls.c print.c util.c
cc -O0 -Wl,-s -lutil cmp.c ls.c print.c util.c
cc -O1 -Wl,-s -lutil cmp.c ls.c print.c util.c
cc -O2 -Wl,-s -lutil cmp.c ls.c print.c util.c
cc -O3 -Wl,-s -lutil cmp.c ls.c print.c util.c

下記の図は、縦が最適化オプション、横が、stripの有無です。
not strip strip
デフォルト 28175 22748
-Os 24160 18992
-O0 28175 22748
-O1 26225 20932
-O2 26591 21400
-O3 28085 22920

コンパクトの最適化重視の-Osとstripの組み合わせが一番サイズが小さくなりました。
最適化なしでstrip無しが一番サイズが大きくなりました。

ldに-Wl,-O1で最適化オプションを指定した場合の比較もしてみました。

非strip strip 非strip+-Wl,-O1 strip+-Wl,-O1
デフォルト 28175 22748 28175 22748
-O0 28175 22748 28175 22748
-O1 26225 20932 26577 21284
-O2 26591 21400 26927 21736
-O3 28085 22920 28421 23256
-Os 24160 18992 24496 19328

-Wl,-O1でldの最適化を加えるとサイズが若干大きくなります。


-fPIC(Position Independent Code)も試してみました。

非strip strip 非strip+-Wl,-O1 strip+-Wl,-O1 非strip+-fPIC strip+-fPIC 非strip+-Wl,-O1+-fPIC strip+-Wl,-O1+-fPIC
デフォルト 28175 22748 28175 22748 31714 25292 32162 25740
-O0 28175 22748 28175 22748 31714 25292 32162 25740
-O1 26225 20932 26577 21284 30229 23940 30677 24388
-O2 26591 21400 26927 21736 30837 24616 31301 25080
-O3 28085 22920 28421 23256 31856 25688 32320 26152
-Os 24160 18992 24496 19328 27729 21536 28193 22000
参照しているページ (サイト内): [2009-04-25-2]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー