gcc
文章平均质量分 62
工作中对gcc的工作机制的一些总结。
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
mzhan017
小张
展开
-
gcc: pragma GCC diagnostic push
通过下面的方式,可以让gcc在部分代码上,不做-Wconversion的校验,也就不上报Warning,警告。但是这种还是有些风险,最好是不用。可以放到宏定义函数的外围。原创 2024-08-20 10:52:29 · 57 阅读 · 0 评论 -
gcc: string.c_str gcc-8.5的一个问题
string的这个成员是返回c类型的一个字符数组指针。但是这个指针所对应的地址有赖于string对象的生命周期。所以如果返回一个函数内的局部string对象的指针,就是危险的。如果是危险的有没有静态代码检查工具可用帮助来检查这种书写的问题。这里需要注意的一个问题是在gcc的4.8版本是可用隐藏这个问题,但是到了8.5这个版本,就不再隐藏了。所以对生命周期比较长的c++工程来说,这是一个非常大的挑战。因为原来这么错误使用也没有问题,那得有多少处这种错误使用呢?原创 2024-08-04 06:35:56 · 148 阅读 · 0 评论 -
gcc: -Q --help=optimizers;可以查看当前默认的优化选项;有变坑的潜力
根据文档看,实际的优化选项,会根据gcc的编译时配置来决定。也就是,如果特定的gcc版本,可能对应的优化选项的默认开关选择是不一样的。所以这也有可能是一个坑。原创 2024-07-14 22:04:25 · 80 阅读 · 0 评论 -
llvm: lldb: 为什么frame variable 不能将局部变量打印出来?dwp/-O/优化
和同事在看一个问题,说编译的envoy二进制文件,因为是使用了-gsplit-dwarf 选项,所以会将debug信息单独生成相应的dwo文件,而且envoy的项目里会将dwo打包称dwp文件。但是在单步调试的时候,就是不能将局部变量打印出来,使用的命令是:frame variable,没有任何输出。后来同事找到了下面的链接,看到符号的debug信息里少了局部变量的信息。中间还要穿插,envoy打包dwo,成dwp的过程。如果缺少必要的debug信息,这个debug的过程就是degraded。原创 2024-07-13 07:13:32 · 426 阅读 · 0 评论 -
gcc: options: -specs
编译器读取了file之后,处理这个文件,是为了覆盖默认的编译选项,这些选项会被gcc驱动传递给cc1/cc1plus/as/ld等程序。可以设置多个-specs文件,但是会根据顺序来处理,从左到右。gcc是一个驾驶员程序。由它控制下一步要执行哪一个编译/链接程序。所以在驱使其他程序的时候,都需要一个spec来指定这个程序应该怎么执行。n. 投机, 投机事业, 规格, 说明书, 专业人员。上面+号代表append到原有的cc1选项列表里。这个specs文件有一定的语法格式。原创 2024-07-10 06:39:40 · 156 阅读 · 0 评论 -
Linux: config: gcov GCOV_KERNEL
内核内嵌的gcov功能,默认是不打开。如果打开,同事需要enable debug_fs,然后才能查看相关的profile数据。第一次看到这个在内核里的功能。原创 2024-07-08 20:59:12 · 137 阅读 · 0 评论 -
gcc: 自身编译: opt;有个变量怎么找不到?
中间经过很多步骤,最终生成了一个options.h 文件。所以可以编译一个,找这个options.h,然后有一个直观的认识。所以下面这个变量的的定义可能是:global_options.x_warn_unused_function。原创 2024-07-06 06:25:38 · 468 阅读 · 0 评论 -
gcc: warning: -Wunused-function;加了选项,为什么就不报警告呢?
下面这个代码段,其中这个函数hton_ext_2byte,在整个程序里就没有使用。经过重新加选项-g编译gcc,使用gdb调试发现了原因。看了gcc的手册之后,其实是可以发现原因的;这就是clang和gcc之间的差异性了。上面这个 分析步骤有点复杂了。原创 2024-07-04 20:21:00 · 352 阅读 · 0 评论 -
gcc: error: request for member ‘readable‘ in ‘*(char*)(& buf)‘, which is of non-class type ‘char‘
gcc: error: request for member 'readablebytes' in '*(char*)(& buf)', which is ofnon-class type 'char'原创 2022-07-15 22:01:01 · 967 阅读 · 0 评论 -
gcc: -Wdangling-else; suggest explicit braces to avoid ambiguous ‘else’
这里是经过,建议使用显式的括号,以避免迷惑的else 语句。原创 2023-04-20 20:41:07 · 852 阅读 · 0 评论 -
gcc: __linux__
这里可能有的疑问是为什么不直接使用__linux__ 作为判断,非得再来一个新的宏符号?实例是:googletest里有用这个。判断gcc在什么平台的一个方法。原创 2023-11-04 16:03:44 · 258 阅读 · 0 评论 -
c/c++: 空语句检查;消耗掉空语句分号
这里的疑问就是,这里的问题关键是“The presence of two statements—the compound statement and a null statement—in between the if condition and the else makes invalid C code. ” 空语句和其他语句一块被解释成了多语句,导致if的简写方式出现问题。这种不能消除对于分号的影响。在定义宏的时候,可能会加大括号,此时如果在使用宏的语句后面习惯性的加分号,就可能导致一个空语句的出现。原创 2023-11-05 03:40:40 · 193 阅读 · 0 评论 -
gcc: 使用新版本的问题
后来去了gcc的官网/bug系统,发现gcc的生命力非常旺盛,还在一直不断的进新的功能。当然带来的另一个问题就是regression的问题非常多,比如下面这个列表。最近遇到一个问题,发现一个功能在gcc 8.5】是好用的,到了11.4上之后,这个功能不好使了。这种问题怎么debug好呢?第一步是要去gcc的bug系统先搜一下(英语的重要性就来了)。上面这个列表就有121个bug被fix。其中很多是regression问题。所以开源软件选择新版本的时候还是要慎重,最好是经过社区的长时soak之后。原创 2024-06-11 05:28:04 · 592 阅读 · 0 评论 -
C++: version `GLIBCXX_3.4.29‘ not found
通过strace看编译的过程发现了原因:编译sockper使用到的so文件时下面这个路径下的,这个路径下的so是之前自己build gcc的时候安装上去的。解决方法是,将这个目录下的so文件删除,重新编译sockperf。这就想不明白了,在同一个机器怎么可能能编译不能运行呢?原创 2024-06-20 14:41:50 · 223 阅读 · 0 评论 -
linux: make & autoconf & automake & autoreconf & aclocal
recipe规则的基本定义语法,如上;target是目标文件,编译生成的输出文件。目标也可以是一项操作,比如,经常用到的clean操作。prerequisties,前提条件,就是生成目标文件所需的输入。recipe是make工具要完成的一系列操作。(这里target是output,prerequisties是input,recipe是从input到outpu的一系列操作)原创 2021-06-05 00:05:01 · 914 阅读 · 1 评论 -
[开源软件] CCCoreLib;函数bool Delaunay2dMesh::buildMesh,为什么返回的是false
请参考网址。原创 2024-06-20 05:41:45 · 484 阅读 · 0 评论 -
gcc:coverage:gcda文件没有生成的另一个例子:dlopen
如果是使用dlopen的方式来打开一个函数,需要记录coverage的数据,就需要使用下面这个链接。原创 2024-06-09 09:33:02 · 125 阅读 · 0 评论 -
gcc: coverage: gcda文件没有生成另一例:so文件调用__gcov_dump
那么会造成一个问题,如果想通过so中的某个函数调用gcov_do_dump,会调用so内部的。所以导致某些gcda文件生成不出来。这个时候主程序也是有用–coverage编译链接,那么也会含有一套这个函数。原因是gcc提供的libgcov库是一个静态库。这个so文件里带有gcov需要的很多函数/全局变量(符号),包括gcov_dump,gcov_var,。所以要避免这种方式,最好是不要在so文件里有这些gcov的函数定义。如果使用gcc --coverage选项编译出一个so文件。原创 2024-06-08 06:23:55 · 470 阅读 · 0 评论 -
gcc: coverage: gcda 文件没有生成的问题,又一例,问题被复杂化了
看到现在,发现有一个环境变量可以将gcov程序里的错误打印出来。最近再调试gcda文件没有生成的一个问题,感觉把问题复杂话了。如果将错误打印出来,问题分析就简单了。原创 2024-06-07 10:31:48 · 340 阅读 · 0 评论 -
[晕事]今天做了件晕事36 函数A明明调用了B,但是在汇编里却找不到,static优化
这个迷惑的原因是,gcc的优化对dump_one_gcov这个函数调用进行优化。因为这个函数 静态的,而且只被一个地方调用。gcc会将dump_one_gcov做inline处理,可以省去函数调用的过程,也算是一个优化。最近看gcov的一个问题,在分析二进制文件和源代码的时候发现,这个函数体明明不是很大,但是汇编内容确实巨量。占到~5000个字节。而且这里明明调用了dump_one_gcov,却找不到相关的汇编代码。这个时候还是会纳闷,怎么回事?原创 2024-06-06 04:47:16 · 160 阅读 · 0 评论 -
gcc: gsplit-dwarf 后在gdb里遇到的一个问题:如何dwo文件加载
这个时候如果想使用gdb调试程序,gdb的策略是lazy方式加载dwo文件,而且根据indirect(间接)的路径去找dwo文件,如果找不到,就会导致有些变量打印不出来。需要让gdb自己能通过间接路径找到dwo文件。假如使用了gsplit-dwarf选项,而且选择输出dwarf调试信息,这个时候,为了减小可执行文件的大小。链接器会将dwarf的调试信息,单独放到一个新文件里,后缀是dwo。这个时候还不能使用symbol-file/file加载dwo文件。现在还没找到别的好办法。原创 2024-05-17 20:14:59 · 223 阅读 · 0 评论 -
coredump-x: sanitizer编译出现segmentfault
如果是使用多个sanitizer的功能,比如lsan,asan,ubsan同时使用的时候,就会出现这个错误。看着更像是这三个里面的符号可能有冲突,导致符号的地址出现异常。从上面两个链接,看着已经解决了,需要使用新版本的gcc。原创 2024-04-15 13:08:31 · 151 阅读 · 0 评论 -
c/c++: warning变量未初始化的一个workaround:uninitialized_var
【代码】c/c++: warning变量未初始化的一个workaround:uninitialized_var。原创 2024-02-26 20:15:20 · 145 阅读 · 0 评论 -
Linux: dev: gcc: plugin: annobin
这个的功能是记录一些编译信息在二进制文件里,stip的时候,不会被strip掉,同时也不会被加载到运行时的内存里。方便查看编译信息,有利于问题分析。原创 2023-12-31 21:18:26 · 535 阅读 · 0 评论 -
Linux: dev: gcc: --coverage 迷惑行为最终生成不了gcda文件?
最近和同事看一个问题,就是虽然将所需的选项–coverage加到了产品的编译环境里,但是还是没有生成所希望的文件。而且自己写小程序来验证这个选项,也是没问题,可以产生程序运行时的代码覆盖率统计文件。这两的主要区别就是少了.init_array后面的通配符。那接下来就是要看到底是什么样的改动影响了这个行为。那问题出现到了哪里呢?后来同事经过查看一个链接脚本的更改记录,发现是链接脚本里的改动影响了这个行为。最终导致文件产生不了。原创 2023-12-29 13:43:54 · 1187 阅读 · 0 评论 -
Linux: dev: gcc: gcoverage;代码运行时的覆盖率
前些天写到gcc的instrument,https://mzhan017.blog.csdn.net/article/details/135098562;今天看到这个就是属于这一类,查看代码运行时的覆盖率的功能。可以帮助查看代码运行时的覆盖率需要编译时带上 --coverage选项加上这个之后,gcc编译时就会添加一些全局计数,比如下面的汇编。从文档里看,需要将优化选项去掉,不然有些优化可能导致统计问题。原创 2023-12-28 20:35:09 · 547 阅读 · 0 评论 -
Linux: dev: gcc: Instrumentation 程序的检测仪表/手段
Instrumentation的解释:https://mzhan017.blog.csdn.net/article/details/131621575最近从GCC的文档看到这个说明。其实也可以说明,任何一项技术使用的频率上来之后,大家就会想着如何检测产出的的优劣,为改进提供数据基础。这个程序检测手段也是相同的概念。说GCC可以帮助程序开发者,做一些程序底层的统计分析,比如代码的覆盖率是否完备,哪些代码是运行时的热点等等。当然如果程序员需要其他类似的检测,也可以自己创新出来一个。原创 2023-12-20 06:50:09 · 1052 阅读 · 0 评论 -
[英语单词] intrinsic
其实计算机中也有英语这个单词,讲述的是直接从C语言里,来访问汇编的裸指令(是相对于高级语言C来说的,其下层CPU机器指令),有一个内部,内在的意思;#endifAll of them generate the machine instruction that is part of the name. 这一句话应该添加一个例子,比如xsaveopt。意思就是这两个函数会生成机器指令,这个机器指令是builtin函数的一部分。那如何表达呢?原创 2023-12-13 15:40:19 · 862 阅读 · 0 评论 -
Coredump-X: 假如delete/free一个栈上的变量Wfree-nonheap-object;Wmismatched-new-delete
因为这个栈上内存,没有经过malloc函数的赋型,导致后续free的时候,做检查的时候就通不过,会报错误:munmap_chunk(): invalid pointer。同时会出现SegV(gdb) bt(gdb) c(gdb) bt(gdb) f 5(gdb) p &a。原创 2023-11-14 20:41:55 · 147 阅读 · 0 评论 -
gcc: O2编译选项 可以掩盖的一种coredump情况
有时候会决定将其删除。比如:析构函数里的对对象成员的赋值,因为对象都要被析构了,赋值没有意义,就会将赋值语句从实际的二进制文件里去掉。有些代码,如果选择O2选项的话,GCC会认为代码无用,或者根本不会产生任何数据上的变更,没有意义。而不带-O2选项的编译结果,可能会出现一种coredump。这个时候,如果赋值语句如果有问题,就会被O2选项给掩盖掉。原创 2023-10-30 13:44:35 · 177 阅读 · 0 评论 -
gcc: 优化选项:fdevirtualize,polymorphic; inline;
在实际使用中,开发人员可以使用一些编译器标志或注释来提示编译器进行 devirtualization 优化,但这通常需要谨慎的选择和测试,以确保不会引入不正确的行为。在C++中,虚拟函数是通过基类指针或引用来调用的,因此在运行时需要进行动态分发,查找相应的派生类函数。使用 -fdevirtualize 选项,编译器会尝试根据可用的信息来确定是否可以内联虚函数的调用,以提高程序的性能。总之,-fdevirtualize 选项是一种用于内联虚函数调用的编译器选项,而不是一种通用的虚拟函数优化选项。原创 2023-10-27 20:40:01 · 184 阅读 · 0 评论 -
gcc: -O2 优化选项的一个副作用:可以掩盖链接,符号未定义错误 undefined reference to
所以看问题时,需要注意这一点,如果用-O2 编译链接工程,没有问题。并不一定代表去掉 -O2 就可以链接成功。同时如果A函数是个死函数的话,-O2,可能将这个函数A优化为如下的方式,直接返回。看似从未调用这个函数。这个-O2 优化选项,可以掩盖链接错误。因为这个包含130多项的优化选项。里面有关于四代码的优化。假如一个函数A里调用了另一个函数B,但是函数B是外部定义的符号,而且没有定义。原创 2023-10-27 07:47:57 · 376 阅读 · 0 评论 -
[晕事]今天做了件晕事26;gcc对strcmp/strncmp的优化
比如,后面期望通过nm可以查到foo符号的定义及地址。再后来使用disass main之后,发现,main函数的汇编非常的短,就下面两个指令。这里需要提一下,编译的时候使用了-O2。这里可以看到编译器进行了非常大的优化。今天做了一件晕事,写了一个测试小程序,开头的程序例如下面片段。在后续又写了一些代码,进行编译,使用gdb查看可执行文件,怎么都得不到想要的结果,非常的纳闷,非常的奇怪。gcc编译器在编译时,已经判定 strncmp函数调用有问题,直接给了一个ud2的指令,这其实不方便问题的调试。原创 2023-10-25 20:59:13 · 190 阅读 · 0 评论 -
[晕事]今天做了件晕事24;GCC -W
W的含义是:-Wextra;着-W是建议不要再使用了,因为字面意思与含义不符。而且:https://www.man7.org/linux/man-pages/man1/gcc.1.html,这些个网页里已经没有这个选项。-Wall的含义是 所有的警告,但是不包含 extra的,所以要看手册才能知道到底包含哪些。其实这个all的字面意思与真实含义,也有些含糊。这个是禁止所有的警告消息。-Wextra,额外的警告。原创 2023-10-19 06:04:36 · 385 阅读 · 0 评论 -
gcc: implicit-fallthrough 的问题
这个链接有说基本用法,在使用这个选项的时候,但是还有可能遇到比较奇怪的问题。原创 2023-10-18 16:25:38 · 204 阅读 · 0 评论 -
汇编:lea 需要注意的一点
374d55: 48 8b 76 08 mov 0x8(%rsi),%rsi ,,,,卡在这一行,rsi当前值是0,374d31: 48 8d 46 28 lea 0x28(%rsi),%rax ,,,, 这里应该也会错。mov 0x8(%rsi),%rsi,而这个mov,在计算完地址,还要访问内存地址。lea 0x28(%rsi),%rax ,这个只是计算一个地址,而不是去做地址访问。原创 2023-09-07 13:00:27 · 687 阅读 · 0 评论 -
[gcc] 宏:__COUNTER__
第一次看到这个gcc定义的宏,用途是在编译时获取一个唯一的代码(整数),从0开始;但是gcc的文档里没有对这个宏进行说明。原创 2023-08-21 16:01:26 · 323 阅读 · 0 评论 -
glibc: seteuid/setuid 和 LD_LIBRARY_PATH的关系;不要感觉太奇怪;
由于安全的考量,在发现运行程序的uid/gid!= real uid/gid,此时ld.so 会将下面的环境变量置空。所以在程序里如果设置了seteuid,然后再做execve的拉起程序的时候,这些个变量都会置空。从man ld.so 里看,有安全执行模式:Secure-execution mode。原创 2023-08-01 07:01:46 · 160 阅读 · 0 评论 -
gcc: pragma: weak
这个是说symbol1是一个弱链接到symbol2。如果symbol2没有定义,就会出错。这个使用的情景是,在特定的环境下再定义一个函数来进行调用。在其他情况下不需要执行的时候。算是一种特殊的处理。编译即使找不到这个符号,也没有关系。当然要判断符号是否存在。这个pragma weak可以出现符号声明的前面或者后面,对位置,没有要求。这样即使没有定义这个符号,也不会报错误。为了和SRV4的兼容。原创 2023-07-24 14:19:55 · 186 阅读 · 0 评论 -
GCC,4.8与8.5之间的差别一例
对于局部变量:char abc[11];的栈内内存的申请不一样。4.8里可能超过11个字符空间。而8.5 是实际占用。但是为什么,还没找到原因。以上两个参考链接可以看到些资料。原创 2023-07-22 15:32:16 · 182 阅读 · 0 评论