动态库静态库
文章平均质量分 75
lp525110627
这个作者很懒,什么都没留下…
展开
-
程序的内存分配
一、程序内存分配栈:用于维护函数调用的上下文;堆:容纳应用程序动态分配的内存区域。如下图Linux进程地址空间分布Linux下有一个动态链接库映射区用于动态链接库的加载映射,Linux下从0X40000000地址开始分配此区域的空间。原创 2016-11-20 15:27:28 · 257 阅读 · 0 评论 -
动态链接
一、静态链接缺陷静态链接需要把数据和代码都连接到自己的可执行文件中,运行时系统中有时会存在多个库文件副本从而容易造成内存和磁盘的空间浪费、其次静态链接模块更新困难。为了解决这两个问题需要把程序的模块分隔开,生成相互独立的文件从而不在将他们链接在一起。对目标文件的链接等到运行时在进行,这就是动态链接。二、动态链接的基本实现Linux下的动态链接文件为.so,Windows下动原创 2016-11-27 14:29:56 · 476 阅读 · 0 评论 -
动态库使用的几个注意点
一、“--export-dynamic”参数的使用GCC编译可执行文件时可以使用-Wl,--export-dynamic参数,此时链接器产生可执行文件时会将所有全局符号导出到动态符号表。gcc -Wl,--export-dynamic -o p1 p1.c -L. -l0如果在创建动态链接的可执行文件不加-Wl,--export-dynamic选项,则它所export的动态符号仅仅包括在链接时动态...原创 2016-11-13 13:35:18 · 4161 阅读 · 0 评论 -
windows下的动态库
一、导入导出符号ELF中默认导出所有的全局符号,Windows中需要使用“__deslcpec(dllexport)”修饰某个函数或者变量表示导出该函数或者变量,“__deslcpec(dllimport)”表示导入该函数或者变量。也可以使用.def文件来声明导入导出符号。二、运行时链接Windows同样支持运行时链接,提供了3个API函数:LoadLibrary(LoadLiraryEx)加载D...原创 2016-11-13 14:57:35 · 398 阅读 · 0 评论 -
静态链接
一、在Linux下一个程序的编译过程可分为:预编译、编译、汇编、链接。1、预编译gcc -E hello.c -o hello.i预编译过程注意处理那些源代码文件中的以#开始的预编译指令。比如“#include”“#define”“#ifdef”等。删除注释,添加行号。2、编译编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。gcc -S hel...原创 2016-11-27 14:27:37 · 363 阅读 · 0 评论 -
装载和动态链接
一、进程虚拟地址空间1、程序是一个静态的概念,他是一些预编译好的指令数据集合的一个文件。进程是一个动态的概念是一个程序运行时的过程。每个进程都有自己独立的虚拟地址空间,虚拟地址空间的大小有硬件平台决定,具体说是CPU位数决定的,32位的平台具体大小是0-4G。从程序员的角度来讲可以通过判断指针所占用的空间来判断虚拟地址空间,C语言指针大小的位数与虚拟地址空间的位数相同。2、装载程序运行时所需要...原创 2016-11-27 14:28:56 · 598 阅读 · 0 评论 -
Linux应用程序地址布局
全局初始化变量:数据段全局未初始化变量:数据段(BSS)全局的、静态的(static)、初始化的变量:数据段全局的、静态的、未初始化变量:数据段全局的常量(const):代码段 局部初始化的变量:栈局部未初始化变量:栈局部的、静态的、初始化变量:数据段局部的、静态的、未初始化变量:数据段局部常量:栈 通转载 2018-03-26 20:47:23 · 222 阅读 · 0 评论