#linux #executable #elf
#linux #исполняемый файл #elf
Вопрос:
Я пытаюсь понять поток различных приложений в Linux.
Я проследил выполнение двух разных программ (с помощью pintool от Intel).
- Программа Hello world, написанная мной.
- служебная программа 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
viagdb -p <pid-of-scp>
и используйтеinfo file
, или - научите свой pin-инструмент сбрасывать сопоставление (
pin
он уже отслеживает ваш процесс, поэтому я считаю, что вам просто нужно распечатать нужную информацию по завершенииmmap
).
Комментарии:
1. команда readelf указывает DYN (общий объектный файл) для /usr/bin/scp, а для helloworld — EXEC (исполняемый файл).o. Если /usr/bin/scp является общим объектным файлом, есть ли у меня способ определить базовый адрес (во время выполнения), используемый дляфункции, перечисленные в его objdump ??