Что такое ld-linux.Итак.2 и linux-gate.Итак.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 показать иначе, чем другие записи? Какова их роль?

1 ответов


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

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

есть запись в блог описание linux-gate.и это все объясняет.

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

основная цель этой программы-отобразить двоичный файл в память, загрузить любой ссылочные библиотеки в программе (например, libm.Итак.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]