2010-01-09 10 views
8

No entiendo por qué ABI es un contexto importante para desarrollar aplicaciones de espacio de usuario. ¿El conjunto de llamadas al sistema para un sistema operativo se considera un ABI? Pero si es así, ¿no están todas las complejidades relacionadas con las llamadas al sistema encapsuladas dentro de las bibliotecas estándar?¿Por qué es importante la Interfaz Binaria de Aplicación para la programación

Entonces, ¿es compatible ABI solo relevante para ejecutar aplicaciones enlazadas estáticamente en diferentes plataformas, ya que las llamadas al sistema se integrarían en el binario?

Respuesta

8

Un ABI define un conjunto de alineación, convención de llamadas y tipos de datos que son comunes a un sistema. Esto hace que un ABI sea tremendamente importante si está haciendo algún tipo de enlace dinámico; como sin él, el código de una aplicación no tiene forma de llamar al código provisto por otro.

Entonces, no. La compatibilidad ABI es relevante para todos los enlaces dinámicos (menos para los estáticos).

Valora enfatizando nuevamente que el ABI de un sistema afecta el trabajo entre aplicaciones así como el trabajo de la aplicación al sistema operativo.

+0

¿Cuáles son algunos ABI bien conocidos que valen la pena conocer? ¿O cuál sería un ejemplo concreto de un ABI? – theactiveactor

+3

El único ABI bien conocido es la 'C' que se define muy estrictamente para cada plataforma. Cada compilador C++ implementa su propio ABI y, por lo tanto, el código objeto de compiladores diferentes generalmente no es compatible. 'C' tiende a ser el código de enlace entre todos los diferentes idiomas que hay en la Web. –

0

Las llamadas al sistema también siguen un ABI: la interfaz syscall difiere del sistema operativo al sistema operativo.

El enlace estático de su aplicación y la biblioteca estándar en él lo vinculará a un syscall ABI. Por ejemplo, FreeBSD permite el uso del Linux syscall ABI solo a través de un módulo de emulación.

6

El ABI es más de lo que las llamadas al sistema están disponibles. También suele describir la manera real en que se transmiten los argumentos a las funciones y cómo se distribuyen las estructuras y los objetos en la memoria. Sin un ABI consistente, el código creado por compiladores diferentes podría no poder llamarse entre sí: si llama a foo (a, b) y un compilador presiona a y b en la pila mientras que otro los pasa en registros, usted tiene un choque de ABI.

1

ABI incompatible es porque aunque OSX, Linux, Solaris, Windows y * BSD se ejecutan en CPU Intel x86, un sencillo programa hola mundo POSIX compilado en un sistema operativo que no utiliza ninguna llamada de sistema específica o propietaria y/o las bibliotecas generalmente no pueden ejecutarse en un SO cuando se compilan para otro SO *.

ABI no es realmente importante para los programadores como tal porque ya sabemos instintivamente que no se puede ejecutar una aplicación de Windows en Mac. Incluso los no programadores (excepto los guionistas de Hollywood) lo saben. Es importante compilar escritores cuando necesitan apuntar a un entorno particular.

* nota: Algunos sistemas operativos como Linux y BSD admiten ABI externo, por lo que a veces se puede ejecutar un sencillo programa de línea de comandos de Linux en BSD sin modificaciones. Y hay, por supuesto, capas de emulación como el vino.

1

No se olvide en C++ el nombre manera mangling se implementa forma parte de la ABI

1

Sólo cuando usted quiere que su binario que se ejecuta en otro entorno sin recompilación, a continuación, hay algunos lugares que usted puede necesitar tomar ABI en cuenta:

  1. puede llamar a una tercera biblioteca en su programa, y ​​la tercera biblioteca puede variar en diferentes entornos. (por lo tanto, solo ABI puede confiar)

  2. syscall to os.(Si la llamada al sistema estático vinculado a su binario en lugar de vincular dinámicamente a libc)

En realidad, la mayoría de desarrolladores no necesita tomar en cuenta ABI, sólo el desarrollador cargadora/herramienta binaria tiene por qué saber más sobre él.

3

"ABI" (ver Wikipedia) es un término general para todas las suposiciones que hace un sistema operativo sobre los formatos de datos. Esto incluye el diseño de los archivos ejecutables y el de cualquier estructura de datos en la memoria dada su definición de C.

El término también cubre generalmente los requisitos de formato entre programas escritos en el mismo idioma. Cada idioma tiene características particulares que pueden dar como resultado diferentes convenciones dentro de formatos ejecutables y estructuras de memoria, pero todas deben generar ejecutables compatibles con el sistema operativo y las estructuras de datos compatibles con el conjunto de instrucciones del procesador.

ABI no importa mucho si solo le preocupa la compilación del código conforme al estándar. Importa un poco cuando violas el estándar y haces cosas poco importantes como lanzar un char * a un long *. Todavía es más importante cuando se escribe un cuerpo grande de código ensamblador. Escribir algo así como un enlazador o un depurador, puede llegar a encarnar la mayor parte del trabajo por hacer.

Cuestiones relacionadas