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

GCC:在链接过程中打印符号的值吗?

GCC(GNU Compiler Collection)是一套由GNU开发的编程语言编译器集合,包括C、C++、Objective-C、Fortran、Ada和其他语言的编译器。GCC在链接过程中通常不会直接打印符号的值,而是通过符号表来管理和解析符号。

符号表是一个存储在可执行文件或共享库中的数据结构,用于记录程序中定义和引用的符号(如变量、函数、类等)的信息。在链接过程中,GCC会将所有编译单元(源文件)生成的目标文件合并成一个可执行文件或共享库。在这个过程中,GCC会根据符号表来解析符号的引用,将其与定义进行匹配,以确保符号的正确链接。

虽然GCC本身不会直接打印符号的值,但可以通过使用调试工具(如gdb)来查看符号的值。调试工具可以加载可执行文件或共享库,并提供一系列命令和功能来检查和修改程序的状态,包括查看符号的值、调用堆栈、内存内容等。

总结起来,GCC在链接过程中不会直接打印符号的值,而是通过符号表来管理和解析符号。如果需要查看符号的值,可以使用调试工具来进行调试和查看。

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

相关·内容

【图片+代码】:GCC 链接过程中的【重定位】过程分析

在链接的过程中,符号重定位是比较麻烦的事情,特别是在动态链接的过程中,因为需要考虑到很多不同的情况。 这篇文章作为第一篇,先来聊一聊静态链接中的重定位过程。...按照惯例,还是以一个简短的示例代码作为载体,看一看GCC在链接的过程中,是如何根据目标文件(.o文件)来进行重定位,生成最终的可执行文件的。...代码如下: sub.c main.c 在一般的开发过程中,都是使用GCC工具,直接把这2个源文件编译得到可执行文件。...当链接器把所有的.o文件链接成可执行文件的过程中,才能确定这2个符号是在哪里。...我们知道,当链接成可执行文件时,所有的符号都必须有确定的地址(虚拟地址),所以链接器就需要在链接的过程中找到这2个符号在可执行文件中的地址,然后把这两个地址填写到main的代码段中。

81210

在 Linux 上查找和删除损坏的符号链接

符号链接(symbolic link)在 Linux 系统上扮演了非常有用的角色。...它们可以帮助你记住重要文件在系统上的位置,使你更容易访问这些文件,并让你不必为了更方便访问大文件而复制它们,从而节省了大量的空间。 什么是符号链接?...通常称它们为“符号链接”或“软链接”,符号链接是非常小的文件。实际上,符号链接真正包含的是它指向的文件的名称,通常包含路径(相对于当前位置或绝对路径)。...符号链接只不过是存储在某个特定目录中的引用而已,它不会随着指向它的文件发生变化而更新或删除。它一直指向被引用的文件,即使这个文件早已消失。...-xtype l 为了避免在该命令尝试查找你无权检查的文件或目录时发生错误,你可以将所有错误输出到 /dev/null,如下所示: $ find .

2.6K21
  • 编译链接过程中出现“无法解析的外部符号”,原因及解决办法总结

    1、错误为:error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _OBJ_create_objects 中被引用 原因:__report_rangecheckfailure...而这些检查堆栈缓存溢出的代码中在msvcrt11.dll及以后版本中都会调用到__report_rangecheckfailure 函数,所以当你用vs2010及以前版本进行开发,并使用了由vs2012...及以后编译器编译的库文件时,在链接的时候就会报这样的错误。...解决办法:打开项目属性,C/C++——代码生成——安全检查——禁用安全检查(GS) 2、可以明确知道无法解析的外部符号是某个自己编译的动态链接库的时候,多半是动态链接库引入不正确,不正确的原因: (1)...如果项目编译是64位,库编译用的是32位,那不会直接抛出错误,只有一个警告,但是,这个Warning也是问题的所在,你会发现无法解析的外部符号的问题,并且翻烂了网页试遍了各种办法还是不能解决。

    3.3K10

    记一次在买书过程中发现的短链接安全

    某天我正忙着给为俱乐部买书的订单申请发票的时候,看到了下面这个邮件 当复制连接的时候我发现是它是一个短链接。 什么是短链接呢?...早期短链接广泛应用于图片上传网站,通过缩短网址URL链接字数,达到减少代码字符串的目的。更便于使用者引用网址,写入代码中。节省字符数空间。...常见于网店图片分类的使用,因有字符限制,运用短链接,达到外链图片的目的,自微博盛行以来,在微博字数有限的特色下,短链接也盛行于微博网站,以节省字数,给博主发布更多文字的空间。...服务编辑 当时我就想到了,短链接会不会存在安全相关的漏洞呢?既然通过短短的几个字符就可以跳到我目标的地址,我是不是可以通过对现有的字符进行爆破从而访问到其他人想要访问的目标呢?...随即,我准备对俩个字符进行fuzz 通过对返回包的字符大小判断,我们可以快速锁定到有用的结果 也就是说,若短链接的加密过于简单的时候,hacker其实是可以通过对url进行fuzz从而获取到大量的敏感数据的其中

    29110

    Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪)

    前言 opentelemetry-cpp 在标准上报协议OTLP里是支持使用 gRPC 作为传输协议的。但是,当 gRPC 被作为静态库同时链接进多个动态库时,在一些平台上会有一些问题。...这种情况如果我们把 gRPC 编译成静态库,并链接进多个动态库里,那么每个动态库里都有一份 gRPC 的全局变量和函数符号。...而在ELF ABI(Linux)下,情况变得有点不一样了,因为在ELF ABI下整个堆和符号表是整个可执行程序共享的,ld.so 保证了当多个动态库包含相同的符号(通常是链接了相同的库)的时候,默认选中最早链接进的那一个...这导致某些工具链下出现未定义的符号的链接错误。...因为 otlp_grpc_client 会链接 gRPC ,所以不会出现符号找不到的问题。

    52220

    只有170字节,最小的64位Hello World程序这样写成

    可以写一个程序入口不是 main 吗? main 的 int 返回值有什么用?是谁在处理 main 的返回值? printf 是谁实现的?如果不用 printf 可以做到在终端中打印字符吗?...编译、链接和装载是一个巨大的话题,不是一篇博客可以覆盖的。在这篇博客中,我想使用「文件尺寸」作为线索,来介绍从 C 源代码到可执行程序这个过程中,所经历的一系列过程。...Step1: Strip Symbols 第一步,也是最容易想到的一步,剔除符号表。 符号是链接器工作的的基本元素,源代码中的函数、变量等被编译以后,都变成了符号。...这些符号都存储在了 ELF 中,主要用于链接,对于可执行文件来说,符号并没有什么太大作用,所以我们首先可以通过剔除符号表来节省空间。 有两个方法,第一是通过 strip,第二是通过 GCC 参数。...实际上我们编写的程序都会被默认链接到 GCC 提供的 C 运行时库,叫做 crt。 通过 gcc --verbose 我们可以查看编译链接的详细日志。

    52520

    程序一定要从main函数开始运行吗?

    链接就是把相似的段放在一起,先找到段的偏移地址,再找出符号在段中的偏移,这样可以确定符号在整个可执行程序中的地址。...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一段简短的printf函数其实都依赖了好多个链接库,我们也不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一段字符串.../test hello 如何使用自定义链接脚本实现自定义段的功能 在ld链接过程中使用-T参数可以指定链接脚本,通过ld -verbose可以查看默认的链接脚本,原文太长,这里简单截取了一部分: $...A:该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。...B:该符号的值出现在.bss段中,未初始化的全局和静态变量。 C:该符号的值在COMMON段中,里面的都是弱符号。 D:该符号位于数据段中。

    1.3K30

    骚操作:利用强弱符号制作插件库

    在《什么是强符号和弱符号》中简单介绍了强弱符号,那么强弱符号的性质有什么用呢? 还记得在《什么是强符号和弱符号》中提到的链接原则吗?...,在没有其他地方定义的情况下,也是能够正常编译运行的: $ gcc -o main main.c $ ..../main this is plugin print 需要注意的是,这里在链接插件库之前,需要加上: -Wl,--whole-archive 该选项会将插件库中所有符号都链接进来,若非如此,在main.c...最终我们可以通过nm命令看到my_print符号已经不再是W了。也就看到了最后: this is plugin print 的打印了。...: 1.这一点在《什么是强符号和弱符号》一文中已经有解释说明了 2.在开始的程序中,即便没有链接插件库,程序也可以正常编译链接通过,而不会报错 3.没有链接插件库时,由于其函数地址为0,因此,我们程序内判断

    44010

    声明和定义的区别(深入理解)

    ,需要自其他对象文件中链接进来 上面代码在a.cpp中书写,编译生成文件a.obj,没有问题。...long get_session_( long a, long b ) { xxxx;} //定义 多了 {} 实现 }; 扩容:c++和c 对函数符号规则一样吗 说明...a.c 编译代码1没有问题 因为声明是符号 2 gcc a.c 编译代码2 有问题 3 g++ a.cpp: 代码1和代码2 编译都没有问题 c语言不支持函数的重载 因为函数名称就是符号 知识补充...如何查找一个符号 1 如何查看一个动态库信息 1.nm -D libxxx.so 打印出符号信息。...说明 1 ldd动态库是不显示静态库的名称的 2 静态库的代码在编译过程中已经被载入可执行程序 1 nm工具可以打印出库中的涉及到的所有符号,这里的库既可以是静态的也可以是动态的。

    1.4K100

    可怕的extern关键字一、不利之处二、例子三、分析四、正确做法

    这是因为编译是以源文件为单位的,在bad_test.c中func的声明是无参的,调用也是按无参调用的,所以编译器不会告警。...如果把extern声明去掉,编译器好歹还能给个“函数未显式定义”的警告。 链接的时候也没报错?...这是因为,在C语言中,编译出来的函数符号表是不带参数的,如下所示, func在符号表中就是字符串func。 这也是为啥C语言不能做编译时多态的原因。 所以,别指望在链接的时候报错。...竟然把argc的值打了出来!!! 程序运行的时候,调用的肯定还是带参数的func函数,但是这个参数从哪里来呢?...考虑到默认从右到左的压栈顺序,处于栈顶的argc被取出来塞给func函数作为入参了,所以func打印出来的是argc的值。 都这样了,接下来离各种莫名其妙的异常还远吗?

    1.3K20

    C++ 编译器和链接器的完全指南

    编译器 编译器是将源代码转换为可执行文件的程序。在C++中,常用的编译器有GCC和Clang。编译器的主要工作是将源代码翻译成汇编代码,然后再将汇编代码转换成机器码。...链接器 链接器是将多个目标文件合并成一个可执行文件的程序。在C++中,常用的链接器有GCC和ld。链接器的主要工作是将程序中引用的函数和变量与定义的函数和变量进行匹配,最终生成可执行文件。...符号表选项可以打印出程序中的符号表信息,而动态链接选项可以将链接库的加载推迟到运行时。链接器的选项也很多,需要根据实际情况选择合适的选项。 链接器的主要作用是将多个目标文件合并成一个可执行文件。...链接器将多个目标文件合并成一个可执行文件,并解决符号引用问题。 在这个过程中,编译器和链接器都需要使用选项来控制其行为。...编译器可以将源代码转换成机器码,而链接器可以将多个目标文件合并成一个可执行文件。在程序开发过程中,我们需要使用编译器和链接器来生成可执行文件。

    87320

    【粉丝问答18】linux下查看函数被那些函数调用过?

    欢迎订阅粉丝问答专题,点击下面链接,然后点击订阅: 《粉丝问答》 一、问题 有个打印log的函数,想知道该函数执行的时候,之前执行了哪些函数? ?...该选项让链接器将所有符号添加到动态符号表中,这样才能将函数地址翻译成函数名,否则打印的结果是不会打印函数名的。 另外,这个选项不会处理static函数,所以,static函数的符号无法得到。 3....编译时加上-rdynamic参数,通知链接器支持函数名功能(不加-rdynamic参数则无函数名打印): gcc 123.c -o run -rdynamic -g 执行结果: ?...该函数在我们调试内核的过程中可以打印出函数调用关系,该函数可以帮助我们进行内核调试,以及让我们了解内核的调用关系。 1....结果 可以看到在函数ccc中使用dump_stack()打印出了ccc的函数调用栈。

    1.6K20

    程序员C语言快速上手——工程篇(十二)

    每个函数或变量都有自己独特的名字, 才能避免链接过程中不同变量和函数之间的混淆。在链接中, 我们将函数和变量统称为符号(Symbol) , 函数名或变量名就是符号名(Symbol Name) 。...链接过程中关键的一部分就是对符号的管理, 每一个目标文件都会有一个相应的符号表(Symbol Table),这个表里面记录了目标文件中用到的所有符号。...每个定义的符号有一个对应的值, 叫做符号值(Symbol Value) , 对于变量和函数来说, 符号值就是它们的地址。...简单理解,符号在汇编中代表一个地址,经汇编器处理之后,所有的符号都会被替换成它所代表的地址值。...命令行运行main2.exe,打印结果 add = 16 sub = 8 现在我们有了自己的静态库,可以直接对源码进行编译链接 gcc main.c -L.

    1.4K20

    深入浅出GCC编译器

    上述读入源程序的过程和识别符号的任务通过词法分析程序实现,词法分析整个过程依据的是语言的词法规则。词法分析程序的输出通常是一个二元组,即单词种别和单词自身的值。...无论采用静态链接还是动态链接,都会生成一个可以在计算机上执行的可执行程序。 2. GCC编译流程 GCC的编译流程也一样四个阶段,和上节所讲的一致。这里主要讲每个环节所使用的参数以及使用的工具。...,而gcc默认不会生成新的文件,所以就把预处理后的代码全都打印在了终端,所以你执行命令后会看到一下子出来一堆代码 gcc -E hello.c 执行完预处理命令后,我们看一下当前目录,并没有发现hello.i...(7)-Wall 显示更多警告信息 当GCC在编译过程中检查出错误的话,它就会中止编译,并报错。...举个例子,我们写一个int类型的main函数,并且不加return语句 我们直接编译程序,可以看到,编译通过,没人任何报错也没有任何警告,并且程序可以运行并打印出值。

    53910

    【有奖反馈】在小程序云测服务使用过程中,大家有什么想要吐槽的吗?

    MiniTest小程序云测试是腾讯WeTest与微信官方联合推出的小程序自动化测试服务。...同时,我们也在持续优化服务体验,如: 1. 增加报告分享功能,增加历史报告对比功能。 2. 提升录制回放和自定义测试稳定性。 3. 支持用例排序。 4....优化报告结束时,用户通知方式(如增加邮件、短信通知等) 在小程序云测使用过程中,大家有什么想要吐槽或者反馈的吗?...腾讯WeTest为移动开发者提供兼容性测试、云真机、性能测试、安全防护等优秀研发工具,为百余行业提供解决方案,覆盖产品在研发、运营各阶段的测试需求,历经千款产品磨砺。...金牌专家团队,通过5大维度,41项指标,360度保障您的产品质量。

    78120

    【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    , 在预编译中会被删除, 直接替换到代码中 //预编译过程中 MIN(a,b) 会被 (((a)>(b)) ?...//也可以在gcc -E 命令中指定 #define 常量 //gcc -DC=1 -E test_1.c -o test_1.i 可以进行同样的预编译处理, 即使没有定义这个宏 //gcc -DC=...#运算符 ---- #运算符作用 : 1.将宏参数转为字符串 : # 运算符 可以在 编译 的 预编译 阶段, 将宏定义中的参数, 转化为 字符串 ; 2.预处理器开始符号 : 预处理器 开始处理...的符号 ; 3....##运算符 ---- ## 运算符作用 : 1.作用 : 在预编译阶段粘连两个符号 ; 2.代码示例 : #include //## 运算符 作用 : 预编译过程中 将两个符号连接在一起

    1.3K10

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

    常用工具 我们首先列出一些在接下来的介绍过程中会频繁使用的分析工具,如果从事操作系统相关的较底层的工作,那这些工具应该再熟悉不过了。..., x86-64, version 1 (SYSV), not stripped 我们看到这里的main.o文件是可重定向( relocatable) 的ELF文件,这里的重定向指的就是我们链接过程中对外部符号的引用...既然外部的符号是在链接时才会被main程序知道,那在编译main程序,生成可重定向文件时这些外部的符号是怎么处理的呢?...我们已经知道在编译时生成的文件中外部符号的部分使用0暂时留空的,这些外部符号是待链接时再填充的。那么,我们在链接时究竟需要填充哪些位置呢?...但在编译时,它也不知到这些符号具体在什么地址,因此这些符号的地址会在编译时被留空为0。此时的重定位,就是链接器将这些留空为0的外部符号填上正确的地址。

    3.6K52

    【C进阶】——我们写的代码是如何一步步变成可执行程序(.EXE)的?

    刚刚在上面的过程中我们提到了编译器和链接器这两个东西。...所以,在编译过程中,会把预处理之后的C语言代码转换成汇编代码。 那在转换的过程中,又会做什么呢? 1.语法分析 2.词法分析 3.语义分析 4.符号汇总 那这几步又是干什么呢?...那这其实就是符号汇总的一个作用,为什么要单独解释一下符号汇总呢? 因为在链接的部分我们需要用到这些知识。 2.2.3 汇编 那接下来就是汇编了,编译的最后一步。...当链接过程中进行了符号表的合并和重定位之后,test.c中main函数调用add的时候是不是就能通过符号表中重定位之后的有效的函数地址找到add函数并调用它。...这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。 终止程序。

    1.4K10
    领券