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

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

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

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

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

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

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

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

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

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

相关·内容

【linux】gcc makefile

用户可以使用“-S”选项来进行查看,该选项只进行编译不进行汇编,生成汇编代码。...动态一般后缀名为“.so”,如前面所述 libc.so.6 就是动态gcc 在编译时默认使用动态。完成了链接之后,gcc 就可以生成可执行文件,如下所示。...优点: 内存和磁盘空间效率:多个程序可以共享内存中同一个单个副本,减少了内存和磁盘使用。 易于更新:更新文件后,所有使用该动态程序都会自动使用更新后版本,无需重新链接。...这种符号链接机制允许系统在保持相同名(libc.so.6)情况下升级到新版本不会打断依赖它应用程序。...通过 libc.so.6 这样符号链接,系统能够方便地管理版本,不影响依赖这些应用程序。

5210
  • Linux中CC++程序编译过程与动静态链接概述

    ) 这里输出表示可执行文件依赖于 libc.so.6 和 ld-linux-x86-64.so.2 等共享。...动态主要特点是可以在运行时被程序加载和使用不是在编译时将代码直接嵌入到可执行文件中。这使得程序可以共享同一个,节省内存并简化更新过程。...动态特点 文件格式:动态文件名通常以 .so(Shared Object)为后缀,例如 libc.so.6。 共享性:多个程序可以共享同一个动态,从而减少内存使用。...静态与动态比较 特点 静态 动态 文件后缀 .a .so 内存使用 高(每个程序都有一份代码) 低(共享代码) 更新方便性 需重新编译所有依赖程序 只需更新文件 运行时依赖 无(不需要文件...libc6-dev 提供了 C 标准头文件和静态。 2.

    4610

    【linux学习指南】Linux编译器 gcc和g++使用

    用户可以使用“-S”选项来进行查看,该选项只进行编译不进行汇编,生成汇编代码。...动态: .so (linux).dll(windows) 静态: .a (linux).lib 最后答案是:系统把这些函数实现都被做到名为 libc.so.6 文件中去了,在没有特别指定时...,gcc 会到系统默认搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接作用 ldd 命令用于显示一个可执行文件或共享所依赖共享列表...libc.so.6: 这是标准 C (glibc)共享,提供了 C 语言基本功能和系统调用接口。...动态一般后缀名为“.so”,如前面所述 libc.so.6 就是动态 gcc 在编译时默认使用动态。完成了链接之后,gcc 就可以生成可执行文件,如下所示。

    16710

    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 命令更新共享缓存列表。

    73240

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

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

    32310

    减小镜像体积-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.4K10

    【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

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

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

    4.8K20

    GCC写个给你玩,就这?

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

    1.1K10

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

    可执行文件有标准 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.4K22

    【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倍 这就是因为静态加到了可执行文件里。

    14810

    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.4K20

    Linux开发工具——gcc

    我们C语言中所使用 printf函数、scanf函数等都是在C语言 libc.so.6 库里面 头文件只是 函数声明。...✈️ 动静态   我们在使用gcc进行编译最后一步链接时,会按照系统默认路径 “user/lib” 下进行查找,也就是生成 .o 文件与文件 libc.so.6 进行链接。   ...动态一般后缀名为 “.so”,如前面所述 libc.so.6 就是动态gcc 在编译时默认使用动态。完成了链接之后,gcc 就可以生成可执行文件。...libstdc++-static#安装C/C++静态文件   使用静态链接来链接目标文件,文件内容会很大,使用ldd命令查看,出现了 “not a dynamic executable”,意思是不是动态可执行程序...3、动态使用需要运行时加载和链接过程,因此执行速度相对较慢。 4、动态可以被多个可执行文件共享,节省了系统资源。

    18410

    共享对象注入

    程序可分三类:静态共享和动态加载 静态,是在执行程序运行前就已经加入到执行码中,在物理上成为执行程序一部分; 共享,是在执行程序启动时被加载到执行程序中,这样可以被多个执行程序共享使用...动态加载,其实并不是一种真正类型,应该是一种使用技术,应用程序可以在运行过程中随时加载和使用。 ?...然后编译成文件: 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共享

    82730

    动态静态

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

    2.3K30

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

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

    1.4K80

    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格式共享上,调试异常。

    70910
    领券