Я не понимаю, почему ABI является важным контекстом разработки приложений пространства пользователя. Набор системных вызовов операционной системы, рассмотрел ABI? Но раз так затем разве все сложности не расценивают системные вызовы, инкапсулировавшие в стандартных библиотеках?
Таким образом действительно ли совместимость ABI только важна для выполнения статически связанных приложений на различных платформах, так как системные вызовы были бы встроены в двоичный файл?
]ABI []ABI[] определяет набор выравнивания, соглашение о вызовах и типы данных, которые являются общими для системы. Это делает ABI ужасно важным, если вы делаете какое-либо динамическое выравнивание; так как без него код из одного приложения не имеет возможности вызвать код, предоставленный другим.[
] []Таким образом, нет. Совместимость ABI актуальна для любого вида динамического линковки (меньше для статического).[
] []Ее ценность []еще раз подчеркивает [], что ABI системы влияет на работу между приложениями, а также на работу приложений в операционной системе.[
].] ABI - это больше, чем доступные системные вызовы. Он также обычно описывает реальный способ передачи аргументов в функции и то, как структуры и объекты располагаются в памяти. Без последовательного ABI код, собранный разными компиляторами, может не вызывать друг друга - если вы вызываете foo(a,b) и один компилятор толкает a и b на стеке, в то время как другой передаёт их в регистрах, у вас происходит столкновение ABI.[
].] "ABI" (см. [] Википедия []) - это зонтичный термин для всех допущений, которые операционная система делает в отношении форматов данных. Он включает в себя компоновку исполняемых файлов и любую структуру данных в памяти с учетом ее определения на С.[
] []Этот термин также обычно охватывает требования к форматированию между программами, написанными на одном и том же языке. Каждый язык имеет свои особенности, которые могут привести к различным соглашениям внутри исполняемых форматов и структур памяти, но в конечном итоге все они должны генерировать исполняемые файлы, совместимые с ОС, и структуры данных, совместимые с набором инструкций процессора.[
] []ABI не имеет большого значения, если вы заботитесь только о компиляции стандартного кода, соответствующего стандартам. Немного важно, когда вы нарушаете стандарт и делаете непредсказуемые вещи, такие как кастинг []char *[
] на []long *[
]. Это еще более важно при написании большого объема ассемблерного кода. Написав что-то вроде компоновщика или отладчика, можно воплотить в себе большую часть работы.[
]Несовместимый ABI - вот почему, несмотря на то, что OSX, Linux, Solaris, Windows и *BSD работают на процессорах Intel x86, простая приветственная POSIX-программа мира, скомпилированная на одной ОС, которая не использует никаких специфических или проприетарных системных вызовов и/или библиотек, как правило, не может работать на одной ОС при компиляции для другой ОС*.[
] []ABI не очень важен для программистов как таковых, потому что мы уже инстинктивно знаем, что вы не можете запустить Windows-приложение на Macs. Даже непрограммисты (за исключением голливудских сценаристов) знают это. Это важно для составителей компиляторов, когда им нужно ориентироваться на конкретную среду.[
] []* Примечание: Некоторые ОС, такие как Linux и BSD, поддерживают зарубежный ABI, так что простая программа командной строки Linux иногда может быть выполнена на BSD без изменений. И, конечно же, есть такие слои эмуляции, как вино[
].] Не забывайте, что на языке Си++ реализовано управление именами в ABI[
].]Только если вы хотите, чтобы ваш бинарник запускался в другом окружении без перекомпиляции, то есть некоторые места, которые вам может понадобиться принять во внимание ABI:[
] []вы можете вызвать третью библиотеку в вашей программе, и третья библиотека может отличаться в разных окружениях. (так что только ABI, которому вы можете доверять)[
][]syscall to os. (если вы статически связываете syscall со своим двоичным компоновщиком, а не динамически связываете с libc)[
][]На самом деле, большинству разработчиков не нужно принимать во внимание ABI, только разработчик двоичного загрузчика/инструментария должен знать об этом подробнее.[
].]Системные вызовы также следуют за ABI - интерфейс syscall отличается от операционной системы к операционной системе. [
] []Статически связывая ваше приложение и стандартную библиотеку с ним, вы свяжете его в один syscall ABI. Например, FreeBSD позволяет использовать Linux syscall ABI только через модуль эмуляции. [
]