Подтвердить что ты не робот

Что такое ld-linux.so.2 и linux-gate.so.1?

Когда я запускаю ldd program, я получаю вывод формы

    linux-gate.so.1 =>  (0xb77ae000)
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000)
    libm.so.6 => /lib/libm.so.6 (0xb7691000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000)
    libc.so.6 => /lib/libc.so.6 (0xb74c2000)
    /lib/ld-linux.so.2 (0xb77af000)

Можете ли вы объяснить вывод, а причина linux-gate.so.1 и ld-linux.so.2 показать иначе, чем другие записи? Каковы их роли?

4b9b3361

Ответ 1

Я надеюсь, что вы не спрашиваете о главных записях, которые заявляют, что для запрошенной библиотеки libm.so.6 она была найдена в файле /lib/libm.so.6, например, но спрашивает о двух выбросах.

Почему они отображаются по-разному? для linux-gate.so.1, потому что это не файл на диске - он отображается ядром как механизм для выполнения системных вызовов. Для /lib/ld-linux.so.2 это потому, что это программный интерпретатор, который используется для фактического запуска приложения.

Там довольно хорошая запись описывающая linux -gate.so, и это объясняет это довольно хорошо.

Для /lib/ld-linux.so.2 вам нужно немного понять, что происходит при запуске двоичного файла ELF. Короткий ответ заключается в том, что обработчик ядра для этих типов двоичных файлов использует этот файл для запуска приложения.

Основной целью этой программы является отображение двоичного кода в память, загрузка любых библиотек, на которые имеются ссылки в программе (например, ранее упомянутый libm.so.6), а затем передать управление начальному адресу исполняемого двоичного файла.

Эта программа определяется как часть структуры файла ELF в разделе INTERP заголовка программы. Для 32-битных бинарных файлов Linux это типичное имя 32-битного интерпретатора. Для 64-битных двоичных файлов вы найдете, что он обычно называется ld-linux-x86_64.so.2 (для 64-разрядных платформ x86).

Вы можете сами определить эту информацию, используя readelf -l, и раздел INTERP:

INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
               0x000000000000001c 0x000000000000001c  R      1
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]