Почему Двоичный интерфейс приложений важен для программирования

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

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

8
задан linuxbuild 9 April 2011 в 13:13
поделиться

7 ответов

[

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

] [

]Таким образом, нет. Совместимость ABI актуальна для любого вида динамического линковки (меньше для статического).[

] [

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

].
8
ответ дан 5 December 2019 в 08:24
поделиться
[

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

].
6
ответ дан 5 December 2019 в 08:24
поделиться
[

] "ABI" (см. [] Википедия []) - это зонтичный термин для всех допущений, которые операционная система делает в отношении форматов данных. Он включает в себя компоновку исполняемых файлов и любую структуру данных в памяти с учетом ее определения на С.[

] [

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

] [

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

].
3
ответ дан 5 December 2019 в 08:24
поделиться
[

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

] [

]ABI не очень важен для программистов как таковых, потому что мы уже инстинктивно знаем, что вы не можете запустить Windows-приложение на Macs. Даже непрограммисты (за исключением голливудских сценаристов) знают это. Это важно для составителей компиляторов, когда им нужно ориентироваться на конкретную среду.[

] [

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

].
1
ответ дан 5 December 2019 в 08:24
поделиться
[

] Не забывайте, что на языке Си++ реализовано управление именами в ABI[

].
1
ответ дан 5 December 2019 в 08:24
поделиться
[

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

] [
    ] [
  1. ][

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

    ][
  2. ] [
  3. ][

    ]syscall to os. (если вы статически связываете syscall со своим двоичным компоновщиком, а не динамически связываете с libc)[

    ][
  4. ] [
] [

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

].
1
ответ дан 5 December 2019 в 08:24
поделиться
[

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

] [

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

]
0
ответ дан 5 December 2019 в 08:24
поделиться