#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
toprintf
, поскольку вы передаете длинный 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
спецификатор формата.