Библиотеки, которые связаны по умолчанию - PullRequest
4 голосов
/ 07 августа 2011

Мой код в test.c:

int main(){
return 0;
}

Динамически разделяемые библиотеки, от которых зависит скомпилированный исполняемый файл:

$ gcc -o test test.c
$ ldd test
    linux-gate.so.1 =>  (0x00783000)
    libc.so.6 => /lib/libc.so.6 (0x00935000)
    /lib/ld-linux.so.2 (0x00ea5000)
  1. Мне было интересно, какую роль играют три библиотеки?
  2. К какой библиотеке относится функция main? /lib/libc.so.6?
  3. К какой библиотеке принадлежит return? /lib/libc.so.6?
  4. Все ли три библиотеки динамически связаны по умолчанию с помощью gcc?
  5. Как найти статические библиотеки, на которые gcc ссылается по умолчанию?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 07 августа 2011

Отличное описание как linux выполняет мой main ()? Там вы найдете ответ и, возможно, многое другое!

2 голосов
/ 07 августа 2011
  1. linux-gate - это виртуальный общий объект, который действует как соединение с системными вызовами в ядре. libc - это glibc, который предоставляет такие функции, как printf() и так далее. ld-linux - это загрузчик glibc, который позволяет загружать другие общие объекты.

  2. main() принадлежит вашему коду. Он вызывается crt1.o, который связан с исполняемым файлом с помощью gcc (ну, в частности, ld).

  3. return не функция, а скорее языковая конструкция, поэтому gcc превращает ее непосредственно в код, содержащийся в объектном (и в конечном итоге исполняемом) файле. Кроме того, значение, возвращаемое из main(), перехватывается crt1.o и превращается в код результата программы.

2 голосов
/ 07 августа 2011
  1. linux-gate.so на самом деле не разделяемая библиотека, а часть ядра, которая действует как единое целое и делает возможными быстрые системные вызовы. ld-linux.so - это фрагмент кода, который позволяет загружать другие разделяемые библиотеки. libc.so - это библиотека C, содержащая стандартные функции, такие как printf и strcpy.
  2. main не принадлежит ни одной библиотеке. Он принадлежит вашей программе, в том смысле, что его собранная версия полностью хранится в двоичном файле test.
  3. return не функция, а конструкция языка C.
  4. Нет, он также ссылается на libgcc, который, по-видимому, не является разделяемой библиотекой в ​​вашей системе (или она будет отображаться) и некоторым кодом запуска. g++ будет дополнительно ссылаться на libstdc++.so (стандартная библиотека C ++) и libm.so (математическая часть стандартной библиотеки C).
1 голос
/ 07 августа 2011

ld-linux.so обеспечивает магию, которая помогает ldd работать.libc.so является частью библиотеки времени выполнения C.Помимо прочего, библиотека времени выполнения содержит фактическую точку входа, которая вызывает main.

main, предоставленную вашим кодом.return это не функция, это ключевое слово на языке C.

1 голос
/ 07 августа 2011

linux-gate - это виртуальная библиотека, обеспечивающая доступ к системным функциям. Его полное название это Linux Virtual Dynamic Shared Object. Используется libc.

libc - время выполнения C. Это то, что на самом деле вызывает main () для вас. (Это можно обойти, если вы не используете какие-либо функции Си.)

ld-linux - это динамический компоновщик, который на самом деле знает, как загрузить и вызвать для вас время выполнения C.

main живет в test.o, а не в библиотеке.

return - это ключевое слово, а не функция. Он предписывает компилятору выдавать код, чтобы функция возвращала управление вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...