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