2009-12-31 1 views
0

Я пытаюсь использовать objcopy для преобразования xml-файла в файл объекта, который затем связан и используется другой разделяемой библиотекой на RHEL5. Я преобразовать файл с помощью следующей команды:Не удается получить доступ к переменной размера в файле, созданной objcopy

objcopy --input формат двоичного --output целевой i386-ПК-Linux-гну --binary-архитектуры i386 baselines.xml baselines.0

объектный файл создается и с помощью readelf я получаю следующее:

таблица символов '.symtab' содержит 5 записей: Num: Значение Размер Тип переплета Vis Ndx Имя 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 РАЗДЕЛ LOCAL DEFAULT 1 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_baselines_xml_sta 3: 0000132b 0 NOTYPE GLOBAL DE FAULT 1 _binary_baselines_xml_end 4: 0000132b 0 NOTYPE GLOBAL DEFAULT ABS _binary_baselines_xml_siz

Так выглядит, что размер там. Я сбросил файл и проверил, что xml внедрен как ascii в смещение 34 (задано значением .data) и что он правильный. Данные имеют размер 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 * и т. Д. Результат всегда один и тот же. Значение есть, но я не могу понять.

Еще один интересный вопрос заключается в том, что этот код отлично работает на машине с Windows без предварительного подчеркивания внешних переменных, но все остальное одинаково.

Я не могу найти много онлайн об использовании objcopy таким образом, поэтому любая помощь будет принята с благодарностью.

ответ

0

Я не уверен, что вы на самом деле проблема. Символ * _size является абсолютным символом для указания размера. Вы не должны иметь возможность фактически ссылаться на местоположение (если не случайно), это всего лишь способ прокрасить целочисленное значение в компоновщик, фактически не определяя переменную данных. То, что вы делаете, правильное в том, как вы его используете.

Лучший способ думать об этом если бы вы имели следующий код:

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

Единственное отличие состоит в компоновщик заполняет значение 0х1234 для вас через символ.

+0

Мне нужен размер, потому что двоичные XML-данные не завершены нулем, и я хочу скопировать его в буфер, который я могу использовать. Символ недоступен, поэтому он не заполняется во время выполнения. Я получил его для работы в простой тестовой программе с .so, который определяет и возвращает данные и основной, который использует .so для получения данных. Однако либо main.cpp должен включать файл .so cpp с объявлением extern, либо помещать extern в заголовок .so и создавать функцию, которая ссылается на переменную. – adevi003