Раздел: Линковка и библиотеки¶
Этот раздел охватывает весь путь программы — от исходного кода до запущенного процесса. Вы разберётесь, как работает
компилятор как драйвер (препроцессор, компилятор, ассемблер, линковщик), что находится внутри 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_main → main; .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 |