现在位置: 首页 > GCC
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。 限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。 “d...
阅读全文
看包含的头文件和使用的函数啊~两者包含的函数不一样~ 要是使用fopen/memcpy等等这样标准C的函数,当然会在链接时使用到标准C库(ANSI C).如果使用了read/write这些glibc库实现的函数,肯定就在链接时使用到glibc库~ 具体使用了什么库,要看调用的函数了~可能不会仅仅只包含一个库~
阅读全文
2019-12-12 12:35 工业·编程 ⁄ 共 1230字 暂无评论
__attribute__是用来说明函数的属性,weak和alias分别是两个属性。 (一)强符号和弱符号:    强符号:已经初始化的全局变量和未被weak修饰的函数    弱符号:未初始化的全局变量和被weak修饰的函数 符号链接原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号 那么它们有什么用呢?比如我们想使用某个函数必须用到的函数,但是不知道该函数在其...
阅读全文
2019-12-11 12:32 工业·编程 ⁄ 共 2882字 暂无评论
最近查看linux内核代码时,表现了一些编译器选项如__attribute_((weak))、__attribute__( (alias("target"))),一开始不了解,后来自己查看资料及书籍算是对gcc的这个编译属性有了一定的认识。 一、先了解weak属性。 __attribute__((weak))表示为弱符号属性,所谓的弱符号是针对于强符号来说的,我们定义的全局已初始化变量及全局函数等都是属于强符号,在链接时如果有多个强符号就会报错误;而弱符号主要指未初始化...
阅读全文
2019-11-18 10:02 工业·编程 ⁄ 共 11377字 暂无评论
本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。 平台:x86_64-redhat-linux gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 1. 问题提出 最近在我们的项目当中,出现了两次与使用string相关的问题。  1.1 问题1:新代码引入的Bug 前一段时间有一个老项目来一个新需求,我们新增了一些代码逻辑来处理这个新需求。测试阶段没有问题,但上线之后,偶...
阅读全文
2019-11-06 21:12 工业·编程 ⁄ 共 738字 暂无评论
  The __KERNEL__ macro is defined because there is programs (like libraries) than include kernel code and there is many things that you don't want them to include. So most modules will want the__KERNEL__ macro to be enabled. When you compile your kernel, __KERNEL__ is defined on the command line. User-space programs need access to the kernel headers, but some of the info in kernel headers ...
阅读全文
在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢? 这两个宏在内核中的定义如下: # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) 可见这里使用了gcc的内建函数__builtin_expect()。 __builtin_expect (long exp, long c)函数: 该函数用来引导gcc进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下...
阅读全文
2019-10-26 20:52 工业·编程 ⁄ 共 1541字 暂无评论
    在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字,来获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。 container_of()宏定义实现如下所示 /** * container_of - cast a member of a structure out to the containing structure * * ...
阅读全文
本文讲解typeof( ((type *)0)->member )的含义,并在此基础上学习offset_of()的用法。 typeof( ((type *)0)->member ) ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针. 如果利用这个NULL指针来访问type的成员当然是非法的,但typeof( ((type *)0)->member )是想取该成员的类型(有关typeof()的用法可参考这里),所以编译器...
阅读全文
2019-10-24 20:34 工业·编程 ⁄ 共 1571字 评论 2 条
typeof() 是GCC提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。 本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。 typeof()关键字常见用法 1、不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量 #include <stdio.h> #include <stdlib.h> #include <string.h> struct apple{     int weight;   ...
阅读全文