У меня есть файл C с некоторыми структурами. В настоящее время я могу получить доступ к структурам, используя один открытый символ pub
.Доступ к объекту GNU файл
char sym_001[] = { 1,2,3,4,5 };
char sym_002[] = { 3,4,5 };
char sym_003[] = { 0,8,15 };
struct _info { int n; char*a } info[] = {
{ 5, &sym_001 },
{ 3, &sym_002 },
{ 3, &sym_003 }
};
typedef struct pat { int a,b; struct _info*i; struct _pat*p } pat;
pat pat1 = { 3, 4, &info[2], 0 };
pat pat2 = { 3, 4, &info[0], &pat1 };
//
struct { int property; pat*p } pub = { 1, &pat2 };
Мне нужно сериализовать поток и десериализовать поток обратно в макет памяти. Одной из проблем являются адреса, которые необходимо каким-то образом заменить смещением в потоке и восстановить с новым адресом в целевом объекте. Но это не настоящая проблема.
Хотя сериализация не должна быть проблемой, я хочу получить доступ к самому компилятору. Я бы предпочел не связывать мой сериализатор с объектным файлом, потому что есть много таких файлов данных для обработки. Есть ли удобный способ доступа к двоичным файлам GNU?
Я пытался использовать objcopy:
objcopy -I elf32-littlearm -O binary DS-Digital8.o foo.bin
Но это дает ноль для всех мест, где я ожидал адрес (что необходимо перемещение).
У вас всегда будет проблема с * адресами * и binutils. Вы можете попробовать * смещение *. Например, в структуре 'info', используйте' ((int) (& info - & sym_001)) 'и сделайте вещи статическими. Или используйте что-то вроде * буферов протокола *. Сериализация имеет много * оговорок *, и они были продуманы другими. Endianess, компактное представление, выравнивание и т. Д. –
@artlessnoise Да, есть некоторые проблемы с сериализацией. Они должны решаться с данными перемещения в объектном файле. Но вопрос в том, как получить доступ к объектным файлам для чтения разделов .rodata и .reloc. – harper
Вы считаете, что работаете на уровне C, возможно, настраивая компилятор GCC, обрабатывающий его (например, с помощью [MELT] (http://gcc-melt.org/) ...)? –