首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GCC一直在尝试使用静态libc库,而不是共享的库

GCC(GNU Compiler Collection)是一套开源的编译器集合,用于编译各种编程语言,包括C、C++、Objective-C、Fortran、Ada等。在编译过程中,GCC可以选择使用静态libc库或共享的库。

静态libc库是指将所有的库函数都编译进最终生成的可执行文件中,使得可执行文件独立于系统环境,无需依赖外部的库文件。这样可以确保程序在不同的系统上都能正常运行,但会增加可执行文件的大小。

相比之下,共享的库是指将库函数编译为独立的库文件,程序在运行时通过动态链接的方式调用库函数。这样可以减小可执行文件的大小,但需要依赖系统中已安装的共享库文件。

GCC尝试使用静态libc库的目的是为了提高程序的可移植性和独立性。使用静态libc库可以确保程序在不同的系统上都能正常运行,无需依赖系统中已安装的共享库文件。这对于一些特殊的环境或嵌入式系统来说尤为重要。

然而,使用静态libc库也存在一些缺点。首先,静态库会增加可执行文件的大小,可能导致占用更多的存储空间。其次,由于静态库中的代码无法更新,如果库中存在漏洞或错误,需要重新编译整个程序才能修复。

在云计算领域,使用静态libc库的优势在于提高了程序的可移植性和独立性,使得程序可以在不同的云平台上运行,无需依赖特定的共享库文件。这对于跨云平台部署和迁移应用程序非常有价值。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体的应用场景和需求进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

gcc基本命令_cmake 命令

-pipe :使用管道不是中间文件。 -time :为每个子流程执行计时。 -specs= :使用 内容覆盖内置规范。...-pie :创建一个动态链接、位置无关可执行文件。 -I :指定头文件包含路径。 -L :指定链接包含路径。 -shared :创建共享/动态。 -static :使用静态链接。...gcc -c hello.s -o hello.o 由 hello.o 目标文件链接成可执行文件 hello gcc hello.o -o hello 使用静态 创建一个 foo.c 文件,内容如下...共享(由于动态可以被多个进程共享加载,所以需要使用 -fPIC 选项生成位置无关代码 gcc foo.c -shared -fPIC -o libfoo.so hello.c 代码无需修改,内容仍然如下.../hello Hello, GetIoT Here is a shared library 如果 hello 程序仍然运行失败,请尝试执行 ldconfig 命令更新共享缓存列表。

67240

NAS下搭建使用markdown静态免费、开放知识—Raneto - 熊猫不是猫QAQ

项目简介 一直都有人问我怎么用docker搭建一个方便好用知识,首先项目构建要够简单,不能太复杂,同时知识基本功能要满足,要方便创建、记录和共享知识。...恰好Raneto便是这样项目,它采用markdown语法编辑知识,支持上传.md文件,构建简单,同时没有其他多余功能,能让你专注于构建你知识。...个人觉得比较适合用于纯文档归档或者一些文章公开分享,也很适合用来作为项目的wiki等使用,毕竟简单一目了然就是wiki作用。...首页 项目本身并不能新建文档,只能通过静态上传形式,不过在上传之后可以对文档进行编辑,采用markdown语法。...容器端口不改,本地端口随意了,极空间不能使用3000以下端口号,这一点需要注意。

16210

【Linux】Linux编译器-gccg++使用

用户可以使用“-S”选项来进行查看,该选项只进行编译不进行汇编,生成汇编代码 把C转换成汇编 gcc -S test.i -o test.s S:从现在开始,进行程序翻译,做完编译工作,变成汇编之后...动态一般后缀名为“.so”,如前面所述 libc.so.6 就是动态gcc 在编译时默认使用动态。完成了链接之后,gcc 就可以生成可执行文件。...**这个位置: Linux下默认形成可执行程序,默认使用是动态 /lib64/libc-2.17.so静态 生成静态链接 生成可执行程序后面要加上-static 但是我们仔细看一下体积差距太大了...所以动态又称为共享!!!...所以,以后要下载一个C写程序,我们并不需要下载C标准,这让我们下载效率成本低很多 静态链接拷贝不是.so内部代码,拷贝是系统里必须存在.a结尾静态

2.1K30

GCC写个给你玩,就这?

文件有两种,静态和动态(共享) 「静态(.a)」:程序在编译链接时候把代码链接到可执行文件中。程序运行时候将不再需要静态静态比较占用磁盘空间,而且程序不可以共享静态。...运行时也是比较占内存,因为每个程序都包含了一份静态。 「动态(.so或.sa)」:程序在运行时候才去链接共享代码,多个程序共享使用代码,这样就减少了程序体积。...-l 在程序编译时候,指定使用 -L directory 指定编译时候,搜索路径 生成动态(共享) 动态命名规则: 「Linux : libxxx.so」 「lib : 前缀(...发布程序无需提供静态,移植方便 「缺点」 ◆ 消耗系统资源,浪费内存 ◆ 更新、部署、发布麻烦 动态优缺点 「优点」 ◆ 可以实现进程间资源共享共享) ◆ 更新、部署、发布简单 ◆ 可以控制何时加载动态...「缺点」 ◆ 加载速度比静态慢 ◆ 发布程序时需要提供依赖动态 发送「关键字」获取「Linux安装配置视频」 和「GCC详细使用视频」

1K10

linux动态静态使用_静态使用

gcc/g++编译器默认都是动态链接,若想进行静态链接,可以携带一个-static选项。...动态 动态是程序在运行时候才去链接相应动态代码,多个程序共享使用代码。一个与动态链接可执行文件仅仅包含它用到函数入口地址一个表,不是外部函数所在目标文件整个机器码。...使用 创建源文件main.c,编写下面这段简单程序来尝试使用我们打包好静态。...因为我们使用gcc编译是C语言,gcc就是用来编译C程序,所以gcc编译时候默认就找是C,但此时我们要链接是哪一个编译器是不知道,因此我们还是需要使用-l选项,指明需要链接文件路径下哪一个...这正是共享所要求共享被加载时,在内存位置不是固定

4.7K20

减小镜像体积-docker最佳实践

大纲 当我们刚开始接触Docker,并尝试使用docker build构建镜像时,通常会构建出体积巨大镜像。事实上,我们可以通过一些技巧方法减小镜像大小。...解决方法就是使用JSON语法,使用JSON语法时,Docker会直接执行不是通过shell执行。...使用动态链接往往有以下优点: 节省存储资源,多个程序共享一个; 节省内存,多个程序运行内存调用同一片内存; 维护方便,更新时,无需重新编译程序; 有些人可能会说节省内存不是动态链接所带来优点,而是共享...使用静态链接 我们可以使用静态链接,这取决于我们具体使用构建工具,如果使用gcc,可以通过-static实现静态链接: 1 gcc -o hello hello.c -static 最终构建二进制文件大小...-64.so.2 (0x00007ff8980f7000) 我们可以看程序使用具体哪些以及路径,上面的例子中,唯一有意义libc.so.6,linux-vdso.so.1与虚拟动态共享对象有关

1.3K10

吴章金: 如何创建一个*可执行*共享

可执行文件有标准 C 语言程序执行入口 main,共享则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者区别.../libhello.so hello 也可以当共享使用: $ gcc -m32 -o hello.noc -L./ -lhello $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH.../hello.noc hello 最后还有一点遗憾,怎么样才能“动态”链接,不是手动指定动态链接器呢?我们在程序中主动加入一个 .interp 节区来指定动态链接器吧。...\n"); } 当普通共享使用,默认编译即可,要能够执行的话,实现一下 entry(),编译时打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so...小结 本文详细讲解了如何像 libc.so 和 ld-linux.so 一样,既可以当共享使用,还能直接执行,并且讲述了两种方法。

1.1K20

含大量图文解析及例程 | Linux下ELF文件、链接、加载与(下)

抽象成相同库函数,方便应用程序使用和移植。...静态共享 :有时候需要把一组代码编译成一个,这个在很多项目中都要用到,例如libc就是这样一个,我们在不同程序中都会用到libc库函数(例如printf)。...共享静态区别:在链接libc共享时只是指定了动态链接器和该程序所需要文件,并没有真的做链接,可执行文件调用libc库函数仍然是未定义符号,要在运行时做动态链接。...静态好处:静态中存在很多部分,链接器可以从静态中只取出需要部分来做链接 (比如main.c需要stach.c其中一个函数,stach.c中有4个函数,则打包后,只会链接用到那个函数)。...另一个好处就是使用静态只需写一个文件名,不需要写一长串目标文件名。 5T技术资源大放送!包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。

1.3K21

【Linux】 开始使用 gcc 吧!!!

3.2 编译 编译指令: gcc -S 要编译文件 [选项] [目标文件] 一般我们得到编译文件使用.s后缀 我们来看看是不是可以成功转换为汇编语言: 可以看到刚才近千行代码成为了使用汇编语言文件...3.3 汇编 汇编指令: gcc -c 要汇编文件 [选项] [目标文件] 一般我们得到二进制文件使用.o后缀 我们来看看是不是可以成功转换成二进制文件: 现在使用 vim 打开后是乱码...答案是: 系统把这些函数实现都被做到名为 libc.so.6 文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去...动态一般后缀名为“.so”,如前面所述 libc.so.6 就是动态gcc 在编译时默认使用动态。...完成了链接之后,gcc 就可以生成可执行文件 我们看看使用动态静态区别: 使用静态可执行文件比使用动态文件大了近100倍 这就是因为静态加到了可执行文件里。

10610

共享对象注入

程序可分三类:静态共享和动态加载 静态,是在执行程序运行前就已经加入到执行码中,在物理上成为执行程序一部分; 共享,是在执行程序启动时被加载到执行程序中,这样可以被多个执行程序共享使用...动态加载,其实并不是一种真正类型,应该是一种使用技术,应用程序可以在运行过程中随时加载和使用。 ?...然后编译成文件: gcc libc_puts.c -fPIC -shared -ldl -D_GNU_SOURCE -o libc_puts gcc libc_puts.c -fPIC -shared...-ldl -D_GNU_SOURCE -o libc_puts 参数详解: 我们通过指定-shared和-fPIC编译标志将libc_puts.c编译为共享,并使用-ldl标志针对libdl进行链接...这时候我们使用export命令将LD_PRELOAD环境变量指向新创建libc_puts共享

77630

linux动态静态

1.2、 种类  linux 下有两种:静态共享(动态)。..."hello,world "); } 首先用gcc编绎该文件,在编绎时可以使用任何合法编绎参数,例如-g加入调试代码等: gcc -c hello.c -o hello.o 1、生成静态 生成静态使用...可以看到 ln 命令依赖于 libc 和 ld-linux 1.7、使用nm工具,查看静态和动态中有那些函数名; (T类表示函数是当前中定义,U类表示函数是被调用,...由此可以推断,要正常使用hello,必须有其它支持,使用ldd工具查看hello依赖于哪些: ldd libhello.so libc.so.6=>/lib/libc.so.6(0x400la000...2、如果f是一个静态(.a),那么链接器将尝试匹配U中未解析符号与静态成员(静态成员就是.o文件)定义符号。

12.3K20

动态静态

程序运行时候将不再需要静态。 动态(.so):程序在运行时候才去链接动态代码,多个程序共享使用代码。...一个与动态链接可执行文件仅仅包含它用到函数入口地址一个表,不是外部函数所在目标文件整个机器码。...站在使用角度:使用第三方静态 指令:gcc main.c -L....形成一个可执行程序,可能不仅仅只依赖一个gcc默认是动态链接,但是当提供静态时,并不能说gcc不会使用静态,事实证明,不管是动态还是静态,都可以使用。...此时,因为我们要访问printf所在地址空间中,已经有了偏移量,然后可以去访问共享区,找到动态起始地址,然后拿着这个起始地址+偏移量,在共享libc.so这个库里面找到这个函数,然后调用,调用完之后返回代码区继续往后执行

2.2K30

【Linux系统编程】Linux下编译器——gccg++使用 及 动态静态认识

最后答案是: 系统把这些函数实现都被做到名为 libc.so.6 文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去...当我们谈论(Library)时,可以将其比作图书馆,静态和动态则是两种不同图书存放方式。 想象一下,你是一名学生,图书馆中有很多有用书籍,供你在学习过程中参考使用。...当你需要使用这些书籍时,你可以从书架上取出,使用完毕后放回书架上供其他人使用。这意味着多个程序可以共享同一个动态,减少了存储空间占用。...在编程中,动态是在运行时由操作系统加载文件,程序在运行时需要由链接器引入动态,才能使用其中函数或资源。可执行文件中只包含对库函数引用或者说地址,不复制代码和数据(动态链接)。...总结起来: 静态代码复制到可执行文件中,使得程序独立运行;动态共享在操作系统中,减少了内存占用和可执行文件大小。静态适合小型独立程序,动态适合大型程序或多个程序共享使用

48210

高级语言编译:链接及装载过程介绍

不会选择开发效率低,运行效率高 C/C++ 作为开发语言。...对于某一个动态链接来说,所有使用这个可执行文件都共享同一块物理地址空间,这个物理地址空间在当前动态链接第一次被链接时 load 到内存中。...前面我们一直在讨论动态链接(so),其实在各个平台下面都有静态链接静态链接链接行为跟目标文件非常类似,但是由于静态有一些问题,比如因为每个可执行文件都有静态一个版本,这导致升级时候很麻烦等问题...这个函数是在libc中实现,也就是linux中所有的可执行程序都共享同一段初始化代码,篇幅原因我们不去查看__libc_start_main实现了。...如果有依赖动态链接,会调用动态链接器进行库文件地址映射,动态链接内存空间是被多个进程共享

1.3K80

Binary程序分析查看类命令

gcc | Gnu C Compiler | 作为一个软件被你调用来编译C程序时候 g++ | Gnu c++ compiler | 其实g++只是调用gcc,然后连接c++,并且作相应一些编译设置而已...const int i_data=1; return 1; } WeiyiGeek.案例演示 0x01 应用依赖查看 ldd 命令 描述:用于打印程序或者文件所依赖共享列表。...值得注意是ldd不是一个可执行程序只是一个shell脚本: cat whereis ldd | cut -f 2 -d ' ',ldd显示可执行模块dependency(所属)工作原理,其实质是通过....6 #3.当应用报错时候可以采用ldd来查看缺少so链接(比如下图) #解决程式因缺少某个文件不能运行一些问题 ln -s /usr/lib/i386-linux-gnu/libpangoxft...如果命令行中给定名字包含/,这个程式libc5版本将使用他作为名字;否则他将在标准位置搜索; 注意ldd不能工作在a.out格式共享上,调试异常。

67010

Linux下动态(.so)和静态(.a) 区别

静态和动态最大区别,静态情况下,把直接加载到程序中,动态链接时候,它只是保留接口,将动态与程序代码独立,这样就可以提高代码可复用度,和降低程序耦合度。...相当于一个可执行文件 -fPIC:表示编译为位置独立代码,不用此选项的话编译后代码是位置相关所以动态载入时是通过代码拷贝方式来满足不同进程需要,不能达到真正代码段共享目的。 -L....总结: 编译静态时先使用-c选项,再利用ar工具产生.编译动态方式依不同版本UNXI而定。隐式调用动态静态用法相一致,而显示调用动态则需要借助动态加载共享库函数族。...隐式调用动态静态使用方法一致,使用静态使用动态编译成目标程序使用gcc命令完全一样,那当静态和动态同名时,gcc命令会使用哪个文件呢?...通过测试可以发现,当静态和动态同名时, gcc命令将优先使用动态.为了确保使用静态, 编译时可以加上 -static  选项,因此多第三方程序为了确保在没有相应动态时运行正常,喜欢在编译最后应用程序时加入

16.5K21

两个奇技淫巧,将 Docker 镜像体积减小 99%

如果 Dockerfile 内容不是很复杂,构建阶段也不是很多,可以直接使用序号表示构建阶段。...使用动态链接好处显而易见: 节省磁盘空间,不同程序可以共享常见。 节省内存,共享只需从磁盘中加载到内存一次,然后在不同程序之间共享。...使用 scratch 作为基础镜像肯定是不行使用 busybox 和 alpine 也不行,因为 busybox 不包含标准 alpine 使用标准是 musl libc,与大家常用标准...1、使用静态 我们可以让编译器使用静态编译程序,办法有很多,如果使用 gcc 作为编译器,只需加上一个参数 -static: $ gcc -o hello hello.c -static 编译完可执行文件大小为...使用 alpine 镜像和动态:5.6 MB 使用 scratch 镜像和静态 glibc:940 kB 使用 scratch 镜像和静态 musl libc:94 kB 最终我们将镜像体积减少了

1.2K11

含大量图文解析及例程 | Linux下ELF文件、链接、加载与(中)

动态链接 什么是动态链接以及为什么需要动态链接 实际上,链接程序在链接时一般是优先链接动态,除非我们显式地使用-static参数指定链接静态,像这样: gcc -static hello.c 静态链接和动态链接可执行文件大小差距还是很显著...libc.so中有300K 条指令,2 MiB 大小,每个程序如果都静态链接,浪费空间很大,最好是整个系统里只有一个 libc 副本,每个用到 libc 程序在运行时都可以用到 libc代码...而且这只是链接了libc标准,在大型项目中,我们要链接各种各样第三方静态链接会把全部在链接时就链接到同一个可执行文件,那么其大小是很难接受。 动态出现正是为了弥补静态弊端。...如果程序不是动态链接的话,1000 * 128MB内存占用足以撑爆大多数个人电脑内存。如果程序确实是动态链接,即内存中只有一份代码,那么只会有很小内存占用。...动态链接器本身也是.so文件,但是它比较特殊,它是静态链接。本身不依赖任何其他共享对象也不能使用全局和静态变量。这是合理,试想,如果动态链接器都是动态链接的话,那么由谁来完成它动态链接呢?

2.2K20
领券