При разработке больших систем с общими динамическими библиотеками иногда возникают баги, которые сложно отловить: на системе лежит несколько версий библиотек, и загружается не та, что нужна. Раньше автор лечил это через strace — смотрел, к каким файлам обращается процесс. Но есть способ гораздо эффективнее: переменная окружения LD_DEBUG.
Если её выставить, динамический линковщик в Linux начнёт сыпать отладочную информацию прямо в консоль. Чтобы посмотреть доступные опции, достаточно запустить любую программу с LD_DEBUG=help — например, LD_DEBUG=help cat. Вот что можно включить: libs (показывает пути поиска библиотек), reloc (обработка перемещений), files (прогресс по входным файлам), symbols (таблица символов), bindings (информация о связывании символов), versions (зависимости версий), all (всё сразу), statistics (статистика перемещений) и unused (неиспользуемые DSO). Вывод можно перенаправить в файл через LD_DEBUG_OUTPUT.
Автор приводит пример запуска LD_DEBUG=all cat на своём ноутбуке. Вывод огромный: линковщик шаг за шагом показывает, как ищет libc.so.6 — проверяет пути из LD_LIBRARY_PATH, потом кеш /etc/ld.so.cache, находит файл, строит карту ссылок, проверяет версии вроде GLIBC_2.4, обрабатывает перемещения и резолвит символы — malloc, free, stdout и сотни других. Этот лог полезен не только для отладки неправильной загрузки, но и для поиска проблем с производительностью из-за чрезмерной динамической загрузки.
В статье также перечислены другие полезные инструменты для работы с линковкой: strace (все системные вызовы), ldd (разрешение зависимостей), objdump -x YOURFILE | grep NEEDED (список необходимых библиотек), patchelf (меняет rpath в ELF-исполняемом файле), LD_PRELOAD (подмена библиотек). Для Windows автор советует включить «Show Loader Snaps» через gflags.exe, а затем смотреть лог загрузки DLL в windbg.
В итоге LD_DEBUG — простой, но очень мощный инструмент для отладки проблем с динамическими библиотеками в Linux.