2013-02-11 14 views
5

Boş bir xlsx dosyasına bir dış bağımlılık içeren bir C++ program var. bu bağımlılığı kaldırmak için kullanıyorum, bunu doğrudan bağlama açısından bir ikili nesneye bu dosyayı dönüştürülen: objdump kullanmald veri dosyası veri boyutunu yapar bir * ABS * ve bir tam sayı değil

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

tarafından

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

takip, ben üç değişken ilan görebilirsiniz:

$ 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 
Daha sonra bu veriler hakkında programımı anlatmak

:

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 

Bu derler ve (ı cmake ile otomatik hale bazı sorun yaşıyorum rağmen, buraya bakın: compile and add object file from binary with cmake), ince bağlar benim kodunda _binary_template_xlsx_size kullandığınızda, bir adresine bir işareti olarak yorumlanır, ancak

o mevcut değil. Yani benim verilerin boyutunu almak için, ben

Bazı araştırmalar objdump içinde *ABS* yukarıdaki "mutlak değerini" anlamına ama neden alamadım söylüyor (int)&_binary_template_xlsx_size (veya (int)(_binary_template_xlsx_end - _binary_template_xlsx_start)) geçmek zorunda. Değişkenini int ve işaretçi olarak görmek için C++ (veya c) programımı nasıl alabilirim?

+0

bunu önlemek için neden ve nasıl olarak belgelerinde bazı ipuçları olabilir düşünüyorum: bir int olarak kullandığınızdan emin, bir makro kullanabilirsiniz. Neden dosyayı bir includable dizi tanımına dönüştürmek için basit bir betik yazmıyoruz? –

+0

Dosya xlsx dosyasıdır: sıkıştırılmış xml dosyaları topluluğu. Bunu yapmamın sebebi, kodun bir kısmını unziplemek, dosyalar arasında yinelemek ve xml'yi ayrıştırmak için harcadığım ve tüm bunları yeniden yapmak istemediğim için oldu. Ayrıca bu eğlenceli. –

+0

Ayrıca verilere çok iyi erişebiliyorum. Bu davranıştan etkilendiğim için burada neler olup bittiğini öğrenmeye çalışıyorum. –

cevap

3

Bir *ABS* sembolü mutlak bir adrestir; Daha sık, --defsym foo=0x1234'u ld'ye geçirerek oluşturulur.

--defsym symbol=expression 

ifadesi tarafından verilen mutlak adresini içeren, çıktı dosyasındaki bir küresel sembolü oluşturun. [...]

Mutlak bir sembol sabit olduğundan, onu bir C kaynağı dosyasına değişken olarak bağlamak mümkün değildir; tüm C nesnesi değişkenleri bir adrese sahiptir, ancak bir sabit yoktur.

extern const char _binary_template_xlsx_size[]; 

yapmak istiyorsanız:

kazara (yani değişken okuma) emin adrese KQUEUE yok yapmak için, sahip olduğunuz diğer sembollerle const char [] olarak tanımlamak en iyisidir

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) 
İlgili konular