ソラリスを使用しています。セグメンテーション違反が発生しているコードは .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
ポインタは有効ですが、引数として に渡された場合vRegisterCallback
。 vRegisterCallback
は とは異なる住所を持っていますFunc1
。
上記のステートメントを追加すると、にprintf
送信された有効なポインターで機能しますvRegisterCallback
。を静的から非静的に変更すると機能します...
.so
を .a に変更すると機能します。Func1
何が問題なのかわからない。