当前位置: 技术问答>linux和unix
关于动态库的问题
来源: 互联网 发布时间:2015-08-04
本文导语: 有哪位大侠知道如何获得动态库载入内存时的起始地址及大小?? 动态库是保存在堆?栈?or 堆栈之间? | 动态库并不是在分配在堆上,只不过位置在堆的后面: |用户程序|堆|动态库loader|动态库|栈 通常用户...
有哪位大侠知道如何获得动态库载入内存时的起始地址及大小??
动态库是保存在堆?栈?or 堆栈之间?
动态库是保存在堆?栈?or 堆栈之间?
|
动态库并不是在分配在堆上,只不过位置在堆的后面:
|用户程序|堆|动态库loader|动态库|栈
通常用户程序和动态库的起始地址是固定的,但是特定于实现,所以不用拘泥于具体的数值。
在linux中,一个进程的堆被定义为程序数据段开始data_start到data_start+limitation. 这个limitation可以通过“ulimit -d"来设置。当用户通过brk来扩大当前堆的时候,内核会检查这次扩大是否会破坏已经存在的vma,如果是,则会放弃这次操作。这个特性决定了堆最大就是动态库ld的起始-程序数据段的起始。看官不用担心,并不是说动态库以后的大片区域就不能被使用,通常程序会通过malloc来实现内存分配,glibc的malloc实现了几种策略,既可以从堆中获取,也可以通过mmap来映射进程地址空间任何一块区域(当然是栈顶以下,3G以内哈)。LD_PRELOAD不过是允许用户自己实现的库来替代标准的glibc的动态库,有种说法是叫interpolater。至于加载位置由库的加载顺序和loader来决定,随机的
|用户程序|堆|动态库loader|动态库|栈
通常用户程序和动态库的起始地址是固定的,但是特定于实现,所以不用拘泥于具体的数值。
在linux中,一个进程的堆被定义为程序数据段开始data_start到data_start+limitation. 这个limitation可以通过“ulimit -d"来设置。当用户通过brk来扩大当前堆的时候,内核会检查这次扩大是否会破坏已经存在的vma,如果是,则会放弃这次操作。这个特性决定了堆最大就是动态库ld的起始-程序数据段的起始。看官不用担心,并不是说动态库以后的大片区域就不能被使用,通常程序会通过malloc来实现内存分配,glibc的malloc实现了几种策略,既可以从堆中获取,也可以通过mmap来映射进程地址空间任何一块区域(当然是栈顶以下,3G以内哈)。LD_PRELOAD不过是允许用户自己实现的库来替代标准的glibc的动态库,有种说法是叫interpolater。至于加载位置由库的加载顺序和loader来决定,随机的
|
动态库是代码段。。。而且代码是多个程序公用的。
装载进去的起始地址不固定,因此编译动态库的时候要用-fPIC编译成位置无关的代码。
装载进去的起始地址不固定,因此编译动态库的时候要用-fPIC编译成位置无关的代码。
|
|用户程序|堆|动态库loader|动态库|栈?
这个有问题吧。
这个有问题吧。
|
所有的程序都是从0x0848000开始运行,而所用到的动态连接库都是从0x040000000开始加载