现在位置: 首页 > glibc
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。 限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。 “d...
阅读全文
2020-01-08 08:22 工业·编程 ⁄ 共 5407字 暂无评论
任何一个C程序要想要得到实现,都离不开背后的一套庞大的代码来进行支持(至少包括入口函数,以及其所依赖的函数所构成的函数集合等),这样一套背后代码被称为运行库,C语言的运行库叫做CRT(Runtime Library)。 C语言的运行库某种程度上就是C语言的程序和不同操作系统平台之间的抽象层。它将不同的操作系统API抽象成相同的库函数(银弹理论的又一次胜利)。比如可以在不同OS上使用fread来读取文件,而事实上,fread在不同的...
阅读全文
2019-12-28 08:23 工业·编程 ⁄ 共 923字 暂无评论
C标准函数库   (C standard library,缩写:libc)。标准函数库通常会随附在编译器上。windows系统和Linux系统下都可以尽情使用。是最基本的C函数库,也叫ANSI C。   ANSI C共包括15个头文件。1995年,Normative Addendum 1 (NA1)批准了3个头文件(iso646.h、wchar.h和wctype.h)增加到C标准函数库中。C99标准增加了6个头文件(complex.h、fenv.h、inttypes.h、stdbool.h、stdint.h和tgmath.h)。C11标准中又新增...
阅读全文
看包含的头文件和使用的函数啊~两者包含的函数不一样~ 要是使用fopen/memcpy等等这样标准C的函数,当然会在链接时使用到标准C库(ANSI C).如果使用了read/write这些glibc库实现的函数,肯定就在链接时使用到glibc库~ 具体使用了什么库,要看调用的函数了~可能不会仅仅只包含一个库~
阅读全文
#include <stdio.h>   int fun() {         printf("func\n");         return 0; } int f() __attribute__((weak, alias("fun")));   #define weak_alias(name, aliasname) \         typeof(name) aliasname __attribute__((weak, alias(#name)))   weak_alia...
阅读全文
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))表示为弱符号属性,所谓的弱符号是针对于强符号来说的,我们定义的全局已初始化变量及全局函数等都是属于强符号,在链接时如果有多个强符号就会报错误;而弱符号主要指未初始化...
阅读全文
0.首先看看 glibc 的当前版本。 strings /usr/lib/libstdc++.so.6 | grep GLIBC 发现返回结果中低于目标版本。 1.原因是当前系统中 glibc 版本低于 3.4.15。那么需要升级 glibc 2.但是当前系统的 iso 原盘中 glibc 的版本一定是低于目标版本的。那就需要从网络 yum 源上获取新版。 3.添加 yum 的网络源。 4.执行以下指令安装新版 glibc 64位执行 yum install -y glibc 32位执行 yum install -y glibc.i686 5.用第0步查看是否有...
阅读全文
方法就是把 glibc 以静态库的方式加入到程序里。 0. 建议 尽量在低版本的 OS 里进行编译,减少由于 OS 升级带来的影响。 1. 安装 glibc 的静态库 yum install glibc-static libstdc++-static 2. 修改 Makefile 在 Makefile 里加入编译选项 -static 。
阅读全文
2019-11-20 11:47 工业·编程 ⁄ 共 471字 暂无评论
之前写代码的时候一直有个疑问,malloc申请内存的时候指定了内存大小,但是free的时候却只指定要释放的内存地址,那么free是如何知道它要释放的内存空间大小呢? 源码之前,了无秘密,下面就从源码来扒一扒。 由上图可知,malloc和free分别调用了malloc_internal和free_internal来实现具体的操作。 在malloc_internal中,最需要注意的一行就是计算需要分配空间的大小,可以看到,计算该空间时还加了一个sizeof(allocation_he...
阅读全文