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