G++ 4.4を使ってプログラミングをしています。
オブジェクトサイズを出来るだけ削りたいので、例外処理に関するコード量を減らせないかと画策しています。
-fno-exceptionsを指定してみたのですが、あまり効果はありませんでした。
objdumpしてみると.eh_frameセクションがかなり大きく、まずはこれが削れたらいいなと思うのですが、調べても方法が見つかりませんでした。
とりあえず、C++の機能として
○クラス
○仮想関数
○多重継承
○テンプレート
は使いたいです。なのでCで書き直すのはNGです。
一方、必要のない機能は
○例外処理
○標準C++ライブラリ
です。
もしかすると、G++自体をビルドする段階で--disable-exceptionsを指定してビルドしておかないと無理なんでしょうか?現状ではG++を再ビルドすることは困難です。
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
せめてどのオブジェクトファイルで.eh_frameが大きいのかぐらいは特定してください。
ターゲットがarm-elfの場合でも、普通、.eh_frameは4バイト程度にしかならないはずです。.gcc_except_tableの間違いではないでしょうか?
なお、libgccはC言語でも使うランタイムですので、これがないとまともに動きません。libstdc++も、例えば純粋仮想関数を間違って呼び出したときに走る処理とかもあったはずですので不可欠かと思います。
どうも後だし条件が多すぎる気がします。
他に出していない重要な情報はもうありませんか?
この回答への補足
結果報告の意味を含め、「お礼」よりも後になりますが「補足」にて報告します。
YAGARTOのarm-elf-gcc4.4.1を使うと、-gオプションを付けるだけでなぜかeh_frameセクションが生成され、そこに何らかの情報(例外フレーム情報か?、内容を逆アセすると実行コードではなく何かのデータ)が生成されていました。不思議なことに-fno-exceptionsをつけてもつけなくても-gオプションがある限り生成され、コード量に応じて増えていきました。YAGARTOのビルドオプションでそうなっているのでしょうか・・・。
YAGARTOではなく、codesourcery-armの2009q3を使う(arm-none-eabi-gcc 4.4.1)と-gオプションがあってもeh_frameは生成されず、オブジェクトコードが想定通りに減りました。更に、stdc++ライブラリもリンクせずに済むようになったので、更に実行コードを減らすことができるようになりました。
最後になりますが、「もっと情報はないか?」ということなのでいろいろ考えて情報を出したつもりですが、その後コメントを何の反応もいただけず非常に残念に思います。
たびたびのコメント、恐れ入ります。
> せめてどのオブジェクトファイルで.eh_frameが大きいのかぐらいは特定してください。
どのオブジェクトファイルが・・・ということはありません。ソースコードが長いときはeh_frameも相応に大きくなり、一番小さいもので(ソースコードで20行程度、Cソース[C++ではない])48バイト、大きいものでは6324バイトもありました。確認方法はobjdump -hでセクション情報を抜き出して.eh_frameの'SIZE'に該当するところを見ました。
.eh_frameセクションのサイズ確認方法としては合っていますよね?
試しにしょうもないコード
int test() { return 5; }
とかだけのコードをtest.cというファイルに書いて、
arm-elf-gcc -c -g test.c
でコンパイルすると、それだけで.eh_frameは48バイトになっています。
eh_frameってC++の例外処理に関する情報が入るのですよね?純粋なC-onlyなコードなのになぜ・・・?
> libstdc++も、例えば純粋仮想関数を間違って呼び出したときに走る処理とかもあったはずですので不可欠かと思います。
g++4では"__cxa_pure_virtualなんたら・・・"とかいう関数ですよね。今回はそういう処理すら不要なので、自前でこの関数を定義してsystem haltさせるようにします。それでもlibstdc++は不可欠ですか?
> 他に出していない重要な情報はもうありませんか?
別に出し惜しみをしているわけでもなく何が重要な情報なのか分からないだけなのですが、
大げさに言ってしまうとC++ライブラリだけでなく、Cの標準ライブラリの機能すら必要ありません。C++コンパイラのクラスや継承、仮想関数という"仕組み"と実行コードだけが欲しくて、スタートアップルーチンやoperator newなどのランタイム環境などはすべて自前で用意しますので、サイズが大きくてゴタゴタした余計なものはリンクして欲しくないのです。その一つとして目を付けたのが「例外処理」ということなんです。
No.1
- 回答日時:
g++のconfigureオプションを補足してください(g++ -vで出力されるないようです)。
あと、可能な範囲で、確認に使ったソースも補足してください。
-fno-exceptionsは、それを指定した翻訳単位にしか適用されません。ライブラリなど、事前にコンパイル済みのものは対象外だと考えてください。
operator newなど、例外が絡むものは少なからずありますので、標準C++ライブラリを使わなければ済むというものではありません。
この回答への補足
まずは補足として、configureオプションの内容を付けます。
今回のtargetはARMでクロスコンパイラということになります。
Target: arm-elf
Configured with: ../gcc-4.4.1/configure --target=arm-elf --prefix=/home/yagarto/install --disable-nls --disable-shared --disable-threads --with-gcc --with-gnu-ld --with-gnu-as --with-dwarf2 --enable-languages=c,c++ --enable-interwork --enable-multilib --with-newlib --with-headers=../newlib-1.17.0/newlib/libc/include --disable-libssp --disable-libstdcxx-pch --disable-libmudflap --disable-libgomp -v
Thread model: single
gcc version 4.4.1 (GCC)
ソースはちょっとすぐには用意できないです。システムコール関係やoperator new関係は自前のものを用意しているので、ここに乗せるにはかなり大きくなってしまいます。
アドバイスありがとうございます。
> -fno-exceptionsは、それを指定した翻訳単位にしか適用されません。
その点は理解しております。
それと一点言い忘れておりましたが、今回は組み込み系ということで「標準入出力」も不要で使っていないので、ご指摘の点も含めて考えると余計なライブラリはリンクしたくないのですが、リンク時にlibgccやlibstdc++はリンクしておかないと大量の未定義シンボルが報告されてしまいます。やはり、gccが用意するc++のランタイム環境はある程度libgccなどに頼らざるを得ないのかな、と考えています。
> operator newなど、例外が絡むものは少なからずありますので、標準C++ライブラリを使わなければ済むというものではありません。
ご指摘ありがとうございます。
繰り返しになりますが、今回は組み込み系なので、operator newやoperator new[]自体も自前のものに置き換えて、例外を発生させないようにしています。staticなクラスインスタンスのコンストラクタを呼び出すコードさえ自前で実装しているくらいです。
あとは、new演算子で例外が発生することを想定したコードをコンパイラが生成しないようになれば例外フレーム情報の増大を(ある程度)防げると考えたのですが、それをコンパイラに指示するオプションが無さそうです。
他に何かお気づきの点がありましたら、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) G/標準;-G/標準;""; に例外をつける 3 2023/05/10 08:08
- 数学 『数学的帰納法のトリセツ』 4 2022/06/06 07:34
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- 生物学 【生命科学】ヒトが1日に消費するATP量?(精度を変えて再計算) 3 2022/10/07 18:48
- 物理学 フーリエ級数展開をExcelのFFTでシミュレートする 5 2023/07/03 22:02
- 数学 「違います 質問11 n≦-2ではz≠π/2で g(z)=tan(z)/(z-π/2)^(n+1) 3 2022/07/16 18:12
- その他(メールソフト・メールサービス) 勤務先で全員が毎日使用しているGoogleメールの過去数年間分が全て削除されるので困っています! 2 2023/05/05 17:22
- 数学 mtrajcp様に以前答えていただいた解答に関して、 複数の疑問がございます。 どうか、質問を連投す 3 2022/09/03 08:00
- 高校 合成関数の定義域につきまして 1 2022/05/18 17:26
- 経済学 マクロ経済学で政府支出が変化した場合に図示する方法について教えてください。 6 2022/11/23 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python urlopen error について...
-
Google ColaboでGUI作成
-
DirectX Graphics と OpenGLっ...
-
本格的なGUIを作るのにおすすめ...
-
DLL読み込み時エラー
-
C言語/画像処理をしたいです/ex...
-
sleep関数
-
Dreamweaverのライブラリが反映...
-
iPhoneのカメラロールへ画像を...
-
c言語の標準cライブラリのみで...
-
ISOイメージの作成方法について
-
boostのアンインストールについて
-
MFC/C++ sprintf の代わりに <<
-
標準ライブラリだけでgetch関数...
-
Javaで画面全体のマウス・キー...
-
マウスのクリックを自動で
-
iCloudフォトライブラリ内の画...
-
iPhoneとPCの画像を同期すると...
-
ListViewで複数項目のドラッグ...
-
モバイルCというC言語のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows Media Playerを開くと...
-
Google ColaboでGUI作成
-
python urlopen error について...
-
iCloudフォトライブラリ内の画...
-
本格的なGUIを作るのにおすすめ...
-
Ps+のフリープレイでDestiny2の...
-
declaration of 'index' shadow...
-
LIBCMT.LIBをリンクしてコンパ...
-
ISOイメージの作成方法について
-
32768以上の乱数を作りたいので...
-
boostのアンインストールについて
-
iPhoneのカメラロールへ画像を...
-
ライブラリ作成時のグローバル...
-
Dreamweaverのライブラリが反映...
-
静的ライブラリから静的ライブ...
-
C標準ライブラリがwinAPIを経由...
-
scipy っていうのをいれようと...
-
ATLとSTLの違いは何でしょうか?
-
音声出力のライブラリ
-
c言語でntpdateコマンドにあた...
おすすめ情報