В этом случае ваши адреса являются абсолютными, потому что у вас есть исполняемый файл , зависящий от позиции (не P IE). В метаданных ELF есть поле (устанавливаемое компоновщиком), в котором указывается, какой виртуальный адрес отображать исполняемый файл. Вы можете использовать readelf -a
, чтобы увидеть это и многое другое.
В исполняемом файле P IE шестнадцатеричные адреса будут относиться к «базе изображений», что обычно означает относительно начала файла. (Аналогично .o
, где адреса отсчитываются от 0
в начале раздела .text
). Вы можете использовать --adjust-vma=offset
для установки базового адреса для печати этих адресов.
Да, столбец 2 представляет собой шестнадцатеричный код машинного кода в виде отдельных байтов в порядке памяти . Objdump не интерпретирует их как слова с прямым порядком байтов или что-то в этом роде, просто пару шестнадцатеричных цифр на байт в порядке увеличения адреса.
x86 машинный код в основном байт-поток . Инструкции состоят из
[prefixes] opcode [modrm [SIB] displacement0/8/32] [immediate8/32]
Код операции представляет собой либо один байт, либо последовательность байтов, указанную в порядке следования памяти в документации Intel / AMD, например, 0F AF /r
для imul reg, reg/mem
Некоторые инструкции имеют 16-битные немедленные значения, но обычно это 1 или 4 байта, если они вообще присутствуют.
Порядковый номер имеет значение только для многобайтовых смещений в режимах адресации или для нескольких -байт немедленно.
например, mov $0x12345678, %eax
в foo.s
, собирается с gcc -c foo.s
в .o
, который разбирается как:
0: b8 78 56 34 12 mov $0x12345678,%eax
См. также дополнительные ссылки на документы и руководства по x86 в x86-теге SO x wiki , включая руководства Intel по PDF