在Windows和Linux下链接到OS C库是如何工作的?

在Windows和Linux下链接到OS C库是如何工作的?,c,operating-system,linker,C,Operating System,Linker,据我所知,Linux附带了一个c库,它实现了ISO c函数和系统调用函数,并且在开发c时可以链接该库。但是,不同的c编译器不一定会生成可链接的代码(例如,可能会以不同的方式填充函数参数中使用的数据结构)。当我可以使用任何编译器编译我的c语言时,内置的c语言库是如何链接的?静态链接和动态链接的故事有什么不同吗 另一方面,在Windows下,每个编译器都提供自己的标准库,这解决了部分问题,但系统调用仍在一组DLL中。C应用程序如何成功链接到这些DLL?不同的语言怎么样?(相同的DLL可用于.Net

据我所知,Linux附带了一个c库,它实现了ISO c函数和系统调用函数,并且在开发c时可以链接该库。但是,不同的c编译器不一定会生成可链接的代码(例如,可能会以不同的方式填充函数参数中使用的数据结构)。当我可以使用任何编译器编译我的c语言时,内置的c语言库是如何链接的?静态链接和动态链接的故事有什么不同吗

另一方面,在Windows下,每个编译器都提供自己的标准库,这解决了部分问题,但系统调用仍在一组DLL中。C应用程序如何成功链接到这些DLL?不同的语言怎么样?(相同的DLL可用于.Net Visual Basic之前的版本等)

每个平台都有一些“调用约定”,每个C实现都必须遵守这些约定,以便能够正确地与操作系统通信。例如,对于Windows,必须使用
stdcall
约定调用所有基于操作系统的函数,而不是默认的C约定
cdecl


在Linux中,由于标准C库(和内核)是使用GCC编译的,因此任何其他Linux编译器都必须确保其调用约定与GCC使用的约定兼容。

标准。您会注意到,stdlib的东西是在基本值和数组上运行的,而这些东西的标准非常明确地说明了如何进行操作。

编译器确实附带了标准库的实现。只是在Linux下,假设任何编译器都将遵循编译库的GCC版本的相同约定

至于互操作性,它可能比您想象的要容易。已有的调用约定允许编译器生成对函数的有效调用,即使函数不是用同一软件编译的


关于结构和填充,您会注意到大多数框架使用不透明类型,即指向结构的指针。通常,结构的布局甚至对客户端都不可用。因此,它们从不处理实际数据,只处理指向数据的指针,这就清除了填充问题。

一些ANSI C API在结构上运行,这些结构对对齐非常敏感。