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

Linux下的gcc是怎么知道libc.so.6里面有printf函数的?

在Linux下,gcc是一个编译器,它用于将源代码编译成可执行文件。当编译源代码时,gcc需要知道所使用的函数的定义和声明,以便正确地生成可执行文件。

在Linux系统中,libc.so.6是C标准库的动态链接库文件,它包含了许多标准C函数的实现,包括printf函数。gcc通过链接这个动态链接库来获取所需的函数定义和声明。

具体来说,gcc在编译过程中会使用到预处理、编译、汇编和链接等多个阶段。在预处理阶段,gcc会根据源代码中的#include指令,查找并包含所需的头文件,其中包括stdio.h头文件,该头文件中包含了printf函数的声明。

在编译阶段,gcc会将源代码编译成汇编代码,此时并不需要libc.so.6中的函数定义。

在汇编阶段,gcc将汇编代码转换成机器码,仍然不需要libc.so.6中的函数定义。

最后,在链接阶段,gcc会将编译生成的目标文件与所需的库文件进行链接,其中包括libc.so.6。在链接过程中,gcc会根据函数的引用和定义进行符号解析,找到printf函数的实现。

总结起来,gcc在编译过程中并不直接知道libc.so.6里面有printf函数,而是通过预处理、链接等过程来获取所需函数的定义和声明,最终生成可执行文件。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云函数计算(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云视频处理(VOD):https://cloud.tencent.com/product/vod
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

每天都在用printf,你知道变长参数怎么实现

前言 变长参数,指的是函数参数数量可变,或者说函数接受参数数量可以不固定。实际上,我们最开始学C语言时候,就用到了这样函数:printf,它接受任意数量参数,向终端格式化输出字符串。...本文就来探究一,变长参数函数实现机制怎样,以及我们自己如何实现一个变长参数函数。在此之前,我们先来了解一参数入栈顺序怎样。...函数参数入栈顺序 我们可能知道,参数入栈顺序从右至左,是不是这样呢?我们可以通过一个小程序验证一。...我们知道,栈从高地址向低地址增长,从地址值可以推测h最先入栈,a最后入栈。也就是说,参数从右往左入栈(注:并非所有语言都是如此)。 但是如果将函数test参数b改为char 型呢?...也就是说,即便传入参数多个,只要我们知道每个参数类型,只需通过第一个参数就能够通过地址偏移正确访问到其他参数。

3.9K20

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

这篇文章我们继续学习Linux开发工具,今天要学Linux编译器——gcc/g++ 1....gcc 和 g++ 选项基本上都是一样,我们这里就重点以gcc为例来进行讲解。 2. gcc 使用 通过上面的了解我们知道gcc 和 g++ 其实就是Linux系统上编译器。...那其实我们可以看一我们当前Linux系统上都提供了那些库: ls /usr/include 在这个路径 我们看到里面有些头文件其实是我们比较熟悉。...在这里涉及到一个重要概念——库(函数库) 我们C程序中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明,而没有定义函数实现,那么,在哪里实“printf...最后答案: 系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去

1.3K10
  • Linux】动静态库以及动静态链接

    举一个简单例子,一个简单hello word打印,包含了头文件并且用到了printf函数,那么Linux真的默认携带这些头文件了嘛?...答案肯定,我们可以在 /usr/include路径找到Linux默认携带这些 头文件,但是我们打开stdio头文件后,发现里面 仅仅只是printf函数声明,并没有具体定义,那么函数定义都放在哪里了呢...我们可以通过ldd 可执行程序 命令,来查看该程序所用到具体信息 也就是说:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到 系统默认搜索路径...“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去,这样就能实现函 数“printf”了,而这也就是链接作用。...动静态库与动静态链接 在Linux共分为两种库,一种动态库,另一种为静态库。其实我们可以通过后缀就可以区分该库是否为动态库。

    4.8K50

    LinuxLinux编译器-gccg++使用

    C标准库别人已经给我们准备好,直接使用,我们所有使用库中函数代码(比如printf)其中我们自己只写了该函数调用,没有对应实现,只有当链接时候,对应实现,才和我们代码关联起来 链接本质...:无非就是我们调用库函数时候和标准库如何关联问题 我们C程序中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明,而没有定义函数实现,统把这些函数实现都被做到名为...libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去,这样就能实现函数printf”了,而这也就是链接作用...**这个库位置: Linux默认形成可执行程序,默认使用动态库 /lib64/libc-2.17.so静态库 生成静态链接 生成可执行程序后面要加上-static 但是我们仔细看一体积差距太大了...所以,以后要下载一个C写程序,我们并不需要下载C标准库,这让我们下载效率成本低很多 静态链接拷贝不是.so内部代码,拷贝系统必须存在.a结尾静态库。

    2.1K30

    Linux】 开始使用 gcc 吧!!!

    Linux 1 认识gcc 我们在windows环境和macos环境都有功能强大集成开发环境(IDE)供我们使用 ,但是在Linux中我们如何编译运行我们代码呢?...4 函数库 我们代码中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明,而没有定义函数实现,那么,在哪里实“printf函数呢???...答案: 系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去...,这样就能实现函 数“printf”了,而这也就是链接作用 这里库又分为动态库 和 静态库 静态库指编译链接时,把库文件代码全部加入到可执行文件中,因此生成文件比较大,但在运行时也就不再需要库文件了...动态库一般后缀名为“.so”,如前面所述 libc.so.6 就是动态库。 gcc 在编译时默认使用动态库。

    13710

    一个C++bug引入许多知识

    我们定义了一个car类,它里面有一个_id标识这个car,也有一个_car来标识这个车各个部件,在最开始时候,_car指针null,当我们调用getCar时候,我们判断这个车是否创建好了部件,有的话就返回部件...17行结束,调用析构函数时出现问题 析构函数出错原因一般多次释放同一块内存 那么这里问题出现在那里呢?...接着我们把temp放进了vector中,这个时候会调用car拷贝构造函数,由于car没有定义自己拷贝构造函数,因此将会执行默认拷贝构造函数进行浅拷贝操作 这个时候内存这个样子 ?...那么这又是为什么呢 在C++中,堆内存存在复用可能,如果上一个内存已经被释放调,在new新对象时候,新对象内存便可能建立在刚刚释放内存上 我们知道vector内部类似数组连续储存空间...,这期间会调用元素析构函数和拷贝构造函数 3、C++中堆内存可以复用,当你释放一块内存之后,又立即申请一块内存,新申请内存空间很可能在刚刚释放内存上

    1.2K90

    Linuxgcc&g++与 美妙邂逅(5)

    前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下传送门!...vscode等编译器时,我们会发现,其会让我们选择对应开发包,其中就包括C头文件和库文件 二.函数库 1.库基础知识 引入: 我们C程序中,并没有定义“printf函数实现,且在预编译中包含...“stdio.h”中也只有该函数声明,而 没有定义函数实现,那么,在哪里实“printf函数呢?...最后答案:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到 系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去...然后我们才能执行;比如我们写了一段代码 (名为a.cpp),你可以用任意文本编辑软件来写,不需要非IDE 3.gcc/g++ 怎么使用?选项有哪些?怎么记忆?

    16810

    LinuxLinux开发工具-vim 编译器-gccg++ 调试器-gdb git操作 项目自动化构建工具-makeMakefile

    ,而没有定义函数实现,那么,在哪里实“printf函数呢?...最后答案:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去...链接过程我们程序和库结合过程 我们C程序中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明,而没有定义函数实现,那么,在哪里实“printf...最后答案:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去...,调用头文件声明函数 函数函数库一般分为静态库和动态库两种 静态库指编译链接时,把库文件代码全部加入到可执行文件中,因此生成文件比较大,但在运行时也就不再需要库文件了。

    8310

    Linux】编译器-gccg++使用

    前言 在之前已经分享了 【Linux】vim使用,这次来看看在云服务器上编译器gcc。 2....mv test.cxx test.txt 这里不行Linux不关心文件后缀,但是编译器关系。这里编译器就是把.txt当成文本文件了。...gcc -E test.c -o test.i 进入test.i 保存就是-E后结果 将test.c打开,对比发现test.i有800多行,怎么?...这个库里面在不是库之前,C语言标准库源代码,像printf和各种方法,进行打包形成这个库。这个库安全性很高怎么知道库里面有哪些文件?...会有一批对应头文件,这个头文件相当于一个方法说明。 所以安装开发环境:安装C标准库和C头文件 库分为动态库和静态库。在Linux面有,同样在windows里面也有。

    17210

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

    ,执行加载后可直接运行 共享库 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到共享库并在运行时解析用到相应符号 所以,前者和后者通常情况独立存在联合行动,两者差异明显:...举个例子,如果 hello.c 有一个独立 hello() 函数,没有别的函数(这里指 main)调用到,但是其他用到该库可执行文件希望用到它,那么 -rdynamic 就是必须。...先来回顾一共享库,在本文第 2 节直接执行时候马上出段错误,基本原因共享库没有强制提供一个标准 C 程序入口。...("hello\n"); 6 7 return 0; 8 } (gdb) 可以看到执行 printf 时候出错,说明库函数解析出了问题,主动用动态连接器跑一看看: $ /lib...再进一步,同样分析 glibc,发现实际入口函数并非 main(),而是 _start。

    1.1K20

    知道Linux文件系统怎么工作?详解来了

    索引节点和目录项 文件系统,本身对存储设备上文件,进行组织管理机制。组织方式不同,就会形成不同文件系统。 我们要记住最重要一点,在 Linux 中一切皆文件。...索引节点和目录项纪录了文件元数据,以及文件间目录关系,那么具体来说,文件数据到底怎么存储呢?是不是直接写到磁盘中就好了呢?...这里,下图 Linux 文件系统架构图,帮我们更好地理解系统调用、VFS、缓存、文 件系统以及块存储之间关系。...当然,你可能本身就知道,用 df 命 令,就能查看文件系统磁盘空间使用情况。...比如,下面就是运行 slabtop 得到结果: # 按 c 按照缓存大小排序,按 a 按照活跃对象数排序 slabtop Active / Total Objects (% used) :

    1.3K20

    Linux】手把手教你从零上手gccg++编译器

    ,如果对这些还不太了解朋友推荐先点击文章底部文章推荐了解一使用Linux方面的知识。...利用Linuxgcc操作验证这一过程: 我们利用gcc来将test.o二进制文件和库连接,生成可执行程序test: 函数概念 什么函数库 在前面我们提到了...,且在预编译中包含“stdio.h”中也只有该函数声明, 而没有定义函数实现, 系统把这些函数实现都被做到名为 libc.so.6 库文件中去了, 在没有特别指定时, gcc 会到系统默认搜索路径...“/usr/lib”进行查找, 也就是链接到 libc.so.6函数中去, 这样就能实现函数printf”了, 而这也就是链接作用。...验证Linux动态库和静态库连接 验证gcc 在编译时默认使用动态库: 我们手动要求程序连接静态库: gcc默认生成二进制程序,动态链接

    10910

    linuxldd命令简介

    大家好,又见面了,我你们朋友全栈君。 在linux中, 有些命令大家通用, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了。...有的人总说, 这些命令不重要, 用时候去查就行了, 这么多么扯淡说法啊。 具体用法细节可以可查, 但至少得知道有ldd这个东西吧。连ldd都不知道怎么知道ldd干啥呢?...在本文中, 我们来介绍一ldd命令, 尽管它非常简单。 哦, 我突然想起来, 我有个朋友, 她名字三个字, 首写字母刚好l, d, d, 有点意思。...在linux中, lddlist, dynamic, dependencies缩写, 意思, 列出动态库依赖关系。 当然, 你也可以用ldd –help或者man ldd来看其用法。...void print() { printf("rainy days\n"); } main.c内容为: #include "test.h" int main() { print()

    4.2K20

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

    实例: gcc hello.o –o hello 函数库 在这里涉及到一个重要概念:函数库 我们C程序中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明...,而没有定义函数实现,那么,在哪里实“printf函数呢?...动态库: .so (linux).dll(windows) 静态库: .a (linux).lib 最后答案:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时...,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去,这样就能实现函数printf”了,而这也就是链接作用 ldd 命令用于显示一个可执行文件或共享库所依赖共享库列表...它路径 /lib64/libc.so.6,并且它在内存中加载地址 0x00007f11a5172000。

    16010

    Linux函数理解

    一、前言 我们C程序中,并没有定义“printf函数实现,且在预编译中包含“stdio.h”中也只有该函数声明,而没有定义函数实现,那么,在哪里实“printf函数呢?...最后答案:系统把这些函数实现都被做到名为 libc.so.6 库文件中去了,在没有特别指定时,gcc 会到系统默认搜索路径“/usr/lib”进行查找,也就是链接到 libc.so.6函数中去...三、在Linux命名 1.动态库 我们直接编译一个文件,之后用file指令查看编出 test 可执行文件,这里可以看到 dynamically linked ,翻译成中文就是动态链接意思。...我们再 ldd test 查看链接文件 可以看到链接库叫做:libc.so.6    动态库名字一般格式为:libXXX.so   这里.6版本。...系统给我们提供 标准库 .h(告诉我们怎么用),动静态库 .so/.a 我们代码 + 库代码 = 可执行程序! 这一套只在Linux下有效吗?在windows原理也是一样

    88330

    Linux修炼】6.gccg++及Makefile【工具篇】

    我们所有使用库中函数代码(printf()),其中我们自己只写了该函数调用,没有对应实现!只有当链接时候,对应实现才和我们代码关联起来!...动态库一般后缀名为“.so”,如前面所述 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。...,为了支持我们编程,给我们提供了标准库.h(告诉我们怎么用:标准动静态库.so/.a)而对于此动静态链接,我们基于Linux系统去演示,事实上也只对Linux环境有效,但对于windows来说,其原理一样...4. gcc不更新文件剖析 对于上面的示例,我们知道gcc对于已经最新版本生成执行文件来说并不会将其改变,并会提示已经最新版本,就上面的mycode.c来说,mycode.cmodify...行缓冲区概念 1.1 sleep \n 先来执行一这个程序:(动图) 我们发现,sleep尽管在printf语句后面,但是显示器仍然先执行sleep,这是什么原因呢?

    53000

    【专业技术】在CC++程序中打印当前函数调用栈

    我们知道,正常情况,如果程序因为某种异常条件退出的话,应该会产生core dump,而如果程序正常退出的话,应该是直接或者间接调用了exit()相关函数。...,由此便可以知道exit()在哪里调用,从而上述问题便迎刃而解了。.../test2()[0x4007c9] 这下终于可以看到函数名字了,对比一2和1编译过程,2比1多了一个-rdynamic选项,让我们来看看这个选项干什么(来自gcc mannual说明):...不过不知道大家有没有想过这样一个问题,同一个函数可以在代码中多个地方调用,如果我们只是知道函数,而不知道在哪里调用,有时候还是不够方便,bingo,这个也是有办法,可以通过address2line命令来完成...:0 Oh no,怎么打出来位置信息乱码呢?不急,且看我们第3步。 3.

    2.9K40
    领券