コピーコンストラクタを無理やり探索→失敗

g++で例外をコピーするのにコピーコンストラクタのアドレスがどうしても必要なので、無理やり探す方法を考えてみました。

struct copy
{
    copy();
    copy(const copy&);
};

void bar(const copy& e)
{
    throw e;
}

みたいなコードがあった場合、

__Z3barRK4copy:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ebx
        subl    $20, %esp
        movl    $1, (%esp)
        call    ___cxa_allocate_exception
        movl    %eax, %ebx
        movl    8(%ebp), %eax
        movl    %eax, 4(%esp)
        movl    %ebx, (%esp)
        call    __ZN4copyC1ERKS_
        movl    $0, 8(%esp)
        movl    $__ZTI4copy, 4(%esp)
        movl    %ebx, (%esp)
        call    ___cxa_throw

のようなコードになって、コピーコンストラクタは___cxa_allocate_exceptionと___cxa_throwの間で呼び出されます。
元々コンパイラが生成するコードということもあり、このコードは最適化をオンにしても大して変わりません。
なので、この場合は例外の送出元が分かればコピーコンストラクタを見つけることが可能です。
また、

void foo()
{
    throw copy();
}

のようなコードでは、最適化の結果コピーコンストラクタの呼び出しがなくなることがありますが、ほとんどのクラスがデフォルトコンストラクタで初期化したオブジェクト同士が等しくなるので、デフォルトコンストラクタでおおよそ代用可能です。


で、ここまではよかったんですが、肝心の例外の送出元アドレスが分かりません。
さらに、

struct copy
{
    copy(int);
    copy(const copy&);
};

void foo(int n)
{
    throw copy(n);
}

みたいなパターンだと、デフォルトコンストラクタすら取得できず、断念。
いい考えだと思ったんですけどねぇ。