О внутренней логике компилятора C - PullRequest
1 голос
/ 15 июля 2010

Когда мы создаем программу, некоторые символы должны быть разрешены во время соединения (например, в .lib),

, но некоторые могут быть разрешены во время выполнения (в .dll).,

я сомневаюсь, что как об этом узнает компилятор, или как мы уведомим компилятор об этом?

Ответы [ 5 ]

3 голосов
/ 15 июля 2010

Когда вы связываете свой код, компилятор ищет в статических и динамических библиотеках неопределенные символы.Если он находит динамический символ, экспортированный динамической библиотекой, то он переносит разрешение символа на время выполнения;если он находит статический символ, он сразу же разрешает символ;и если он вообще не находит символ, он сообщает об ошибке (если вы не компилируете общую библиотеку, в этом случае все в порядке).

Вы можете проверить динамические символы, экспортируемые общей библиотекойиспользуя nm -D.

1 голос
/ 15 июля 2010

Вы должны объявить прототип для функций, тела которых недоступны во время компиляции .

Это можно сделать, включив соответствующий заголовок (.h файл), который будет содержать такое определение:

int foo(int bar);

Обратите внимание на отсутствие тела там.

Часто с разделяемыми библиотеками также существует слой косвенности, где формируется структура, содержащая указатели на функции. Когда библиотека загружена, она настраивает указатели функций для ссылки на функции, содержащиеся в общей библиотеке.

0 голосов
/ 15 июля 2010

Компилятору необходимо знать объявление функции во время компиляции. Затем компоновщик будет ссылаться на объявление во время ссылки, чтобы сделать исполняемый файл.

Для динамически загружаемых библиотек вы вставляете код для извлечения символов во время выполнения, используя dlopen dlsym и dlclose. Теперь эти вызовы функций ищут символы и, если они не найдены в динамических библиотеках, возвращают ошибку. Следовательно, вам нужно обработать и эту ошибку. Динамическая загрузка библиотеки не гарантирует, что символы были разрешены и связаны. Он все еще должен присутствовать при загрузке динамической библиотеки.

РЕДАКТИРОВАТЬ: Исправлена ​​ужасная грамматика

0 голосов
/ 15 июля 2010

Работает компоновщик.

  • Для статических функций компоновщик включает библиотеки в ваш исполняемый файл. Звонки на фиксированные позиции в памяти.
  • Для динамических библиотек компоновщик поместил "искатель" времени выполнения для библиотеки. Динамические библиотеки публикуют список функций и их относительные адреса памяти. Таким образом, среда выполнения может заполнить список указателей на них.

Исходный код для динамических функций может быть скомпилирован как вызов указателя функции. [действительно, это работа компоновщика: заменить вызовы функций на его ссылки для создания исполняемого файла].

0 голосов
/ 15 июля 2010

Те, которые могут быть решены во время ссылки:те, которые не могут, затем ищутся в общих библиотеках во время выполнения.

...