首页
学习
活动
专区
工具
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代码段中。

61510

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也是问题所在,你会发现无法解析外部符号问题,并且翻烂了网页试遍了各种办法还是不能解决。

1K10

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

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

23910

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

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

37420

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

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

44920

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

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

1.2K30

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

《什么是强符号和弱符号》中简单介绍了强弱符号,那么强弱符号性质有什么用呢? 还记得《什么是强符号和弱符号》中提到链接原则?...,没有其他地方定义情况下,也是能够正常编译运行: $ 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,因此,我们程序内判断

40910

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

,需要自其他对象文件中链接进来 上面代码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.3K100

程序员内功心法之程序环境和预处理

汇编过程中,add.s 和 test.s 都会单独生成自己符号表,所谓符号表其实就是把 Add main 这些符号与一个地址相关联;add.s 中 Add 符号与一个地址相关联,test.s 中...如果在合并符号过程中与某一符号相关联地址是无效,程序就会抛出链接性错误;比如我们把上面 add.c 文件中代码删去,再运行程序: 经过链接,我们C程序就会从 .c 文件被转化为 .exe...上面就是一个C程序如何一步一步被执行起来,实际上编译器在编译链接过程中还有许多许多需要去注意和设计地方,我们这里也只是浅浅学习了一下程序编译链接过程,更深入知识需要我们去学习编译原理等相关知识...,结果还会是我们想要 36 ?...100

41600

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

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

94820

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

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

73420

【粉丝问答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.3K20

【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.1K10

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

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

75820

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

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

2.3K51

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

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

35510
领券