5

空のxlsxファイルへの外部依存関係を含むC++プログラムがあります。この依存関係を削除するために、次を使用して、このファイルを直接リンクすることを考慮して、このファイルをバイナリオブジェクトに変換しました。

ld -r -b binary -o template.o template.xlsx

に続く

objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents template.o template.o

objdumpを使用すると、次の3つの変数が宣言されていることがわかります。

$ objdump -x template.o

template.o:     file format elf64-x86-64
template.o
architecture: i386:x86-64, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .rodata       00000fd1  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
0000000000000000 l    d  .rodata        0000000000000000 .rodata
0000000000000fd1 g       *ABS*  0000000000000000 _binary_template_xlsx_size
0000000000000000 g       .rodata        0000000000000000 _binary_template_xlsx_start
0000000000000fd1 g       .rodata        0000000000000000 _binary_template_xlsx_end

次に、このデータについてプログラムに伝えます。

template.h:
#ifndef TEMPLATE_H
#define TEMPLATE_H

#include <cstddef>
extern "C" {
  extern const char _binary_template_xlsx_start[];
  extern const char _binary_template_xlsx_end[];
  extern const int  _binary_template_xlsx_size;
}
#endif

これは正常にコンパイルおよびリンクされます(cmakeで自動化するのに問題がありますが、ここを参照してください:cmakeを使用してバイナリからオブジェクトファイルをコンパイルおよび追加します

ただし、コードで_binary_template_xlsx_sizeを使用すると、存在しないアドレスへのポインターとして解釈されます。したがって、データのサイズを取得するには、渡す(int)&_binary_template_xlsx_size(または(int)(_binary_template_xlsx_end - _binary_template_xlsx_start))必要があります

いくつかの調査によると、*ABS*上記のobjdumpのは「絶対値」を意味しますが、理由はわかりません。c ++(またはc)プログラムで、変数をポインターではなくintとして表示するにはどうすればよいですか?

4

1 に答える 1

3

シンボルは*ABS*絶対アドレスです。多くの場合--defsym foo=0x1234、ld に渡すことによって作成されます。

--defsym symbol=expression

式で指定された絶対アドレスを含むグローバル シンボルを出力ファイルに作成します。[...]

絶対シンボルは定数であるため、変数として C ソース ファイルにリンクすることはできません。すべての C オブジェクト変数にはアドレスがありますが、定数にはありません。

const char []誤ってアドレスを逆参照 (つまり、変数を読み取って) しないようにするには、他のシンボルと同じように定義するのが最善です。

  extern const char _binary_template_xlsx_size[];

として使用していることを確認したい場合はint、マクロを使用できます。

  extern const char _abs_binary_template_xlsx_size[] asm("_binary_template_xlsx_size");
  #define _binary_template_xlsx_size ((int) (intptr_t) _abs_binary_template_xlsx_size)
于 2013-02-11T18:21:43.170 に答える