Help us understand the problem. What is going on with this article?

MinGWでコンパイルしたC++バイナリのサイズ増加を抑える

libstdc++.dllを配布するのは面倒なので、libstdc++を静的リンクすることはよく行われると思う。
しかし、静的リンクするとそれだけでファイルサイズが600KBほど増加してしまう1

これはnmやマップファイルから当たりをつけることができて、このようなファイルをソースに加えると避けることができる2
x86_64-w64-mingw32-g++ -O2 src.cpp winexcept.cpp -static-libgcc -static-libstdc++ -sで確認済みです。

winexcept.cpp
#include <stdio.h>
#include <stdlib.h>
extern "C"{ static inline void puts_and_exit(const char* p){puts(p);exit(1);} }
namespace std{
    void __throw_bad_exception(){puts("bad_exception");exit(1);}
    void __throw_bad_alloc(){puts("bad_alloc");exit(1);}
    void __throw_bad_cast(){puts("bad_cast");exit(1);}
    void __throw_bad_typeid(){puts("bad_typeid");exit(1);}

    void __throw_logic_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_domain_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_invalid_argument(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_length_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_out_of_range(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_out_of_range_fmt(const char* p, ...){puts(p);exit(1);}
    void __throw_runtime_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_range_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_overflow_error(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_underflow_error(const char* p) __attribute((alias("puts_and_exit")));

    void __throw_ios_failure(const char* p) __attribute((alias("puts_and_exit")));
    void __throw_system_error(int n){printf("system_error %d\n",n);exit(1);}
    void __throw_future_error(int n){printf("future_error %d\n",n);exit(1);}
    void __throw_bad_function_call(){puts("bad_function_call");exit(1);}
}

# あ、iostream系使った場合は無力ですので、その辺はCで頑張るようにするしかありません。


  1. これはThread model: win32の場合であって、Thread model: posixの場合は実は大丈夫らしい。ただこの場合は-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamicなるおまじないが別途必要なのだが。ちなみにDebianではwin32版、macOS Homebrewではposix版がインストールされます。 

  2. 例外を握りつぶすということなので、「製品」では非推奨 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした