GCC/Clang/LLVM
fengbingchun
这个作者很懒,什么都没留下…
展开
-
程序员的自我修养--链接、装载与库笔记:总结
《程序员的自我修养----链接、装载与库》这本书是2009年出版的,书中有些内容的介绍可能已经过时,已不再适用于现在的C/C++开发,而且书中展示的结果均是在32位机上进行的操作,这里全部是在64位进行的操作。这里是基于之前所有笔记的简单总结,笔记列表如下:编译和链接:https://blog.csdn.net/fengbingchun/article/details/88699951...原创 2019-10-06 14:58:38 · 5823 阅读 · 0 评论 -
程序员的自我修养--链接、装载与库笔记:Linux共享库的组织
共享库(Shared Library)概念:其实从文件结构上来讲,共享库和共享对象没什么区别,Linux下的共享库就是普通的ELF共享对象。由于共享对象可以被各个程序之间共享,所以它也就成为了库的很好的存在形式,很多库的开发者都以共享对象的形式让程序来使用,久而久之,共享对象和共享库这两个概念已经很模糊了,所以广义上我们可以将它们看作是同一个概念。1. 共享库版本共享库兼容性:共享库的开发...原创 2019-09-28 13:30:34 · 982 阅读 · 0 评论 -
程序员的自我修养--链接、装载与库笔记:动态链接
1. 为什么要动态链接静态链接诸多缺点,比如浪费内存和磁盘空间、模块更新困难等。内存和磁盘空间:静态链接的方式对于计算机内存和磁盘的空间浪费非常严重,特别是在多进程操作系统情况下。程序开发和发布:空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。一旦程序中有任何模块更新,整个程序就要重新链接、发布给用户。如果程序都使用静态链接,那么通过网络来更...原创 2019-09-21 21:51:56 · 2900 阅读 · 0 评论 -
程序员的自我修养--链接、装载与库笔记:静态链接
1. 空间与地址分配对于链接器来说,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件。测试代码a.c和b.c内容如下:// a.cextern int shared;int main(){ int a = 100; swap(&a, &shared);}// b.cint shared = 1;void swap(int* a, ...原创 2019-04-14 16:59:20 · 3089 阅读 · 0 评论 -
程序员的自我修养--链接、装载与库笔记:目标文件里有什么
编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。可执行文件格式涵盖了程序的编译、链接、装载和执行的各个方面。1. 目标文件的格式现在PC平台流行的可执行文件格式(Executable)主要是Windo...原创 2019-03-31 18:25:46 · 1364 阅读 · 0 评论 -
程序员的自我修养--链接、装载与库笔记:编译和链接
集成开发环境(IDE),如Visual Studio,一般都将编译和链接的过程一步完成,通常将这种编译和链接合并到一起的过程称为构建(Build)。1. 被隐藏了的过程以下是测试代码hello.c:#include <stdio.h>int main(){ printf("Hello World\n"); return 0;}在Linux下执行以下命令:将...原创 2019-03-20 21:30:43 · 6793 阅读 · 0 评论 -
GCC中通过--wrap选项使用包装函数
在使用GCC编译器时,如果不想工程使用系统的库函数,例如在自己的工程中可以根据选项来控制是否使用系统中提供的malloc/free, new/delete函数,可以有两种方法:(1). 使用LD_PRELOAD环境变量:可以设置共享库的路径,并且该库将在任何其它库之前加载,即这个动态库中符号优先级是最高的。(2). 使用GCC的--wrap选项:对symbol使用包装函数(wrapper ...原创 2018-10-05 22:35:01 · 15871 阅读 · 0 评论 -
GCC编译选项参数介绍
gcc和g++分别是gnu的c和c++编译器,下面是整理的常用编译选项参数:#(1). -x: 设定文件所使用的语言,使文件后缀名无效,如下,执行完后生成test.ogcc -c -x c++ test.jpg#(2). -c: 只编译生成目标文件即*.o,只编译不链接生成可执行文件,如下,执行完后生成test.ogcc -c test.cpp#(3). -S: 把文件编译...原创 2018-07-08 17:30:36 · 9659 阅读 · 0 评论 -
C语言中的弱符号与强符号介绍
弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引:程序标头中记载了运行时所需的段,而段首地址表记载了二进制文件中段的首地址。)文件的过程中使用的一种特殊属性符号。默认情况下,如果没有特别声明...原创 2018-06-30 21:52:58 · 3913 阅读 · 0 评论 -
LLVM简介
LLVM命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,但是现在,LLVM所代表的基本和虚拟机没有关系了,也不在作为一个缩写使用了,而是直接作为一个名字使用。LLVM开始于2000年,是由C++实现的开源软件,它的license是”UIUC” BSD-Style。LLVM核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用,能够进...原创 2018-06-16 21:01:04 · 3658 阅读 · 0 评论 -
编译器GCC与Clang的异同
编译器GCC与Clang的异同原创 2018-02-04 13:24:19 · 75509 阅读 · 0 评论 -
Linux下__attribute__((visibility ("default")))的使用
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。...原创 2017-12-26 09:05:45 · 48527 阅读 · 10 评论 -
Ubuntu14.04 LTS中升级gcc/g++版本到4.9.4的操作步骤
Ubuntu14.04 LTS中默认的gcc/g++版本为4.8.4,如下图,在C++11中增加了对正则表达式的支持,但是好像到gcc/g++ 4.9.2版本才会对正则表达式能很好的支持,这里介绍下Ubuntu14.04 LTS升级gcc/g++版本到4.9.4的操作步骤:1. 依次执行以下命令: $ sudo add-apt-repository ppa:ubuntu-too...原创 2017-03-12 11:56:44 · 8597 阅读 · 3 评论 -
Ubuntu下makefile及gcc生成静态库动态库的简单使用举例
环境:Ubuntu-13.10 32位(虚拟机)、gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件; include文件夹用于存放头文件;bin文件夹用于存放生成的动态库.so文件;lib文件夹用于存放生成的静态库.a文件;project_makefile文件夹存放此工程的ma...原创 2014-01-08 10:45:15 · 11393 阅读 · 10 评论