读书人

C语言中的库函数是什么时候加载到内存

发布时间: 2012-05-01 12:48:58 作者: rapoo

C语言中的库函数是什么时候加载到内存中的?
在C语言中,好像包含了相应的头文件就可以使用相应的库函数,比如#include<stdio.h>之后就可以使用printf跟scanf等函数,但头文件中只包含函数的声明,函数的实现却放在别处,计算机要执行代码,必须要将代码加载到内存当中,比如printf函数执行时一般是一句call printf的汇编语句,那么库函数如printf等是什么时候加载到内存中的呢?编译器怎么知道去那里加载库函数的实现呢?库函数又被加载到内存中的什么位置了呢?希望大神能够解答一下,谢谢

[解决办法]
库函数都是封装在DLL里面的,kernel.dll,user32.dll等.

这些dll在你的程序还没有执行到main函数的时候(甚至在你声明的全局变量初始化之前)就已经加载到地址空间,然后所有依赖的模块都加载成功了之后,执行你写的代码。如果有任意一个模块加载是吧,都会弹出运行库错误:runtime error。

执行函数的地址,你用depends工具看一下就能知道偏移,然后模块基址 + 偏移地址就等于函数当前的地址了,至于模块的基地址,在编译的时候可以指定,但是如果这个地址已经被别的模块用了的话,windows会自动找一个合适的地址加载这个模块。
[解决办法]
linux程序在main函数之前还要做很多事,系统根据可执行文件的类型,读取相应的可执行文件头,然后,从可执行文件头中能得到加载段和动态链接段,系统首先把加载段加载到内存,然后启动动态链接器,由动态连接器完成库文件的加载,最后,动态连接器才调用main函数,main函数返回后程序回到glibc的函数中,然后退出。说了这么多,不知道LZ明白没有

读书人网 >C语言

热点推荐