Я читаю документацию для uprobe tracer и есть инструкция, как вычислить смещение функции в памяти. Я цитирую его здесь.Вычисление смещения функции в памяти
В следующем примере показано, как сбросить указатель инструкции и% ax зарегистрироваться на зондированный текстовый адрес. Зонд функции zfree в/бен/Zsh:
# cd /sys/kernel/debug/tracing/ # cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp 00400000-0048a000 r-xp 00000000 08:03 130904 /bin/zsh # objdump -T /bin/zsh | grep -w zfree 0000000000446420 g DF .text 0000000000000012 Base zfree
0x46420 это смещение в zfree объекта/бен/Zsh, который загружен в 0x00400000.
Я не знаю, почему, но они взяли вывод 0x446420 и вычитали 0x400000, чтобы получить 0x46420. Это было для меня ошибкой. Почему 0x400000?
Я попытался сделать то же самое на своей Fedora 23 с ядром 4.5.6-200.
Сначала я выключил памяти адрес рандомизации
echo 0 > /proc/sys/kernel/randomize_va_space
Тогда я понял, где двоичная в памяти
$ cat /proc/`pgrep zsh`/maps | grep /bin/zsh | grep r-xp
555555554000-55555560f000 r-xp 00000000 fd:00 2387155 /usr/bin/zsh
Принимал смещение
[email protected]:~ $ objdump -T /bin/zsh | grep -w zfree
000000000005dc90 g DF .text 0000000000000012 Base zfree
И понял, где zfree является через gdb
$ gdb -p 21067 --batch -ex 'p zfree'
$1 = {<text variable, no debug info>} 0x5555555b1c90 <zfree>
[email protected]:~ $ python
Python 2.7.11 (default, Mar 31 2016, 20:46:51)
[GCC 5.3.1 20151207 (Red Hat 5.3.1-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> hex(0x5555555b1c90-0x555555554000)
'0x5dc90'
Видите ли, у меня есть тот же результат, что и в objdump, не вычитая ничего.
Но тогда я попробовал то же самое на другой машине с SLES, и там это то же самое, что и в документации по шкафам.
Почему существует такая разница? Как мне вычислить правильное смещение?
Документ говорит об этом: в объекте/bin/zsh, который загружается в 0x00400000. Предполагается, что смещение должно относиться к адресу загрузки программы, поэтому вам нужно вычесть адрес загрузки программы из абсолютного адреса функции. – dbrank0
Что касается базового адреса на многих системах: 0x400000 - см. [Почему адреса виртуальной памяти для Linux-файлов начинаются с 0x8048000] (http://stackoverflow.com/questions/2966426). Fedora 23 создает свои пакеты с '-fPIC -shared', поэтому смещение нагрузки равно 0, а базовый адрес либо произвольный (с ASLR), либо 0x555555554000. –