Перейти к содержанию

Раздел: Линковка и библиотеки

Этот раздел охватывает весь путь программы — от исходного кода до запущенного процесса. Вы разберётесь, как работает компилятор как драйвер (препроцессор, компилятор, ассемблер, линковщик), что находится внутри ELF-файла, как линковщик разрешает ссылки между символами, и что происходит с программой до выполнения первой строки main. Отдельное внимание уделяется практическим инструментам: readelf, objdump, nm, gdb, strace.

Ключевые концепции раздела: объектные файлы и релокации, статическая и динамическая линковка, PLT/GOT и ленивое связывание, таблица символов и манглирование имён C++, CRT-объекты и жизненный цикл процесса, системные вызовы как интерфейс между пространством пользователя и ядром.

Темы

Страница Что рассматривается
Стадии сборки Препроцессинг → компиляция → ассемблирование → линковка; флаги -E, -S, -c; что внутри объектного файла; как создать статическую библиотеку
Линковка и библиотеки Что делает линковщик; статические (.a) и динамические (.so) библиотеки; dlopen; ручной вызов ld с CRT-объектами
Статическая и динамическая линковка -static, ldd, LD_LIBRARY_PATH, rpath (DT_RPATH/DT_RUNPATH), LD_PRELOAD, LD_DEBUG; порядок поиска .so; ldconfig
Формат ELF Типы ELF-файлов (REL, EXEC, DYN, CORE); секции (.text, .data, .bss, .symtab, .dynamic, .plt, .got); сегменты; readelf, objdump, nm, objcopy; PLT/GOT и ленивое связывание
Символы и манглирование Таблица символов; binding (local/global/weak); visibility (default/hidden/protected); name mangling в C++ (Itanium ABI); c++filt; strip; релокации
Запуск и завершение программы Цепочка execve → ядро → ld.so_start__libc_start_mainmain; .init_array/.fini_array; atexit; __attribute__((constructor)); exit vs _exit
Динамический линковщик (ld.so) изнутри Self-relocation ld.so; BFS-обход DT_NEEDED и scope lookup; LD_PRELOAD/RTLD_NEXT; dlopen/dlsym/dlclose; TLS-модели (initial-exec, general-dynamic); audit API (la_objopen, la_symbind64); LD_DEBUG; кэш /etc/ld.so.cache
PLT/GOT и lazy binding Секции .plt, .plt.got, .got, .got.plt; пошаговый разбор lazy resolution через _dl_runtime_resolve; BIND_NOW/LD_BIND_NOW; Partial vs Full RELRO; GOT-overwrite атаки; ASLR и PIE