1. gcc编译过程一般分为那几个阶段?各阶段的主要工作是什么?
答:
(1)预处理阶段:读取C语言源文件,对其中以#开头的指令(伪指令)和特殊符号进行
(2)编译阶段:对预处理之后的输出文件进行词法分析和语法分析,在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或汇编代码。
(3)汇编过程:把汇编语言代码翻译成目标机器代码。
(4)连接阶段:将一个文件中引用的符号(如变量或函数调用)与该符号在另一个文件中的定义连接起来,从而使有关的目标文件连成一个整体,最终成为可被操作系统执行的可执行文件。
2. 对C语言程序进行编译时,针对以下情况应使用的编译命令行是什么?
(1)只生成目标文件,不进行连接。(2)在预处理后的输出中保留源文件中的注释。(3)将输出写到file指定的文件中。(4)指示编译程序在目标代码中加入供调试程序gdb使用的附加信息。(5)连接时搜索由library命名的库。
答:(1) -c
(2) -C
(3) -o file
(4) -g
(5) -llibrary
3. 通常,程序中的错误按性质分为哪三种?
答:
(1)编译错误,即语法错误。这是在编译阶段发生的错误,主要是程序代码中有不符合所用编程语言语法规则的错误。
(2)运行错误。这种错误在编译时发现不了,只在运行时才显现出来。
(3)逻辑错误。这种错误即使在运行时也不显示出来,程序能正常运行,但结果不对。
4. gdb主要帮助用户在调试程序时完成哪些工作?
答:(1)启动程序,按用户要求影响程序的运行行为。
(2)使运行程序在指定条件处停止。
(3)当程序停止时,检查它出现了什么问题。
(4)动态改变程序的执行环境,这样就可以先纠正一个错误,然后再纠正其他错误。
5. 调试下面的程序:
/badprog.c错误地访问内存/
#include
#include
int main(int argc,char **argv)
{
char *p;
int i;
p=malloc(30);
strcpy(p,”not 30 bytes”);
printf(“p=<%s>\n”,p);
if(argc==2){
if(strcmp(argv[1],”-b”)==0)
p[50]=’a’;
else if(strcmp(argv[1],”-f”)==0){
free§;
p[0]=’b’;
}
}
/free§;/
return 0;
}
答:
6. 调试下面的程序:
/callstk.c有3个函数调用深度的调用链/
#include
#include
int make_key(void);
int get_key_num(void);
int number(void);
int main(void)
{
int ret=make_key();
printf(“make_key returns %d\n”,ret);
exit(EXIT_SUCCESS);
}
int make_key (void)
{
int ret=get_key_num();
return ret;
}
int get_key_num(void)
{
int ret=number();
return ret;
}
int number(void)
{
return 10;
}
答:
7. GNU make的工作过程是怎样的?
答:
(1)依次读入各makefile文件;
(2)初始化文件中的变量;
(3)推导隐式规则,并分析所有规则;
(4)为所有的目标文件创建依赖关系链;
(5)根据依赖关系和时间数据,确定哪些目标文件要重新生成;
(6)执行相应的生成命令。
8. makefile的作用是什么?其书写规则是怎样的?
答:作用:定义了一系列规则,记录了文件之间的依赖关系及在此依赖关系基础上所应执行的命令序列,即定义了一系列规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等,此外,还可以有变量定义、注释等。
书写规则:有以下通用形式:
目标文件:[相依文件…]
<tab>命令1[#注释]
…
<tab>命令n[#注释]
在这种形式中,依赖行从一行的开头开始书写。如果依赖行中的目标文件或相依文件较多,在同一行写不下,此时可以用续行符“\”作为该行的结尾,而在下一行接着输入相应内容。各命令行单独占一行,每个命令行的第一个字符必须是制表符<tab>,而不能使用8个空格。#号后的内容为注释。
9. 设某个正在开发的程序由以下内容组成:
① 4 个C语言源文件:a.c,b.c,c.c和d.c。设b.c和d.c都使用了defs.h中的声明。
② 汇编语言源文件assmb.s被某个C语言源文件调用。
③ 使用了在/home/user/lib/libm.so中的一组例程。
设最后生成的可执行文件名为prog。试编写相应的makefile文件。
答:makefile文件如下:
prog:a.o b.o c.o d.o assmb.o
gcc a.o b.o c.o d.o assmb.o -L/home/user/lib -lm -o prog
a.o:a.c
gcc -c a.c
b.o:b.c defs.h
gcc -c b.c
c.o:c.c
gcc -c c.c
d.o:d.c defs.h
gcc -c d.c
assmb.o:assmb.s
as -o assmb.o assmb.s
clean:
rm prog *.o
需要课后文档下载的小伙伴
可以前往海轰的微信公众号:海轰Pro
回复:海轰
就可以啦