热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

GCC的-g选项应该在编译阶段起作用

GCC的-g选项应该在编译阶段起作用--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
[table=95%][tr][td]编译过程:
源代码.c -->预处理(把头文件.h纳入,预处理之后生成的是.i文件) -->编译(检查正确后生成.s汇编代码文件) -->汇编处理(将编译阶段生成的.s文件转换成目标文件.o) -->链接(生成可执行文件)
[/td][/tr][/table]上面是GCC编译过程的分析。昨天练习建立多个文件的project,但是写好Makefile之后,使用GDB调试时发现问题,具体如下:
[table=95%][tr][td][armlinux@lqm The-C-Programming-Language]$ cd example3
[armlinux@lqm example3]$ ls
Makefile copy.o getline.c main.c zifu
copy.c gc.h getline.o main.o
[armlinux@lqm example3]$ gdb zifu
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) l
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S

[/td][/tr][/table]
也就是说无法list。原因是没有加入-g选项。原来的Makefile文件如下:
[table=95%][tr][td]CC = gcc

OBJS = main.o getline.o copy.o

zifu: $(OBJS)

$(CC) $^ -o $@

main.o:main.c gc.h

$(CC) -c $<

getline.o:getline.c

$(CC) -c $<

copy.o:copy.c

$(CC) -c $<

.PHONY:clean

clean:

rm -f $(OBJS) zifu


[/td][/tr][/table]那么-g选项具体加在那个过程呢?实际上,-g选项应该在编译阶段加入,在生成的汇编代码文件中就有了调试信息,否则就会出现start.S找不到的情况了。所以,修改了Makefile文件如下:

[table=95%][tr][td]CC = gcc

OBJS = main.o getline.o copy.o

zifu: $(OBJS)

$(CC) $^ -o $@

main.o:main.c gc.h

$(CC) -g -c $<

getline.o:getline.c

$(CC) -g -c $<

copy.o:copy.c

$(CC) -g -c $<

.PHONY:clean

clean:

rm -f $(OBJS) zifu


[/td][/tr][/table]然后就可以调试了,如下所示:

[table=95%][tr][td][armlinux@lqm example3]$ gdb zifu
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) l
9
10 /*print the longest input line*/
11 int main()
12 {
13 int len; /*current line length*/
14 int max; /*maximum length seen so far*/
15 char line[MAXLINE]; /*current input line*/
16 char longest[MAXLINE]; /*longest line saved here*/
17
18 max = 0

[/td][/tr][/table]----------------------------------------
附:实例源代码
[table=95%][tr][td][armlinux@lqm example3]$ tree
.
|-- Makefile
|-- copy.c
|-- gc.h
|-- getline.c
`-- main.c

0 directories, 5 files

[/td][/tr][/table]
[table=95%][tr][td]/*
*copy.c
*copy 'from' into 'to';assume to is big enough
*/


void copy(char to[],char from[])
{
int i;

i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}

[/td][/tr][/table]
[table=95%][tr][td]/*
*getline.c
*read a line into s,return length
*/


#include <stdio.h>

int getline(char s[],int lim)
{
int c,i;

for (i = 0 ; i < lim-1 && (c = getchar()) != EOF && c != '\n' ; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i]='\0';
return i;
}

[/td][/tr][/table]
[table=95%][tr][td]/*
*main.c
*/


#include <stdio.h>
#include "gc.h"

#define MAXLINE 1000 /*maximum input line length*/

/*print the longest input line*/
int main()
{
int len; /*current line length*/
int max; /*maximum length seen so far*/
char line[MAXLINE]; /*current input line*/
char longest[MAXLINE]; /*longest line saved here*/

max = 0;
while ((len = getline(line,MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest,line);
}
if (max > 0)
printf("%s",longest);
return(0);
}

[/td][/tr][/table]
[table=95%][tr][td]/*
*gc.h
*/
int getline(char [],int);
void copy(char [],char []);

[/td][/tr][/table]这个project很短小,但是也说明了如何建立多个源文件的project。其中,公用的宏定义、自定义的函数声明、自定义的结构体变量都放在自定义头文件里。事先要规划好程序结构!
推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
author-avatar
博菡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有