gcc
文章平均质量分 78
unbutun
这个作者很懒,什么都没留下…
展开
-
#define barrier() __asm__ __volatile__("": : :"memory") 中的memory是gcc的东西
<br />gcc内嵌汇编简介<br />在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。<br /><br />1、简单的内嵌汇编<br />例:<br />__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm__"的别名。"__volatil转载 2011-01-07 20:45:00 · 2823 阅读 · 4 评论 -
各类分析函数调用关系图的工具
calltree 2.3 http://mirror.lzu.edu.cn/software/calltree/calltree-2.3.tar.bz2 gprof 2.18.0.20080103 在ubuntu/debian下直接安装即可 http://citeseer.ist.psu.edu/graham82gprof.html kprof 1.4.3 (在ub转载 2011-06-23 23:54:00 · 865 阅读 · 0 评论 -
gcc-vcg-plugin : 視覺化 GCC 內部結構
對岸的 Eric Fisher 做了一個很棒的工具 [gcc-vcg-plugin ],本質上是個 GCC Plugin,可輸出 VCG 格式的圖例,作為分析 GCC 內部架構使用。筆者在 Ubuntu Maverick (10.10 開發中版本) 測試過,配合 gcc-4.5转载 2011-07-12 20:24:45 · 575 阅读 · 0 评论 -
gprof使用介绍 (gcc -pg)
gprof介绍gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记转载 2011-07-15 19:50:24 · 2977 阅读 · 1 评论 -
gcc-vcg-plugin (gcc 4.4以后支持plugin模式,不需要重新编译即可使用,可惜编译这个东西需要完善工具链,比较麻烦,如果作者能直接提供编译好的,大家用就行了,没必要再编)
http://code.google.com/p/gcc-vcg-plugin/ 简介GCC VCG Plugin是一个GCC插件,可以将GCC在编译程序的过程中,产生的内部数据结构图形化;从而,方便分析应用程序和GCC本身。目前,可以初步图形化➔ 控制流图➔ 函数调用图➔ 支配转载 2011-07-12 20:23:20 · 944 阅读 · 0 评论 -
Why Does GCC LEA EIZ?
Now to the topic at hand. I was disassembling some code the other day (just using objdump, nothing fancy) and I noticed a weird pattern emit转载 2011-08-04 21:41:15 · 335 阅读 · 0 评论 -
The quickest way to do nothing (lea eiz,代码需要pad的时候,用这个比三条nop快,不过gcc要加-mindex-reg选项)
As I was debugging something recently, an instruction popped up that seemed a little incongruous:lea 0x0(%edi,%eiz,1),%ediNow this转载 2011-08-04 21:56:41 · 413 阅读 · 0 评论 -
Linux内核源码分析——compiler.h分析
《Linux内核源码分析——compiler.h分析》转自 强悍的lost的bolg Linux的内核源码都会包含文件linux/compile.h,所以先分析该文件内的内容,作为开篇。1 汇编编译时不定义的内容该文件的第一个内容是对宏__ASSEMBLY__的判转载 2011-08-12 20:30:03 · 1183 阅读 · 0 评论 -
开源静态代码检测工具Splint
如果想用一个有效的工具察看C/C++源代码中的错误,遗漏,不确定的构建过程,以及移植问题等等,你应该来看看Lint。可以把Lint当成一个编译器,除了不产生代码之外,对于错误和警告的报告来说已经非常足够了。通常,一个C/C++的编译器假设程序是正确的,而Lint恰恰相反,因此它优于编译器执行的一般性检查。Lint还可以贯穿多个文件来执行它的错误检查和代码分析,这是编译器做不到的。转载 2011-10-27 22:32:53 · 648 阅读 · 0 评论 -
linux zImage生成过程详解
<br />可以看到,在顶层makefile的第278行,包含了scripts/Kbuild.include文件,在这里定义了大量的函数和变量,供顶层makefile和其他makefile文件使用。<br />在顶层makefile文件的第412行,包含了arch/arm/Makefile。这个是体系结构相关makefile文件。它定义了体系结构相关的一些变量及规则。<br />当执行”make”时,arch/arm/Makefile中的185行的规则将是make遇到的第一个规则:<br />all:转载 2011-04-26 23:22:00 · 596 阅读 · 0 评论 -
对编译和链接的一点Hack
Linux中有一个小工具叫objcopy,它用于目标文件之间的拷贝和转换。我们可以利用它将一个普通文件转换为可以用于链接的目标文件。先创建一个内容为Hello,world的文本文件:$ echo ‘Hello,world’ > file然后用objcopy将其转为一个ELF格式的32位目标文件:$ objcopy -I binary -O elf转载 2011-06-16 21:51:00 · 765 阅读 · 1 评论 -
dlsym与-fPIC,以及objcopy
这两天做的工作当中,遇到了这样一个需求。在Linux环境下,要为一个daemon程序的一个动态库进行升级,不不打断这个daemon的运行。这个动态库的函数会被daemon的多个线程调用。在升级时,对于已经使用了这个动态库的线程要毫无影响,直到这样的线程再次调用动态库的API时,再使用新的动态库。换句话说,在升级时,新旧两个动态库可以同时被这个daemon的线程调用。 为了实现这个功能,毫无疑转载 2011-06-16 21:35:00 · 551 阅读 · 1 评论 -
gcc中设置特定代码块的优化级别
<br />今天碰到一个gcc优化相关的问题,为了让一个页变成脏页(页表中dirty位被置上),需要执行下面这段代码:<br />1 uint32_t *page; <br />2 // ... <br />3 page[0] = page[0]; <br />最后一行代码很有可能被gcc优化掉,因为这段代码看起来没有任何实际的作用。那么如何防止gcc对这段代码做优化呢?<br />设置gcc编译时优化级别为-O0肯定是不合适的,这样对程序性能影响会比较大。stackoverflow上的Dietrich E转载 2011-02-16 19:50:00 · 732 阅读 · 0 评论 -
转:Before main() 分析
找到动态连接器的入口代码。先参看《Before main() 分析》。redhat上测试,其他linux的gdb结果不一样或有问题.=======================================================================[test@redhat]# more test.c#include int main(int argc, char *argv[]) { printf("Hello, world/n"); return 0; }[tes转载 2011-03-22 22:13:00 · 280 阅读 · 0 评论 -
alloca 在栈上分配空间,在函数返回时,由于栈框的释放而自动释放
ALLOCA章节:Linux 程序员手册 (3)<br />更新:2008-01-24<br /><br />到 易美翻译 翻译 本页<br />名字alloca - 分配可以自动释放的内存概要#include <alloca.h><br />void *alloca(size_tsize);描述alloca() 函数从调用者的栈桢上分配 size 个字节的空间。这个临时的空间会在调用 alloca() 的函数返回到它自身的调用者时自动释放。返回值alloca() 函数返回一个指向被分配空间转载 2011-05-27 19:38:00 · 1347 阅读 · 0 评论 -
关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
<br />一、关于gcc、glibc和binutils模块之间的关系<br />1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。<br />2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信转载 2011-04-22 20:40:00 · 363 阅读 · 0 评论 -
GCC Spec修改N例
<br /><br />其实简单来说,gcc spec文件是用来控制gcc的默认行为的,一般被放在这个目录下可以找到这个文件:<br /># cd /x86toolchain/lib/gcc/i686-mot-linux-gnu/3.4.3<br /># ls specs<br /><br />也可以通过这个命令来打印gcc spec:<br /># gcc -dumpspecs<br /><br />如果希望使用自己的specs, 可以通过-specs参数来指定:<br /># g++ -O2 -spec转载 2011-04-22 21:17:00 · 1004 阅读 · 0 评论 -
用于非面向对象的共享对象!
<br />别紧张,共享对象与面向对象技术无关!我们现在讨论的是 Linux 平台上的动态链接库(类似于 Windows 中的 DLL)。在编码过程中的不同时期,我们都曾经使用过一些类型的库,以便调用其中的简单函数(如 C 语言的 printf() )或复杂函数(如 C++ 通用函数库中的 sort() )。库使每天的编程变得容易并使开发人员关注于手头的任务。想象一下,如果您所编写的每一段代码都必须编写 printf() 和文件 I/O 函数,那是多么繁琐的事! <br />几乎任何一个软件的构建都非常依赖转载 2011-04-25 19:57:00 · 338 阅读 · 0 评论 -
Linux 如何解决共享库的版本控制 (换句话说,soname不是真实存在的文件,只是在此库中和将来调用此库的文件中保存的一个名字,在加载是去找这个名字,使用时创建一个软连接来指向真实文件,这样真实文件的版本号就可以升级了)
Linux 系统,也同样面临和Window一样的问题,如何控制动态库的多个版本问题。Window之前没有处理好,为此专门有个名词来形容这个问题 “Dll hell”,其严重影响软件的升级和维护。 Dll hell 是指windows 上动态库新版本覆盖旧版本,但是却不兼容老版本。常常发生在程序升级之后,动态库更新,原有程序运行不起来;或者装新软件,但是已有的软件运行不起来。 同样Linux操作系统,也有同样的问题,那么它是怎么解决的呢?Linux 为解决这个问题,引入了一套机制,如果遵守这个机制来做,就转载 2011-04-25 20:29:00 · 3482 阅读 · 1 评论 -
改变gcc默认的include目录和link目录
About Specs file<br />The "gcc" program invoked by users is a convenient front-end driver executable which will invoke other programs in the background such as cc1, as or ld to do its work according to the command line parameter given. A specs file is plai转载 2011-04-22 21:10:00 · 1432 阅读 · 0 评论 -
gcc specs中的配置在没有外部specs文件的情况下采用built-in的,存在外部specs时采用外部的,当然需要放到dirname gcc -print-libgcc-file-name路径下去
Written by: Jonathan NormanDate: 3 June 2009If you are having problems adjusting the toolchain in chapter five then this hint should help solve it.Step 1:This command provides the path to libgcc.aType: gcc -print-libgcc-file-nameThi转载 2011-04-23 07:17:00 · 1269 阅读 · 0 评论 -
gcc选项
8、-C 选项在预处理的时候,不删除注释信息,一般和-E一起使用。有时候分析程序,比较方便。比如,加上注释的这段程序HelloWorld.c程序如下:#include // 我的HelloWorld程序int main(){ //打印输出字符串 printf("Hello,the world!\n"); re转载 2012-02-24 22:52:15 · 596 阅读 · 0 评论