Почему двоичный интерфейс приложения важен для программирования - PullRequest
8 голосов
/ 09 января 2010

Я не понимаю, почему ABI является важным контекстом разработки приложений пользовательского пространства. Считается ли набор системных вызовов для операционной системы ABI? Но если это так, то разве не все сложности, связанные с системными вызовами, заключены в стандартные библиотеки?

Итак, Совместимость ABI имеет значение только для запуска статически связанных приложений на разных платформах, поскольку системные вызовы будут встроены в двоичный файл?

Ответы [ 7 ]

8 голосов
/ 09 января 2010

ABI определяет набор выравнивания, соглашение о вызовах и типы данных, которые являются общими для системы. Это делает ABI очень важным, если вы делаете какие-либо динамические ссылки; поскольку без него код из одного приложения не может вызвать код, предоставленный другим.

Итак, нет. Совместимость ABI актуальна для всех динамических связей (в меньшей степени для статических).

Стоит еще раз подчеркнуть , что ABI системы влияет на работу между приложениями, а также на работу приложения в операционной системе.

6 голосов
/ 09 января 2010

ABI - это больше, чем доступно для системных вызовов. Также обычно описывается фактический способ передачи аргументов в функции и как структуры и объекты размещаются в памяти. Без согласованного ABI код, созданный разными компиляторами, может не вызывать друг друга - если вы вызываете foo (a, b), и один компилятор помещает a и b в стек, а другой передает их в регистры, вы получаете столкновение ABI.

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

"ABI" (см. Wikipedia ) - это общий термин для всех предположений, которые операционная система делает в отношении форматов данных. Это включает в себя макет исполняемых файлов и структуру любой структуры данных в памяти с учетом ее определения C.

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

ABI не имеет большого значения, если вы заботитесь только о компиляции стандартного кода. Это немного имеет значение, когда вы нарушаете стандарт и делаете непереносимые вещи, такие как приведение char * к long *. Это еще более важно при написании большого массива кода сборки. Написав что-то вроде компоновщика или отладчика, он может воплотить большую часть работы, которую предстоит сделать.

1 голос
/ 09 января 2010

Только если вы хотите, чтобы ваш двоичный файл запускался в другой среде без перекомпиляции, то есть некоторые места, которые вам могут понадобиться, чтобы принять во внимание ABI:

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

  2. системный вызов ОС. (если вы статически связали системный вызов с вашим двоичным файлом, вместо этого динамически связывайтесь с libc)

На самом деле большинству разработчиков не нужно принимать во внимание ABI, только бинарный загрузчик / разработчик инструментов должен знать об этом больше.

1 голос
/ 09 января 2010

Не забывайте, что в C ++ способ искажения имени реализован в ABI

1 голос
/ 09 января 2010

Несовместимый ABI - вот почему, несмотря на то, что OSX, Linux, Solaris, Windows и * BSD все работают на процессорах Intel x86, это простая программа POSIX только для POSIX, скомпилированная в одной ОС, которая не использует какие-либо специфические или собственные системные вызовы производителя и / или библиотеки обычно не могут работать на одной ОС при компиляции для другой ОС *.

ABI не очень важен для программистов как таковых, потому что мы уже инстинктивно знаем, что вы не можете запустить приложение Windows на Mac. Даже непрограммисты (кроме сценаристов Голливуда) знают это. Разработчикам компиляторов важно, когда им нужно ориентироваться на определенную среду.

* примечание: некоторые операционные системы, такие как Linux и BSD, поддерживают внешний ABI, так что простая программа командной строки Linux иногда может выполняться на BSD без изменений. И, конечно, есть слои эмуляции, как вино.

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

Системные вызовы также следуют ABI - интерфейс системного вызова отличается от операционной системы к операционной системе.

Статическое связывание вашего приложения и стандартной библиотеки в нем свяжет его в один системный вызов ABI. Например, FreeBSD позволяет использовать ABI системного вызова Linux только через модуль эмуляции.

...