Когда программа в Linux вызывает printf , sleep или любую другую функцию из динамической библиотеки, ее реальный адрес заранее неизвестен из‑за ASLR. Тем не менее вызов каким‑то образом срабатывает. В этой статье мы шаг за шагом разберем, как работают механизмы PLT, GOT и релокации, проследим процесс разрешения адресов с помощью objdump , readelf и GDB, а также увидим вживую, что происходит при первом и последующих вызовах библиотечной функции. В момент запуска программы в Linux ядро загружает ее в память, а динамический компоновщик подгружает все необходимые библиотеки. Механизм, который мы будем разбирать, работает одинаково для любой динамической библиотеки, но в качестве примера мы возьмем стандартную библиотеку языка C libc. so
