C elf.h получает смещение ELF64_Shdr

#c #hex #elf

#c #шестнадцатеричный #elf

Вопрос:

Я работаю с elf.h на C, и у меня есть ELF64_Shdr *sh объект, для которого мне нужно получить смещение. Я получаю это так:

 unsigned char offset = sh->sh_offset;
printf("Offset: %xn",offset);
  

но это выводит «Смещение: c0», когда я знаю, что значение на самом деле равно 6c0 (получено из инструмента командной строки elf). Как ни странно, если я сделаю это:

 printf("Offset: %xn",sh->sh_offset);
  

он выводит «Смещение: 5c0», что ближе, но все же не совсем правильно. Кто-нибудь может сказать мне, что я делаю не так? Заранее спасибо за любую помощь!

Комментарии:

1. 6c0 не помещается в символ.

2. Черт возьми, я чувствую себя глупо. Спасибо! Все еще не знаю, как получить правильное смещение.

3. sh->sh_offset имеет тип uint64_t, но %x printf ожидает int (обычно 32 бита). Вы можете попробовать использовать %lx to printf , поскольку вы передаете длинный int . Я не уверен, что это решит проблему, сложно.

4. Просто попробовал это, и возвращает то же самое. Я также попробовал printf("Offset: %dn", sh->sh_offset) и получил 1472, что также равно 5c0.

Ответ №1:

unsigned char offset = sh->sh_offset;

Это ваша проблема прямо здесь. Вы усекаете 64-разрядную сущность типа Elf64_Off до 8 бит. Не делайте этого!

Если вам нужно сохранить смещение, сохраните его в переменной соответствующего типа:

 Elf64_Off offset = sh->sh_offset;
  

Чтобы распечатать его, используйте %lx спецификатор формата.