空の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として表示するにはどうすればよいですか?