2013-11-14 5 views
23

Когда я бегу ldd program я получаю выход формыЧто такое ld-linux.so.2 и linux-gate.so.1?

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 показать иначе, чем другие записи? Каковы их роли?

ответ

40

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

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

Существует довольно хороший blog entry, описывающий 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   0x0000000000000238 0x0000000000400238 0x0000000000400238 
       0x000000000000001c 0x000000000000001c R  1 
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
+0

«время выполнения переводчика»? Можете ли вы рассказать об этом, пожалуйста? –

+2

извинения, технический термин - * program * interpreter - я добавил абзац, подробно описывающий большую часть работы, которую он делает – Petesh

+0

Большое спасибо, thats очищает именно ту путаницу, к которой я стремился :). Невероятно, что вы также объясните, как может возникнуть путаница, глядя на секции ELF, я этого не знал. –