Искажение виртуальных адресов для приложений Linux

#linux #executable #elf

#linux #исполняемый файл #elf

Вопрос:

Я пытаюсь понять поток различных приложений в Linux.

Я проследил выполнение двух разных программ (с помощью pintool от Intel).

  1. Программа Hello world, написанная мной.
  2. служебная программа scp.

objdump обеих программ показывает адреса команд в разных диапазонах.

Трассировка выполнения (содержит виртуальные адреса) HelloWorld выдает адреса команд, которые можно увидеть в его objdump, тогда как адреса команд в трассировке выполнения scp не отображаются в objdump scp.

Приложение scp находится в каталоге /usr/bin. Я наблюдал аналогичную ситуацию с другим приложением (ab — apache benchmark), расположенным в /usr/bin .

Загружены ли приложения в этих каталогах специально? Каким может быть способ найти адрес загрузки приложений?

Ответ №1:

Загружены ли приложения в этих каталогах специально

Нет.

Вероятно, что scp большая часть его выполнения выполняется не внутри самого scp двоичного файла, а внутри libc.so.6 и vdso (хотя вы все равно должны увидеть некоторые инструкции в основном двоичном файле).

Другое возможное объяснение заключается в том, что scp ваш дистрибутив построен как не зависящий от позиции исполняемый файл (связанный с -pie флагом). Вы можете доказать или опровергнуть эту теорию, просмотрев readelf -h /usr/bin/scp (посмотрите на тип файла, ET_EXEC против ET_DYN ).

Обновить:

команда readelf указывает DYN (общий объектный файл) для /usr/bin/scp

Итак, мое предположение было правильным, это двоичный файл, не зависящий от позиции.

есть ли у меня способ определить базовый адрес (во время выполнения)

Конечно: вы могли бы:

  • посмотрите /proc/<pid-of-scp>/maps на первое сопоставление /usr/bin/scp с защитой от выполнения или
  • присоедините GDB к scp via gdb -p <pid-of-scp> и используйте info file , или
  • научите свой pin-инструмент сбрасывать сопоставление ( pin он уже отслеживает ваш процесс, поэтому я считаю, что вам просто нужно распечатать нужную информацию по завершении mmap ).

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

1. команда readelf указывает DYN (общий объектный файл) для /usr/bin/scp, а для helloworld — EXEC (исполняемый файл).o. Если /usr/bin/scp является общим объектным файлом, есть ли у меня способ определить базовый адрес (во время выполнения), используемый дляфункции, перечисленные в его objdump ??