程序中通常会有大量的函数调用,这些被调用的函数只要有声明(而不需要定义实现),编译器就可以成功处理。在生成可执行文件的过程中,连接器将各个可执行程序的代码段组合到一起,而有函数调用的地方还需要找到真正的函数定义才可以完成连接。因此,函数的定义和调用者可以在一个代码段内,也可以在不同的代码段内。连接器会根据需要根据实际的情况修改编译器生成的机器代码,完成正确的跳转。
函数跳转的连接过程如图:
与函数跳转类似的是全局变量的访问,在C语言编译的过程中,程序可以访问用extern声明的外部全局变量,在连接的过程中,连接器需要找到实际变量在数据段中的位置,完成正确的变量访问。
程序中全局变量的连接如图所示。
对于可执行文件的生成,其主要的工作是组合各个目标文件中的三个段。还将包含一些其他的过程。首先,所有的可执行程序都需要指定一个入口,在C语言中入口即main函数,在一个C语言的应用程序各个源文件中,只能包含一个main函数。其次,不同系统所使用的可执行程序可能包含不同的头信息,头信息是在主要段之外附加的信息,可以供操作系统加载可执行程序的时候使用。
知识点:在连接过程之前,各个源文件生成目标文件相互没有关系。在连接之后,各目标文件函数和变量可以相互调用和访问,从而被联系在一起。
函数跳转的连接过程如图:
与函数跳转类似的是全局变量的访问,在C语言编译的过程中,程序可以访问用extern声明的外部全局变量,在连接的过程中,连接器需要找到实际变量在数据段中的位置,完成正确的变量访问。
程序中全局变量的连接如图所示。
对于可执行文件的生成,其主要的工作是组合各个目标文件中的三个段。还将包含一些其他的过程。首先,所有的可执行程序都需要指定一个入口,在C语言中入口即main函数,在一个C语言的应用程序各个源文件中,只能包含一个main函数。其次,不同系统所使用的可执行程序可能包含不同的头信息,头信息是在主要段之外附加的信息,可以供操作系统加载可执行程序的时候使用。
知识点:在连接过程之前,各个源文件生成目标文件相互没有关系。在连接之后,各目标文件函数和变量可以相互调用和访问,从而被联系在一起。