深入理解计算机系统:C语言文件的链接原理

本文深入探讨了C语言文件如何从源代码变为可执行文件,涉及预处理、编译、汇编和链接等步骤。讲解了链接过程中可能出现的问题、静态链接库与动态链接库的差异,以及程序加载、执行和退出的原理。同时,文章还阐述了全局变量、静态与extern关键字的作用,并讨论了函数重载和动态链接库在性能优化中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这篇blog里,你将了解到以下的内容:
1. 一个.c文件是怎么变成一个可执行文件,中间会产生那几种文件,在执行的时候又是怎么被加载进操作系统的?
2. 在形成这些不同文件的过程中,即链接的过程中,容易诱发那几种问题,诱发这些问题的原因是什么,如何避免这些问题?
3. 链接分成那几种形式?静态链接库与动态链接库是什么,如何构成静态链接库和动态链接库,静态链接库和动态链接库的利弊?

好的,接下来让我们一起开始一起解决这些问题:
问题1:
请大家先.c文件编译,链接,加载,运行的大概框图:
这里写图片描述
这幅图展示的是一个main2.c的.c文件和vector.h的头文件编译运行的过程,该图表示是动态链接库的链接过程。首先是,一个main2.c和vector.h一起通过编译得到可重定位目标文件main2.o。虽然这个编译和链接的过程只用了一条命令:

gcc main2.c vector.h -o main2.o

但是却包含着编译的三个阶段:
1.利用c语言预处理程序cpp将main2.c翻译成ASCII码文件main2.i。
2.利用cc1(c语言编译器)将main2,i编译成main2.s汇编程序。
3.运行assemble汇编器,将main2.s编译成main2.o可定位目标文件。
再通过动态链接器(这部分动态链接的内容将在后面说明),链接进libc.so,libvector.so文件(重定位和符号表),最后得到p2这个可执行文件,再通过

./p

这个命令进行执行,在执行的过程中动态链接库会把相关的代码和数据链接进去。
至于,很关键的一点程序是如何被加载进去的,这里先放出加载时候的linux存储器映像:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值