编译链接
xiaofei0859
这个作者很懒,什么都没留下…
展开
-
Linux动态共享对象(动态链接库)装载过程
之前开发项目时,曾遇到一个问题:模块中用到的某so文件与模块某源码文件中存在同名函数(在链接器linker来看,是同名符号)时,so文件中同名函数被“覆盖”,从而导致模块启动时崩溃。当时曾专门做过实验,得到了避免出问题的一些小技巧(参见之前的某篇笔记 ),但其实对引发问题的底层原因并特别不清楚(当时由于这类问题对应的术语及其英文关键词一无所知,导致google不出干货)。最近,阅读《 程序员的自我转载 2016-01-26 16:46:18 · 2841 阅读 · 0 评论 -
局部静态变量是如何做到只初始化一次的?
局部静态变量是如何做到只初始化一次的?关于编译选项 -Wa,-adlhn参考http://blog.csdn.net/lanxinju/article/details/5900986 以下内容来自于内网别的高人的回复可以写个程序测试一下: 12345678910转载 2017-07-20 11:31:00 · 2325 阅读 · 0 评论 -
linux下动态链接实现原理
符号重定位讲动态链接之前,得先说说符号重定位。c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation unit), 源文件先是被编译成一个个目标文件, 再由链接器把这些目标文件组合成一个可执行文件或库,链接的过程,其核心工作是解决模块间各种符号(变量,函数)相互引用的问题,对符号的引用本质是对其在内存中具体地址的引用,因此确转载 2016-01-25 17:23:33 · 2007 阅读 · 0 评论 -
链接和装入技术的发展史
一个程序要想装入内存运行必然要先经过编译、链接和装入这三个阶段,虽然是这样一个大家听起来耳熟能详的概念,在操作系统发展的过程中却已经经历了多次重大变革。简单来讲,可以将其划分为以下三个阶段:1. 静态链接、静态装入这种方法最早被采用,其特点是简单,不需要操作系统提供任何额外的支持。像C这样的编程语言从很早开始就已经支持分别编译了,程序的不同模块可以并行开发,然后独立编译为相应的目标转载 2016-01-25 16:41:50 · 765 阅读 · 1 评论 -
C语言编译执行过程详解
认识C编译执行过程,是C学习的开端。简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标机器上运行的代码。连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。执行----->在特定的机器环境下运行C程序。 如果用一个图转载 2016-01-21 17:43:38 · 9700 阅读 · 0 评论 -
链接器和装入器的基本工作原理
链接器和装入器的基本工作原理一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义的函数名和变量名,而不用明确指明printf和errno在标准C库中的地址。当然,为了将程序员从早期直接使用地址编程的梦魇中解救出来,编译器和汇编器在这当中做出了革命性的贡献。编译器和汇编器的出转载 2016-01-22 18:02:28 · 1584 阅读 · 0 评论 -
GOT表,PLT表,代码段重定位,数据段重定位--Linux动态连接原理
Linux动态连接原理注意:以下所用的连接器是指,ld,而加载器是指ld-linux.so;1 GOT表;GOT(Global Offset Table)表中每一项都是本运行模块要引用的一个全局变量或函数的地址。可以用GOT表来间接引用全局变量、函数,也可以把GOT表的首地址作为一个基 准,用相对于该基准的偏移量来引用静态变量、静态函数。由于加载器转载 2016-04-11 15:12:04 · 1972 阅读 · 0 评论 -
ELF文件的加载和动态链接过程
本文的目的:大家对于Hello World程序应该非常熟悉,随便使用哪一种语言,即使还不熟悉的语言,写出一个Hello World程序应该毫不费力,但是如果让大家详细的说明这个程序加载和链接的过程,以及后续的符号动态解析过程,可能还会有点困难。本文就是以一个最基本的C语言版本Hello World程序为基础,了解Linux下ELF文件的格式,分析并验证ELF文件和加载和动态链接的具有实现。转载 2016-04-11 14:52:53 · 3737 阅读 · 0 评论 -
makefile中关于all和.PHONY
请编写一个makefile同时编译、链接下面两个程序:main1.c:#includeint main(void){ printf("main1\n");}main2.c:#includeint main(void){ printf("main2\n");}【分析】:这里需要生成两个可执行文件main1和main2(两个目标)。由于m转载 2016-04-06 16:08:58 · 1775 阅读 · 0 评论 -
gcc编译参数-fPIC的一些问题
ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固转载 2016-04-06 14:41:27 · 400 阅读 · 0 评论 -
Linux中ELF格式文件介绍
ELF(Executable and Linkable Format)即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。 通过本文,可以大致了解Linux系转载 2016-01-26 18:05:59 · 539 阅读 · 0 评论 -
Linux 动态库剖析
进程与 API动态链接的共享库是 GNU/Linux® 的一个重要方面。该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用。本文研究了创建和使用静态库的过程,详细描述了开发它们的各种工具,并揭秘了这些库的工作方式。库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模转载 2016-01-26 17:36:53 · 447 阅读 · 0 评论 -
C/C++中全局变量,静态局部变量,局部变量的初始化问题
转载: http://www.cnblogs.com/catch/p/4314256.html什么时候初始化根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两转载 2017-07-20 11:36:48 · 12046 阅读 · 0 评论