OS はアドレス空間レイアウトのランダム化を採用してエクスプロイトの有効性を低下させる可能性があるため、アドレスが固定されていることに依存することはできません。
それらがすべて同じリンクされたバイナリ内にある場合、関数の相対アドレスに依存できる場合があります。ベースとなるものを 1 つ選択し、それを他のすべてから差し引きます。
当然、再コンパイルおよび/または再リンクすると、これはすべてオフになります。別の方法を見つけようと思います。
そのような方法の 1 つは、各関数に整数インデックスを使用し、どのインデックスがどの関数に対応するかのテーブルを保持することです。別の間接レイヤーが導入されますが、はるかに堅牢になります。
編集:静的テーブルを作成したくない場合は、静的オブジェクトとコンストラクターを使用して、プログラムの初期化時にコードで作成することができます。
struct FunctionTable
{
typedef std::unordered_map<std::string, void *> table;
static table& get()
{
static table the_table;
return the_table;
}
FunctionTable(std::string name, void * func)
{
get().insert(name, func);
}
};
double getPi()
{
return 3.14159;
}
static FunctionTable ft_getPi = FunctionTable("getPi", getPi);