Как работает связь с библиотеками OS C в Windows и Linux? - PullRequest
6 голосов
/ 19 января 2010

Я понимаю, что Linux поставляется с библиотекой ac, которая реализует функции ISO C и функции системных вызовов, и что с этой библиотекой нужно связываться при разработке C. Однако, разные компиляторы c не обязательно создают связываемый код (например, один может дополнить структуры данных, используемые в аргументах функций, отличными от других). Как встроенная библиотека c предназначена для связи, когда я могу использовать любой компилятор для компиляции C? Отличается ли история для статических и динамических связей?

С другой стороны, в Windows каждый компилятор предоставляет свою собственную стандартную библиотеку, которая решает часть проблемы, но системные вызовы все еще находятся в одном наборе DLL. Как приложения на C успешно связаны с этими DLL? Как насчет разных языков? (Те же библиотеки DLL могут использоваться до Visual Net Basic и т. Д.)

Ответы [ 3 ]

4 голосов
/ 19 января 2010

Каждая платформа имеет некоторые «соглашения о вызовах», которых должна придерживаться каждая реализация C, чтобы иметь возможность правильно взаимодействовать с операционной системой. Например, для Windows все функции на основе ОС должны вызываться с использованием соглашения stdcall, в отличие от соглашения C по умолчанию cdecl.

В Linux, поскольку стандартная библиотека C (и ядро) компилируется с использованием GCC, любые другие компиляторы для Linux должны убедиться, что их соглашения о вызовах совместимы с тем, который используется GCC.

3 голосов
/ 19 января 2010

Компиляторы идут со своими реализациями стандартной библиотеки. Просто в Linux предполагается, что любой компилятор будет следовать тем же соглашениям, что и версия GCC, скомпилировавшая библиотеку.

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

Что касается структур и отступов, вы заметите, что большинство фреймворков работают с непрозрачными типами, то есть указателями на структуры. Часто структура структуры даже не доступна для клиентов. Таким образом, они никогда не работают с фактическими данными, а только с указателями на данные, что устраняет проблему с заполнением.

0 голосов
/ 19 января 2010

Стандарты.Вы заметите, что материал stdlib работает с примитивными значениями и массивами - и стандарт этого материала довольно явно описывает, как все должно быть сделано.

...