正確に必要なものに応じて、さまざまなソリューションが可能になる可能性があります。少なくとも静的にリンクされたコードを制御し、必要に応じて変更できると想定しています。
方法 1
静的にリンクされたコードが関数 (のようなものset_my_good_var_ptr()
) をエクスポートできる場合、動的にロードされたモジュールはその関数を呼び出して、必要な変数のアドレスを前者に渡すことができます。
または、おそらく、静的にリンクされたコードは、動的にロードされたモジュールが get/set コールバックを提供するために使用できるインターフェイスを提供して、変数にアクセスできるようにすることができます。
これらすべてがプロジェクトに適していない場合 (たとえば、動的にロードされたモジュールのコードを変更できない場合)、次の方法が役立つかもしれませんが、私はそれを良い習慣とは呼びません。
方法 2
ロードする変数を提供するカーネル モジュールを監視します (たとえば、 register_module_notifier()関数を参照)。
モジュールがロードされた後、初期化関数が呼び出される前に、通知関数が呼び出されることに注意してください。
通知関数が呼び出されると、kallsyms_lookup_name()またはkallsyms_on_each_symbol()を使用して、必要な変数のアドレスを取得できます。
これには、カーネル構成で設定する必要がCONFIG_KALLSYMS
あります。CONFIG_KALLSYMS_ALL
これらのオプションの 1 つまたは両方が設定されていない場合でも実行可能ですが、やや困難です (たとえば、モジュールのバイナリ ファイルでシンボルを見つけ、シンボルが属する ELF セクションのアドレスとそのオフセットを取得し、すべてを渡します)。これをあなたのコードなどに)
変数のアドレスを見つけた後、静的にリンクされたコードは、変数が実際にいつ使用できるか (変数が初期化されたときなど) を何らかの方法で決定する必要があります。それを行う方法は、関連するモジュールが実際に何をするかによって異なります。私はそれについてアドバイスすることはできません.