2013-07-29 2 views
0

У меня есть файл 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 

Но это дает ноль для всех мест, где я ожидал адрес (что необходимо перемещение).

+0

У вас всегда будет проблема с * адресами * и binutils. Вы можете попробовать * смещение *. Например, в структуре 'info', используйте' ((int) (& info - & sym_001)) 'и сделайте вещи статическими. Или используйте что-то вроде * буферов протокола *. Сериализация имеет много * оговорок *, и они были продуманы другими. Endianess, компактное представление, выравнивание и т. Д. –

+0

@artlessnoise Да, есть некоторые проблемы с сериализацией. Они должны решаться с данными перемещения в объектном файле. Но вопрос в том, как получить доступ к объектным файлам для чтения разделов .rodata и .reloc. – harper

+0

Вы считаете, что работаете на уровне C, возможно, настраивая компилятор GCC, обрабатывающий его (например, с помощью [MELT] (http://gcc-melt.org/) ...)? –

ответ

0

Бессонные комментарии о шуме дают правильный намек. Библиотека libelf имеет полную поддержку для доступа к объекту.

Смежные вопросы