2010-01-19 19 views
6

Entiendo que Linux se envía con la biblioteca ac, que implementa las funciones ISO C y las funciones de llamada al sistema, y ​​que esta biblioteca está vinculada contra el desarrollo de C. Sin embargo, diferentes compiladores c no necesariamente producen código enlazable (ej. pad las estructuras de datos utilizadas en argumentos de funciones de forma diferente a otra). ¿Cómo se puede vincular la biblioteca c incorporada cuando podría usar cualquier compilador para compilar mi C? ¿La historia es diferente para los enlaces estáticos y dinámicos?¿Cómo funciona el enlace a las bibliotecas de SO C en Windows y Linux?

En Windows, por otro lado, cada compilador proporciona su propia biblioteca estándar, que resuelve parte del problema, pero las llamadas al sistema todavía están en un único conjunto de DLL. ¿Cómo se vinculan las aplicaciones C a estos archivos DLL con éxito? ¿Qué hay de los diferentes idiomas? (Las mismas DLL pueden ser utilizadas por pre.Net Visual Basic, etc.)

Respuesta

4

Cada plataforma tiene algunas "convenciones de llamadas" que cada implementación C debe cumplir para poder hablar con el sistema operativo correctamente. Para Windows, por ejemplo, todas las funciones basadas en sistema operativo deben llamarse usando la convención stdcall, a diferencia de la convención C predeterminada de cdecl.

En Linux, dado que la biblioteca estándar C (y kernel) se compila utilizando GCC, cualquier otro compilador para Linux debe asegurarse de que sus convenciones de llamada sean compatibles con la utilizada por GCC.

0

Normas. Notará que las cosas stdlib operan en matrices y valores primitivos, y el estándar para eso es bastante explícito sobre cómo se deben hacer las cosas.

+1

Algunas API ANSI C operan en estructuras, que son sensibles a la alineación. –

3

Los compiladores vienen con sus implementaciones de la biblioteca estándar. Es solo que en Linux se supone que cualquier compilador seguirá las mismas convenciones que la versión de GCC que compiló la biblioteca.

A partir de la interoperabilidad, puede ser más fácil de lo que piensas. Existen convenciones de llamadas establecidas que permitirán a los compiladores producir una llamada válida a una función, incluso si la función no se compiló con el mismo software.

Al igual que las estructuras y el relleno, observará que la mayoría de los marcos funcionan con tipos opacos, es decir, indicadores de estructuras. A menudo, el diseño de la estructura ni siquiera está disponible para los clientes. Como tal, nunca funcionan con los datos reales, solo apuntan a los datos, lo que despeja el problema del relleno.

Cuestiones relacionadas