1

objcopyを使用してxmlファイルをオブジェクトファイルに変換しようとしています。このオブジェクトファイルは、RHEL5上の別の共有ライブラリにリンクされて使用されます。このコマンドでファイルを変換します:

objcopy --input-format binary --output-target i386-pc-linux-gnu --binary-architecture i386baselines.xmlbaselines.0

オブジェクトファイルが作成され、readelfを使用すると次のようになります。

シンボルテーブル'.symtab'には、次の5つのエントリが含まれます。 DEFAULT 1 _binary_baselines_xml_end 4:0000132b 0 NOTYPE GLOBAL DEFAULT ABS _binary_baselines_xml_siz

サイズがそこにあるように見えます。ファイルをダンプし、xmlがオフセット34(.data値で指定)にASCIIとして埋め込まれていること、およびそれが正しいことを確認しました。変数で指定されているように、データのサイズは0x132bバイトです。

次に、コードで、いくつかの変数を宣言します。

extern "C"
{
    extern char _binary_baselines_xml_start;
    extern char _binary_baselines_xml_size;
}
static const char* xml_start = &_binary_baselines_xml_start;
const uint32_t xml_size = reinterpret_cast<uint32_t>(&_binary_baselines_xml_size);

これに足を踏み入れると、xmlポインターが正しく、デバッガーでxmlテキストを確認できます。ただし、サイズ記号は値を0x132b(これは私が望むものです)として示していますが、「アドレス0x132bが範囲外です」ことも示しています。変数を使用すると、非常に大きな誤った乱数になります。char *、char []、int、int*などのextern変数を宣言するために、他のあらゆる種類の構文を試しました。結果は常に同じです。価値はありますが、私はそれに到達できないようです。

もう1つの興味深い点は、このコードは、extern変数にアンダースコアを追加しなくても、Windowsマシンで正常に機能することですが、それ以外はすべて同じです。

私はこの方法でobjcopyを使用することについてオンラインで多くを見つけることができないようですので、どんな助けでも大いに感謝されます。

4

1 に答える 1

0

実際の問題が何であるかわかりません。*_size 記号は、サイズを示す絶対記号です。実際に場所を参照できるとは想定されていません (偶然でない限り)。これは、データ変数を実際に定義せずに整数値をリンカに忍び込ませる方法にすぎません。あなたがしていることは、あなたがそれをどのように使用しているかにおいて正しいです。

これについて考える最良の方法は、次のコードがある場合です。

char* psize = reinterpret_cast<char*>(0x1234);
int size = reinterpret_cast<int>(psize);

唯一の違いは、リンカーがシンボルを介して 0x1234 値を入力することです。

于 2009-12-31T20:34:17.527 に答える