0

ソラリスを使用しています。セグメンテーション違反が発生しているコードは .so 内にあります。静的関数はほとんどありません。基本的にこれらの関数はコールバック関数です。これらの関数のアドレスを別の関数に渡すことで、これらの関数をコールバック関数として設定します。関数の 1 つのみ、引数として渡す前のアドレスは正しいように見えますが、関数にステップ インして関数ポインターを設定すると、ジャンク ポインターに変わり、そのポインターによって関数を呼び出すとクラッシュします。実際のコードではありませんが、それに似たサンプルコードをいくつか載せています。

A.cpp には、3 つのコールバック関数があります。

static void Func1(A* ptr)
{
}

static void Func2(A* ptr)
{
}

static void Func3(A* ptr)
{
}

1 つのレジスタ関数で、これらをコールバック関数として割り当てます

void vRegisterCallback(void (*ptrToFunc)(void*))
{
}

void Register()
{
    vRegisterCallback(void (*)(void*)Func1);
    vRegisterCallback(void (*)(void*)Func2);
    vRegisterCallback(void (*)(void*)Func3);
}

上記のように3つの関数を登録します。
Func1ポインタは有効ですが、引数として に渡された場合vRegisterCallbackvRegisterCallbackは とは異なる住所を持っていますFunc1

上記のステートメントを追加すると、にprintf送信された有効なポインターで機能しますvRegisterCallback。を静的から非静的に変更すると機能します...
.so を .a に変更すると機能します。Func1

何が問題なのかわからない。

4

0 に答える 0