r
Причем даже на обычных бинарниках не срабатывает. Видимо я что-то базовое упускаю.
Например
ltrace -e strcpy wget --help >/dev/null
+++ exited (status 0) +++
Size: a a a
r
ltrace -e strcpy wget --help >/dev/null
+++ exited (status 0) +++
r
a
🧐
s
r
libdl
?s
r
s
/etc/makepkg.conf, как верно заметил @dura_lex. (Это касается только пакетов, которые именно собираются на тачке). По дефолту в
makepkg.confустановлен флаг
-fno-plt, т.е. все приложения установливаемые в систему будут без PLT. Как итог, ltrace не будет выполнять трассировку.
makepkg.conf, установил aircrack-ng-git через yay и запустил его через ltrace - получил трассировку.
AX
.rela.dyn
, дают реальный адрес переменной (характер и способ «выдачи» адреса регулируется типами релокаций). Это про данные в PIC, что же касается функций, то их адреса обычно вычисляются как раз таки с помощью PLT. PLT обычно содержит функции-трамплины, которые уже вызывают необходимую функцию. Я, конечно, могу ошибаться, но вкратце, без нюансов, вроде, всё так работает.-fno-plt
— man 1 gcc
: не использовать PLT для PIC, вместо трамплинов и прочего загружать адреса вызываемых функций сразу же на места их непосредственного вызова, это позволяет проводить оптимизации и бла-бла-бла, можете почитать сами.ltrace
. Его функционал не особо мудрёный: он использует ptrace
(man 2 ptrace
) для модификации памяти целевых процессов, считывает PLT, перезаписывает трамплины бряками (int $3
), запускает, ждёт SIGTRAP
, подменяет инструкции и т. д. К сожалению, по GOT ltrace
не работает, хотя, наверное, мог бы.-fnoplt
, например, флаг -f
позволяет трассировать дочерние процессы (правда, я не представляю, как это всё будет работать в многопоточном режиме, неудобно должно быть).makepkg.conf
,python36
, либо младше, либо python-git
с нужной версией.cat /etc/makepkg.conf | grep "^CFLAGS" | sed 's/ -fno-plt//' > ~/.makepkg.conf
, CFLAGS
, думаю, будет достаточно;PKGBUILD
с AUR, либо воспользоваться AUR helpers.ptrace
из-за Yama Linux Security Module. Как отключить-включить см. /proc/sys/kernel/yama/ptrace_scope
в man 2 ptrace
.ltrace
или чем угодно ещё обнаружить все вызовы dlsym
, dlopen
и подобных, написать для данных функций обёртки с нужным кодом, по окончанию работы которого передавать управление на нужную функцию, передать путь к кастомной библиотеке при вызове целевого файла (LD_PRELOAD
и иже с ними).AX
ltrace
, таким образом чтобы он при обнаружении новой загруженной библиотеки распространял свои бряки дальше. Отследить и выявить можно опять же по вышеназванным функциям, дополнительную информацию можно получить из структуры r_debug
. Я нашёл исходники уже сделанного чего-то подобного. Я запушил на AUR версию `ltrace` с официального гита, она, вроде, собирается и работает, так что можно без проблем накатить модифицированную версию в PKBUILD
, но, честно говоря, я не уверен, что оно будет работать, логика run-time линкеров за эти годы таки поменялась. К слову, версия с гита хоть и давно не обновлялась, но всё равно гораздо новее той, что в некоторых репозиториях.LD_AUDIT
. Всё бы хорошо, но она не работает на современном glibc
, нужно допиливать, т. к. поддержка давно прекращена. Жаль, хороший потенциал был.perf_events
из ядра. Да, может показывать не всё, терять данные т. к. это всё-таки профилировщик, но, как по мне, для «просто посмотреть» вариант идеальный, использую его для всего. Настроек и фильтров куча и маленькая тележка. В нашем случае будет достаточно:# perf trace -F min --call-graph=dwarf -- python -c "print('HW')"В том числе будет показывать и
dlsym
, dlopen
, и даже имена (если будут) вызываемых функций таким методом.AG
s
ltrace
, таким образом чтобы он при обнаружении новой загруженной библиотеки распространял свои бряки дальше. Отследить и выявить можно опять же по вышеназванным функциям, дополнительную информацию можно получить из структуры r_debug
. Я нашёл исходники уже сделанного чего-то подобного. Я запушил на AUR версию `ltrace` с официального гита, она, вроде, собирается и работает, так что можно без проблем накатить модифицированную версию в PKBUILD
, но, честно говоря, я не уверен, что оно будет работать, логика run-time линкеров за эти годы таки поменялась. К слову, версия с гита хоть и давно не обновлялась, но всё равно гораздо новее той, что в некоторых репозиториях.LD_AUDIT
. Всё бы хорошо, но она не работает на современном glibc
, нужно допиливать, т. к. поддержка давно прекращена. Жаль, хороший потенциал был.perf_events
из ядра. Да, может показывать не всё, терять данные т. к. это всё-таки профилировщик, но, как по мне, для «просто посмотреть» вариант идеальный, использую его для всего. Настроек и фильтров куча и маленькая тележка. В нашем случае будет достаточно:# perf trace -F min --call-graph=dwarf -- python -c "print('HW')"В том числе будет показывать и
dlsym
, dlopen
, и даже имена (если будут) вызываемых функций таким методом.AX
ltrace
на rust от Джулии Иванс, к сожалению сейчас не работает, сигфолтится, но код наипростейший, можно самому написать/исправить.JG
ltrace
на rust от Джулии Иванс, к сожалению сейчас не работает, сигфолтится, но код наипростейший, можно самому написать/исправить.AX
ptrace
на сколько я знаю, но уже получше, чем ltrace
, правда, вывод не очень подходит для задачи, но можно же самому подогнать, как надо. Ещё советую частоту увеличить, чтобы ничего не пропускал. Например так:py-spy record -r 1000000 -n -f raw -o request.txt -- python3 -c 'import requests; requests.get("https://www.python.org")'
AX
S