2020-07-11 19:48
⁄ 工业·编程
⁄ 共 614字
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。
限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。
“d...
GCC, glibc阅读全文
2020-01-08 08:22
⁄ 工业·编程
⁄ 共 5407字
任何一个C程序要想要得到实现,都离不开背后的一套庞大的代码来进行支持(至少包括入口函数,以及其所依赖的函数所构成的函数集合等),这样一套背后代码被称为运行库,C语言的运行库叫做CRT(Runtime Library)。
C语言的运行库某种程度上就是C语言的程序和不同操作系统平台之间的抽象层。它将不同的操作系统API抽象成相同的库函数(银弹理论的又一次胜利)。比如可以在不同OS上使用fread来读取文件,而事实上,fread在不同的...
glibc, MSVC, 区别阅读全文
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标准中又新增...
glibc阅读全文
2019-12-27 07:53
⁄ 工业·编程
⁄ 共 152字
看包含的头文件和使用的函数啊~两者包含的函数不一样~
要是使用fopen/memcpy等等这样标准C的函数,当然会在链接时使用到标准C库(ANSI C).如果使用了read/write这些glibc库实现的函数,肯定就在链接时使用到glibc库~
具体使用了什么库,要看调用的函数了~可能不会仅仅只包含一个库~
GCC, glibc阅读全文
2019-12-13 12:39
⁄ 工业·编程
⁄ 共 429字
#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...
glibc阅读全文
2019-12-12 12:35
⁄ 工业·编程
⁄ 共 1230字
__attribute__是用来说明函数的属性,weak和alias分别是两个属性。
(一)强符号和弱符号:
强符号:已经初始化的全局变量和未被weak修饰的函数
弱符号:未初始化的全局变量和被weak修饰的函数
符号链接原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号
那么它们有什么用呢?比如我们想使用某个函数必须用到的函数,但是不知道该函数在其...
GCC, glibc阅读全文
2019-12-11 12:32
⁄ 工业·编程
⁄ 共 2882字
最近查看linux内核代码时,表现了一些编译器选项如__attribute_((weak))、__attribute__( (alias("target"))),一开始不了解,后来自己查看资料及书籍算是对gcc的这个编译属性有了一定的认识。
一、先了解weak属性。
__attribute__((weak))表示为弱符号属性,所谓的弱符号是针对于强符号来说的,我们定义的全局已初始化变量及全局函数等都是属于强符号,在链接时如果有多个强符号就会报错误;而弱符号主要指未初始化...
GCC, glibc阅读全文
2019-12-04 05:14
⁄ 工业·编程
⁄ 共 547字
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阅读全文
2019-12-03 05:09
⁄ 工业·编程
⁄ 共 144字
方法就是把 glibc 以静态库的方式加入到程序里。
0. 建议
尽量在低版本的 OS 里进行编译,减少由于 OS 升级带来的影响。
1. 安装 glibc 的静态库
yum install glibc-static libstdc++-static
2. 修改 Makefile
在 Makefile 里加入编译选项 -static 。
glibc阅读全文
2019-11-20 11:47
⁄ 工业·编程
⁄ 共 471字
之前写代码的时候一直有个疑问,malloc申请内存的时候指定了内存大小,但是free的时候却只指定要释放的内存地址,那么free是如何知道它要释放的内存空间大小呢?
源码之前,了无秘密,下面就从源码来扒一扒。
由上图可知,malloc和free分别调用了malloc_internal和free_internal来实现具体的操作。
在malloc_internal中,最需要注意的一行就是计算需要分配空间的大小,可以看到,计算该空间时还加了一个sizeof(allocation_he...
glibc阅读全文