当前位置:文档之家› #GCC和Gdb

#GCC和Gdb

#GCC和Gdb
#GCC和Gdb

Linu系统编程实验二gccgdb的使用以及Makefile文件的编写

实验二:gcc、gdb、Makefile的使用 实验目的: (一)学会使用gcc编译器 (二)学会gdb调试器的使用 (三)学会编写Makefile 实验要求: (一)编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项(二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令 (三)实现一应用程序,该程序有两个c文件构成,使用makefile来完成对该程序的编译实验器材: 软件:安装了Linux的vmware虚拟机 硬件:PC机一台 实验步骤: (一)gcc编译器 1、先用vi编辑文件,内容如下: 2、gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件] 例:使用gcc编译命令,编译生成可执行文件hello,并运行hello 上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、-E选项的作用:只进行预处理,不做其他处理。 例:只对文件进行预处理,生成文件,并查看 通过查看可以看到头文件包含部分代码#include <>经过预处理阶段之后,编译器已将的内容贴了进来。 4、-S选项的使用 -S选项的作用:只是编译不汇编,生成汇编代码

例:将文件只进行编译而不进行汇编,生成汇编代码 5、-c选项的使用 -c选项的作用:只是编译不连接,生成目标文件.o 例:将汇编代码只编译不链接成文件 6、将编译好的链接库,生成可执行文件hello 7、-static选项的使用 -static选项的作用:链接静态库 例:比较连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小 可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的 8、-g选项的使用 -g选项的作用:在可执行程序中包含标准调试信息 例:将编译成包含标准调试信息的可执行文件hello2

GDB基本使用方法

GDB基本使用方法 GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等 首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 启动GDB 直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息 加载可执行文件启动 gdb executable-file set args 参数列表 以上两步等同于 gdb –args executable-file 参数列表 run或者start都可以启动调试 多用于调试启动阶段就异常的程序 调试正在运行的程序 以下三种形式都可以attach到正在运行的程序上调试 ps -ef | grep http www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd gdb attach 24470 gdb --pid 24470 gdb -p 24470 设置断点 break -- Set breakpoint at specified line or function b func1 break func1 设置在func1处 b file:line 设置在文件的第几行处 b *0x指令地址设置在具体的某条汇编指令处 设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息 打印调用栈 backtrace bt 如果你要查看栈下面层的详细信息 frame 栈中的层编号 查看所有断点 info break 删除断点 delete 断点号 如果不加断点号为删除全部断点 禁用断点 disable 断点号 启用断点

Linu系统编程实验gccgdb的使用以及Makefile文件的编写

实验二:gcc 、gdb 、Makefile 的使用 实验目的: (一) 学会使用gcc 编译器 (二) 学会gdb 调试器的使用 (三) 学会编写 Makefile 实验要求: (一) 编写一应用程序,使用 gcc 进行编译,并分别使用-o ,-g ,-static ,-02等选项 (二) 编写一应用程序,使用 gdb 调试,调试中使用到该小节所介绍的所 有命令 (三) 实现一应用程序,该程序有两个 c 文件构成,使用 makefile 来完成对该程序的编译 实验器材: 软件:安装了 Linux 的vmware 虚拟机 硬件:PC 机一台 实验步骤: (一) gcc 编译器 1先用vi 编辑hello.c 文件,内容如下: #include int main(void) { priritf("hello world\n"); return 0; } 2、gcc 指令的一般格式为:gcc [选项]要编译的文件[选项][目标文件] 例:使用gcc 编译命令,编译 hello.c 生成可执行文件 hello ,并运行hello gcc]# vi hello ? c gcc]# gcc hello.c -o hello gcc]# ./hello 上面的命令一步由.c 文件生成了可执行文件,将 gcc 的四个编译 流程:预处理、编译、 汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、 -E 选项的作用:只进行预处理,不做其他处理。 例:只对hello.c 文件进行预处理,生成文件 hello.i ,并查看 [root@locdlhost gcc ]# gcc -E hello ?匚-o hello * i [root (alocalhost gcc ]# Is hello hel lo.c: hel lo.i 通过查看可以看到头文件包含部分代码 #include 经过预处理阶段之后,编译 器已将stdio.h 的内容贴了进来。 4、 -S 选项的使用 -S 选项的作用:只是编译不汇编,生成汇编代码 [root@localhost [root@localhost [root@localho5t hello world [rootglocalhost gcc]#

linuxvimgccgdb开发cc程序环境搭建

linux+vim+gcc+gdb开发C/C++程序环境搭建 我用的是ubuntu操作系统。打开终端 1.sudo apt-get install vim(vim-full 这个软件自9.10版本被废弃了,不论怎么添加软件源都找不到的,所以直接安装vim就可以了,,也可以安装gvim,,在新立得软件里面搜索vim 就可以找到了) 2.sudo apt-get install build-essential // build-essential是c语言的开发包,包含了gcc make gdb和libc函数库很多工具。 或者sudo apt-get install gcc + sudo apt-get install gdb 网上有很多版本说要编译安装,这个可能挺复杂的,而且花的时间也不少(没试过阿),,不想在命令行中安装的化,可以下载rpm包直接点击安装, 3.gcc只是一个编译器,vim是编辑器(也可以用gedit编辑源代码),gdb是调试器,, 可以新建一个test.c的helloworld文件测试以下 4.一般c程序就用gcc编译,c++程序就用g++编译

[介绍] ----------------------------------------- 常见用法: GCC 选项 GCC 有超过100个的编译选项可用。这些选项中的许多你可能永远都不会用到,但一些主要的选项将会频繁用到。很多的GCC 选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符,并且就象大多数Linux 命令一样你不能在一个单独的连字符后跟一组选项。例如,下面的两个命令是不同的: gcc -p -g test.c gcc -pg test.c 第一条命令告诉GCC 编译test.c 时为prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里。第二条命令只告诉GCC 为gprof 命令建立剖析信息。 当你不用任何选项编译一个程序时,GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件。例如,下面的命令将在当前目录下产生一个叫 a.out 的文件: gcc test.c 你能用-o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。例如,将一个叫count.c 的 C 程序编译为名叫count 的可执行文件,你将输入下面的命令: gcc -o count count.c 注意: 当你使用-o 选项时, -o 后面必须跟一个文件名。 -c 只编译并生成目标文件。 -------------------------------------------------------------------------------- gcc and g++分别是gnu的c & c++编译器gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解]

实验一LinuxC编程工具GCC和GDB

淮海工学院计算机工程学 实验报告书 评语: 成绩:指导教师: 批阅时间:年月

实验目的与要求 1. 掌握Linux C 开发过程中的基本概念; 2. 掌握如GCC GDB等开发工具的使用。 二、实验内容 1. 将参考代码录入到文件中,编译执行后发现结果与预期不一致,请使用GDE调试, 完成字符串反序输出功能。 三、参考源代码 #include <> #include <> #include <> int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) { char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1. 编辑源代码 mkdir test1 cd test1 gedit (1) 使用gedit 编辑器,建议课外学习vim; (2) 分析代码中语句功能。 步骤 2. 编译源代码

Ubuntu下Vim GCC GDB安装及使用

Ubuntu下Vim+GCC+GDB安装及使用 一)安装 vim)打开命令行运行sudo apt-get install vim,并按提示输入管理员密码。 gcc+gdb)输入命令行运行 sudo apt-get install build-essential build-essential包含gcc和gdb等工具,是C语言的开发包。 安装完了可以执行 gcc --version 的命令来查看版本,输出如下: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 则表明安装好了。 二)常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test

gcc-gdb-make操作简介

gcc-gdb-make操作简介 1. 编译工具gcc使用方法和常用选项说明 (2) 简介 (2) 实例1 (2) 实例2 (5) 2. 调试工具gdb使用方法和常用命令说明 (7) 简介 (7) 实例 (8) 3. 维护工具make使用方法说明 (10) 简介 (10) 实例 (10) 说明: 本文档结合实例说明了gcc、gdb、make工具基本用法。

1. 编译工具gcc使用方法和常用选项说明 简介 gcc,全称GNU Compiler Collection,是目前Linux平台上最常用的C语言编译系统,符合ANSI C标准。因为开源,随着不断完善,它能够编译用C、C++和Objective-C等语言编写的程序。 当调用gcc时,通常情况下会完成整个过程(预处理→编译→汇编→链接)。但是,可以通过使用gcc的命令选项,使其处理过程只进行到某个中间环节。 下表列出了gcc常用选项的格式及功能。 实例1 (以hello.c程序的编辑、编译为例) 第1步,为了便于观察实验结果,在用户主目录下创建子目录TEST,然后进入子目录。 第2步,使用vi/vim/gedit编写一个简单的c程序hello.c

第3步,使用gcc工具进行编译。 ①不带任何选项 gcc hello.c表示一次性完成对源程序的编译、连接过程,并生成可执行文件,默认为a.out。 ./a.out表示执行当前路径下的可执行文件a.out。 ②使用选项-o gcc hello.c–o hello表示对hello.c进行编译、连接,并指定输出的可执行文件名为hello。 ./hello表示执行当前路径下的可执行文件hello。 ③使用选项-c gcc hello.c –c表示对hello.c进行编译,但不进行连接。生成目标文件为hello.o。用ls可以查看。 继续对目标文件进行连接,并指定生成的可执行文件名为hello. gcc hello.o–o hello表示对目标文件hello.o进行连接,生成可执行文件hello。 ④使用选项-I 为了说明选项-I的用途,先做如下准备工作: a) 返回TEST目录的上级目录,然后使用vi/vim/gedit编辑器或gedit编写头文件t1.h

linux、GCC、GDB学习总结

1 虚拟机VMware6.5、RedHat安装及Linux基本命令 1.1 GCC、GDB的安装 虚拟将上安装RedHat后,在Linux环境下编辑和编译C\C++需要GCC、GDB编译,调试,Linux环境下输入gcc -v于gdb –v可以查看所装系统是否装有gcc与gdb。如果没有显示其所装版本,可以在Redhat 的RPMs包中找到相应版本的gcc与gdb的rmp安装文件。具体方法是vm->Removable Devices->CD\DVD->Connect. 把RedHat的镜像文件添加到use iso image file:下,点击OK,在VMware界面上出现以个光盘的标志双击后RedHat->RAMPS,选择要安装的GCC、与GDB文件。 注:不能直接用GCC变异C++文件,最好使用G++编译。

1.2 Linux基本命令 Linux常用命令全集:https://www.doczj.com/doc/646029725.html,/special/linuxcom/ 2 GCC、GDB的使用及基本指令 2.1 Linux环境下vi编辑器的基本使用方法 VMware界面上右键->open terminal 界面中输入vi 回车([jkl@localhost ~]$ vi) 在vi编辑器下输入要编辑的程序: #include int wib(int no1, int no2) { int result, diff; diff = no1 - no2; result = no1 / diff; return result; } int main(int argc, char *argv[]) { int value, div, result, i, total; value = 10; div = 6; total = 0; for(i = 0; i < 10; i++) { result = wib(value, div); total += result; div++; value--; } printf("%d wibed by %d equals %d\n", value, div, total); return 0; vi环境下输入模式与指令模式的切换键是Esc,当左下角出现--INSERT--时可以对程序进行编辑。按下Esc后,可以输入vi指令,会在窗口最下一行显示,

gcc调试总结

使用GCC编译与GDB调试 一:VMwareTools安装过程 1.sudo apt-get update 2.sudo apt-get dist-upgrade 3. 3.sudo apt-get install build-essential 4.sudo apt-get install linux-headers-3.0.0-29-generic-pae 5.Ubuntu与windows间的文件共享 (选择VM中设置,选项,共享文件夹,添加路径,如果不能在Ubuntu下的 /mnt/hgfs下找到共享文件夹还需安装 Sudo apt-get instatll open-vm-dkms Sudo mount -t vmhgfs .host:/ /mnt/hgfs 二:C 编程中相关文件后缀 .a 静态库(archive) .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码(不需编译预处理) .o 对象文件 .s 汇编语言代码 .so 动态库 三:Gcc的执行过程 gcc and g++分别是gnu的c & c++编译器gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] 四. 常用编译命令选项 假设源程序文件名为test.c。 1.无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。 -o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项-c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。 7. 选项-O 用法:#gcc -O1 test.c -o test 作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。 五. 多源文件的编译方法

用GDB调试程序--调试器GDB常用功能

一,GDB调试器简介 GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。Linux下的调试器主要有gdb、cgdb、ddd、eclipse。GDB调试器的运行速度快、能够进行源代码同步显示。 使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。 二,GDB常用调试命令 a)调试可执行文件 以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。 gdb调试源代码流程: 1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test 3,list查看源代码 4,设定断点breakpoint main breakpoint sub 上述分别在main函数和sub函数处设定了断点。 断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。 5,运行可执行文件: run 6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。 7,使用s 或者n进行单步调试。 s即step,n即next都是执行一条语句,然后停下来。 如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。 8,bt命令查看当前的调用栈,bt即backtrace。 9,info frame查看函数帧信息。 10,frame n 进入某个函数帧(编号为n) 11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。 info register;info local;info args。 12,disassemble对当前函数对应的二进制进行反汇编。 13,x/nfu address 查看内存其中address是内存开始的地址,从该地址向高地址增加, x是examinate的缩写,n表示重复次数,f表示输出格式,u表示内存大小的单位(默认是字,即4个字节)。 一般我都用x/nx address,即打印n个从address开始的内存,每个是4字节,以十六进制打印。14,continue,执行至该函数退出 15,info threads,显示当前可调试的所有线程 16,thread ,切换当前调试的线程为指定ID的线程break File:LineNumber thread if x==y。 17,thread apply command让一个/多个/所有线程执行GDB的命令command。

linux软件开发之GCC,GDB用法篇

(转贴)linux 下的软件开发之GCC,GDB用法篇 -|tinylee 发表于 2005-8-22 1:02:00 在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。 开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段: ◆ 预处理(Pre-Processing) ◆ 编译(Compiling) ◆ 汇编(Assembling) ◆ 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,GCC 还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。 GCC起步 在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码: 清单1:hello.c #i nclude int main(void) { printf ("Hello world, Linux programming!n"); return 0; } 然后执行下面的命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming! 从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#i nclude”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。 为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:# gcc -E hello.c -o hello.i 此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:

实验一linuxc编程工具gcc和gdb

淮海工学院计算机工程学院 实验报告书 课程名:《Linux程序设计》 题目:实验一 Linux C编程工具:GCC和GDB 班级:软件131 学号: 2013122870 姓名:王裕 评语: 成绩:指导教师: 批阅时间:年月日

一、实验目的与要求 1.掌握Linux C开发过程中的基本概念; 2.掌握如GCC,GDB等开发工具的使用。 二、实验内容 1.将参考代码录入到test1.c文件中,编译执行后发现结果与预期不一致,请使用GDB 调试,完成字符串反序输出功能。 三、参考源代码 #include #include #include int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) {

char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1. 编辑源代码test1.c mkdir test1 cd test1

Linu系统编程实验gccgdb的使用以及Makefile文件的编写

L i n u系统编程实验 g c c g d b的使用以及 M a k e f i l e文件的编写 The latest revision on November 22, 2020

实验二:gcc、gdb、Makefile的使用 实验目的: (一)学会使用gcc编译器 (二)学会gdb调试器的使用 (三)学会编写Makefile 实验要求: (一)编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项 (二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令 (三)实现一应用程序,该程序有两个c文件构成,使用makefile来完成对该程序的编译 实验器材: 软件:安装了Linux的vmware虚拟机 硬件:PC机一台 实验步骤: (一)gcc编译器 1、先用vi编辑文件,内容如下: 2、gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件] 例:使用gcc编译命令,编译生成可执行文件hello,并运行hello 上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作3、-E选项的作用:只进行预处理,不做其他处理。 例:只对文件进行预处理,生成文件,并查看

通过查看可以看到头文件包含部分代码#include <>经过预处理阶段之后,编译器已将的内容贴了进来。 4、-S选项的使用 -S选项的作用:只是编译不汇编,生成汇编代码 例:将文件只进行编译而不进行汇编,生成汇编代码 5、-c选项的使用 -c选项的作用:只是编译不连接,生成目标文件.o 例:将汇编代码只编译不链接成文件 6、将编译好的链接库,生成可执行文件hello 7、-static选项的使用 -static选项的作用:链接静态库 例:比较连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小 可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的 8、-g选项的使用 -g选项的作用:在可执行程序中包含标准调试信息

GCC使用教程

GCC使用教程

GCC使用教程 目录 gcc 1makefile写法 1gcc_egcs使用 1gdb使用 gcc常用选项对代码的影响 1一般情况 1-O 编译选项 1-O2 编译选项 1-fomit-frame-pointer 编译选项 1-fomit-frame-pointer && -O2 1-fPIC 编译选项 1-static 编译选项 1AT&T的汇编格式 x86内联汇编 1简述 1内联汇编 1程序模板 1操作数

1修饰寄存器列表 1操作数约束 示例 1寄存器约束 1匹配约束 1内存操作数约束 1修饰寄存器 1不同的CPU下最佳编译参数代码维护 1简单cvs 1automake 1diff 1rcs 1内核重编译常见故障 1cvs 1共享库工具 1代码优化 1GNU 编码标准 1书籍 gcc

makefile写法 蓝森林https://www.doczj.com/doc/646029725.html, 2001年3月22日08:44 作者:许明彦 Abstract: 在Unix 上写程式的人大概都碰过Makefile,尤其是用 C 来开发程式的人。用make来开发和编译程式的确很方便,可是要写出一个Makefile就不简单了。偏偏介绍Makefile 的文件不多,GNU Make 那份印出来要几百页的文件,光看完Overview 就快阵亡了,难怪许多 人闻Unix 色变。 本文将介绍如何利用GNU Autoconf 及Automake 这两套软体来协助我们『自动』产生Makefile 档,并且让开发出来的软体可以像

Apache, MySQL 和常见的GNU 软体一样,只要会``./configure'', ``make'', ``make install'' 就可以把程式安装到系统中。如果您有 心开发Open Source 的软体,或只是想在Unix 系统下写写程式。希望这份介绍文件能帮助您轻松地进入Unix Programming 的殿堂。 1. 简介 Makefile 基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。而make 就会根据Makefile 的规则来决定如何编译(compile) 和连结(link) 程式。实际上,make 可做的不只是编译和连结程式,例如FreeBSD 的port collect ion 中,Makefile 还可以做到自动下载原始程式套件,解压缩(extract) ,修补(patch),设定,然後编译,安装至系统中。 Makefile 基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。却也因此,许多刚开始学习写Makefile 时会感到没有规范可循,每个人写出来的Makefile 长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路

LINUX平台可以用GDB进行反汇编和调试。

L INUX平台可以用GDB进行反汇编和调试。 如果在Linux平台可以用gdb进行反汇编和调试。(转) 2. 最简C代码分析 为简化问题,来分析一下最简的c代码生成的汇编代码: # vi t est1.c int main() { return 0; } 编译该程序,产生二进制文件: # gcc test1.c -o test1 # file test1 test1: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped test1是一个ELF格式32位小端(Little Endian)的可执行文件,动态链接并且符号表没有去除。 这正是Unix/Linux平台典型的可执行文件格式。 用mdb反汇编可以观察生成的汇编代码: # mdb test1 Loading modules: [ libc.so.1 ] > main::dis ; 反汇编main函数,mdb的命令一般格式为<地址>::dis main: pushl %ebp ; ebp寄存器内容压栈,即保存main函数的上级调用函数的栈基地址 main+1: movl %esp,%ebp ; esp值赋给ebp,设置main函数的栈基址 main+3: subl $8,%esp main+6: andl $0xf0,%esp main+9: movl $0,%eax main+0xe: subl %eax,%esp main+0x10: movl $0,%eax ; 设置函数返回值0 main+0x15: leave ; 将ebp值赋给esp,pop先前栈内的上级函数栈的基地址给ebp,恢复原栈基址 main+0x16: ret ; main函数返回,回到上级调用 > 注:这里得到的汇编语言语法格式与Intel的手册有很大不同,Unix/Linux采用AT&T汇编格式作为汇编语言的语法格式 如果想了解AT&T汇编可以参考文章:Linux AT&T 汇编语言开发指南 问题:谁调用了main函数? 在C语言的层面来看,main函数是一个程序的起始入口点,而实际上,ELF可执行文件的入口点并不是main而是_start。 mdb也可以反汇编_start:

Linux如何使用gdb

Linux 下C 语言编程如何使用gdb 使用GCC GCC 选项GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的: gcc -p -g test.c gcc -pg test.c 第一条命令告诉GCC 编译test.c 时为prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉GCC 为gprof 命令建立剖析信息. 注意:当你使用-o 选项时, -o 后面必须跟一个文件名. GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个C 程序时速度更快并且更易于管理. 缺省时GCC 建立的目标代码文件有一个 .o 的扩展名. -S 编译选项告诉GCC 在为C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里. 优化选项当你用GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和-O2 选项. -O 选项告诉GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用-O 时慢. 但通常产生的代码执行速度会更快. 除了-O 和-O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考GCC 的指南页, 在命令行上键入man gcc . 调试和剖析选项GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是-g 和-pg 选项. -g 选项告诉GCC 产生能被GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他C 编译器里没有的特性, 在GCC 里你能使-g 和-O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被GCC 作了改动. 关于调试C 程序的更多信息请看下一节"用gdb 调试 C 程序" . -pg 选项告诉GCC 在你的程序里加入额外的代码, 执行时, 产生gprof 用的剖析信息以显示你的程序的耗时情况. 关于gprof 的更多信息请参考"gprof" 一节. 用gdb 调试GCC 程序Linux 包含了一个叫gdb 的GNU 调试程序. gdb 是一个用来调试 C 和C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部

实验一-LinuxC编程工具GCC和GDB

淮海工学院计算机工程学院实验报告书 课程名:《Linux程序设计》 题目:实验一 Linux C编程工具:GCC和GDB 班级:软件131 学号:2013122870 姓名:王裕 评语: 成绩:指导教师: 批阅时间:年月日

一、实验目的与要求 1.掌握Linux C开发过程中的基本概念; 2.掌握如GCC,GDB等开发工具的使用。 二、实验内容 1.将参考代码录入到test1.c文件中,编译执行后发现结果与预期不一致,请使用GDB 调试,完成字符串反序输出功能。 三、参考源代码 #include #include #include int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) { char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1.编辑源代码test1.c mkdir test1 cd test1

gcc编译程序与gdb调试程序 (2)

嵌入式原理与应用实验实验五gcc编译程序与gdb调试程序 学号 姓名 班级 华侨大学电子工程系

实验五gcc编译程序与gdb调试程序 一、实验目的 1.通过几种不同需求的程序,掌握使用gcc的各种选项编译程序。 2.通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握 gcc编译命令及gdb 的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。 二、实验内容: 1、学习使用gcc的各种选项编译程序。 (1)编译和运行这段程序 hello.c: #include int main(void) { printf (“Hello world!\n”); return 0; }

(2)创建静态库,并运行程序 /* pow_test.c */ #include #include int main(int argc, char *argv[]) { unsigned int x, y; unsigned long long res; if ((argc < 3) || (sscanf(argv[1], "%u", &x) != 1) || (sscanf(argv[2], "%u", &y)) != 1) { printf("Usage: pow base exponent\n"); exit(1); } res = unsgn_pow(x, y); printf("%u ^ %u = %u\n", x, y, res); exit(0); } /* unsgn_pow.c:库程序 */ unsigned long long unsgn_pow(unsigned int x, unsigned int y) { unsigned long long res = 1; if (y == 0) { res = 1; } else if (y == 1)

相关主题
文本预览
相关文档 最新文档