3

基本的にタイトルが求めるもの。

や、シンボル テーブルなどのより高度な概念に少し慣れていないため、C++オンラインで調べましたが、最終目標が何であるかについての方向性を見つけるのに苦労しています。私が見たチュートリアルのほとんどは C に対応しており、私が見つけた最も近い質問 ( here ) は、私がそれをコンパイルしようとしたため、レンガの壁に私を置きますが、望ましい結果が得られません.どのように機能するかについては、まだしっかりしてextern "C"いません。

これが終わるまでに、シンボルテーブルから変数にアクセスし、変数を変更できるようにしたいと考えています。私はnmobjdumpをいじりました (そして、ハードウェアのバックグラウンドから来ているので、見るのは間違いなくクールですdlsym) dlopen。何よりもCで)。

アドバイスやコードの小さなスニペット (独自のサンプル プログラムを作成できるようにするため) は素晴らしいものです。追加するために、これは一種の古いバージョンのG ++を備えたLinuxシステム上にあり(現在マシンにいないため、その情報がありません)、現在アップグレードするアクセス権がありません.

4

2 に答える 2

4

dlsymシンボルを検索するために使用する方法を示すプログラムの例を次に示します。

#include <dlfcn.h>
#include <iostream>

extern "C" int my_variable = 42;

int main()
{
    if (int* p = (int*)dlsym(NULL, "my_variable"))
        std::cout << "my_variable @" << p << ' ' << *p << '\n';
    else
        std::cout << "dlsym failed\n";
}

このextern "C"ビットは名前マングリングを防止し、シンボル テーブル エントリが単に に"my_variable"渡されるテキストであることを保証しますdlsym()extern "C"マングルされた名前を使用して提供することはできませんが、それはコンパイラ固有のものです。

コードをコンパイルするには、次を使用します。

g++ x.cc -o x -ldl -rdynamic

はの-ldlライブラリでdlsymあり、-rdynamic使用されていないように見える変数のシンボル情報を破棄しないように求めています (こちらを参照)。

-rdynamic-export-dynamicフラグをサポートするターゲットで、フラグを ELF リンカに渡します。これにより、リンカーは、使用されているシンボルだけでなく、すべてのシンボルを動的シンボル テーブルに追加するように指示されます。このオプションは、一部の用途dlopenや、プログラム内からバックトレースを取得できるようにするために必要です。

私のマシンでの出力:

my_variable @0x401010 42
于 2015-07-07T03:16:53.343 に答える
1

@TonyDには本質的に正しい答えがあります。共有ライブラリの使用方法のより詳細な議論については、これはかなりまともなチュートリアルです

于 2015-07-07T03:22:58.853 に答える