Free xxx no cc needed

Rated 3.83/5 based on 508 customer reviews

Drive Digital Photography Get The Best Share Easily Non-Destructive Editing Advanced Black & White Develope Presets Facial Recognition Advanced Healing Brush Upright HDR Merge Pano Merge Performance Improvements Video Slideshow Web Galleries Show Sales Tax B&H only collects sales tax on orders shipped to addresses in the States of New York and New Jersey.You may be responsible for state and local sales/use taxes when filing your tax returns. Designed as a comprehensive solution for organizing, editing, and exporting photos, Photoshop Lightroom 6 from Adobe is an all-inclusive, non-destructive environment suitable for all aspects of post-production.So you must use a valid email to get the free porn no credit card deal.Without a valid email your free porn password will be lost.GNU-stack,"",@progbits (3)汇编阶段 汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。如下所示: [[email protected] Gcc]# Gcc –c hello.s –o hello.o (4)链接阶段 在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。 读者可以重新查看这个小程序,在这个程序中并没有定义”printf”的函数实现,且在预编译中包含进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为6的库文件中去了,在没有特别指定时,Gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到6库函数中去,这样就能实现函数”printf”了,而这也就是链接的作用。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的6就是动态库。Gcc在编译时默认使用动态库。 完成了链接之后,Gcc就可以生成可执行文件,如下所示。 [[email protected] Gcc]# Gcc hello.o –o hello 运行该可执行文件,出现正确的结果如下。 [[email protected] Gcc]# ./hello Hello! Gcc编译选项分析 Gcc有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。 (1)总体选项 Gcc的总结选项如表3.7所示,很多在前面的示例中已经有所涉及。 表3.7 Gcc总体选项列表 对于“-c”、“-E”、“-o”、“-S”选项在前一小节中已经讲解了其使用方法,在此主要讲解另外两个非常常用的库依赖选项“-I dir”和“-L dir”。 · “-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include · “-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可: [[email protected] Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接名为libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 表3.8 Gcc总体选项列表 void main() 这是一个很糟糕的程序,读者可以考虑一下有哪些问题? · “-ansi” 该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示: [[email protected] Gcc]# Gcc –ansi warning.c –o warning warning.c: 在函数“main”中: warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,该选项并没有发现”long long”这个无效数据类型的错误。 · “-pedantic” 允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示: [[email protected] Gcc]# Gcc –pedantic warning.c –o warning warning.c: 在函数“main”中: warning.c:5 警告:ISO C90不支持“long long” warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。 · “-Wall” 允许发出Gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示: [[email protected] Gcc]# Gcc –Wall warning.c –o warning warning.c:4 警告:“main”的返回类型不是“int” warning.c: 在函数”main”中: warning.c:7 警告:在无返回值的函数中,”return”带返回值 warning.c:5 警告:未使用的变量“tmp” 使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。 另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。 (3)优化选项 Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。 不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。 虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。 (4)体系结构相关选项 Gcc的体系结构相关选项如表3.9所示。 表3.9Gcc体系结构相关选项列表 这些体系结构相关选项在嵌入式的设计中会有较多的应用,读者需根据不同体系结构将对应的选项进行组合处理。在本书后面涉及到具体实例会有针对性的讲解。 Gdb调试器 调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好更快地定位程序中的问题从而加快程序开发的进度,是大家共同面对的。就如读者熟知的Windows下的一些调试工具,如VC自带的如设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢? 本文所介绍的Gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的VC工具等媲美。下面就请跟随笔者一步步学习Gdb调试器。 Gdb使用流程 首先,笔者给出了一个短小的程序,由此带领读者熟悉一下Gdb的使用流程。强烈建议读者能够实际动手操作。 首先,打开Linux下的编辑器Vi或者Emacs,编辑如下代码。(由于为了更好地熟悉Gdb的操作,笔者在此使用Vi编辑,希望读者能够参见3.3节中对Vi的介绍,并熟练使用Vi)。 #include int sum(int m); int main() int sum(int m) 在保存退出后首先使用Gcc对test.c进行编译,注意一定要加上选项”-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。 [[email protected] Gdb]# gcc -g test.c -o test 虽然这段程序没有错误,但调试完全正确的程序可以更加了解Gdb的使用流程。接下来就启动Gdb进行调试。注意,Gdb进行调试的是可执行文件,而不是如”.c”的源代码,因此,需要先通过Gcc编译生成可执行文件才能用Gdb进行调试。 [[email protected] Gdb]# gdb test GNU Gdb Red Hat Linux (6.3.0.0-1.21rh) Copyright 2004 Free Software Foundation, Inc. 要注意的是,在Gdb中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第五行之前暂停(并没有运行第五行)。 (3)查看断点情况 在设置完断点之后,用户可以键入”info b”来查看设置断点情况,在Gdb中可以设置多个断点。 (Gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0804846d in main at test.c:6 (4)运行代码 接下来就可运行代码了,Gdb默认从首行开始运行代码,可键入”r”(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。 (Gdb) r Starting program: /root/workplace/Gdb/test Reading symbols from shared object read from target memory..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. Loaded system supplied DSO at 0x5fb000 Breakpoint 1, main () at test.c:6 6 sum(50); 可以看到,程序运行到断点处就停止了。 (5)查看变量值 在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在Gdb中只需键入”p”+变量值即可,如下所示: (Gdb) p n

Drive Digital Photography Get The Best Share Easily Non-Destructive Editing Advanced Black & White Develope Presets Facial Recognition Advanced Healing Brush Upright HDR Merge Pano Merge Performance Improvements Video Slideshow Web Galleries Show Sales Tax B&H only collects sales tax on orders shipped to addresses in the States of New York and New Jersey.You may be responsible for state and local sales/use taxes when filing your tax returns. Designed as a comprehensive solution for organizing, editing, and exporting photos, Photoshop Lightroom 6 from Adobe is an all-inclusive, non-destructive environment suitable for all aspects of post-production.So you must use a valid email to get the free porn no credit card deal.Without a valid email your free porn password will be lost.GNU-stack,"",@progbits (3)汇编阶段 汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。如下所示: [[email protected] Gcc]# Gcc –c hello.s –o hello.o (4)链接阶段 在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。 读者可以重新查看这个小程序,在这个程序中并没有定义”printf”的函数实现,且在预编译中包含进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为6的库文件中去了,在没有特别指定时,Gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到6库函数中去,这样就能实现函数”printf”了,而这也就是链接的作用。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的6就是动态库。Gcc在编译时默认使用动态库。 完成了链接之后,Gcc就可以生成可执行文件,如下所示。 [[email protected] Gcc]# Gcc hello.o –o hello 运行该可执行文件,出现正确的结果如下。 [[email protected] Gcc]# ./hello Hello! Gcc编译选项分析 Gcc有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。 (1)总体选项 Gcc的总结选项如表3.7所示,很多在前面的示例中已经有所涉及。 表3.7 Gcc总体选项列表 对于“-c”、“-E”、“-o”、“-S”选项在前一小节中已经讲解了其使用方法,在此主要讲解另外两个非常常用的库依赖选项“-I dir”和“-L dir”。 · “-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include · “-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可: [[email protected] Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接名为libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 表3.8 Gcc总体选项列表 void main() 这是一个很糟糕的程序,读者可以考虑一下有哪些问题? · “-ansi” 该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示: [[email protected] Gcc]# Gcc –ansi warning.c –o warning warning.c: 在函数“main”中: warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,该选项并没有发现”long long”这个无效数据类型的错误。 · “-pedantic” 允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示: [[email protected] Gcc]# Gcc –pedantic warning.c –o warning warning.c: 在函数“main”中: warning.c:5 警告:ISO C90不支持“long long” warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。 · “-Wall” 允许发出Gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示: [[email protected] Gcc]# Gcc –Wall warning.c –o warning warning.c:4 警告:“main”的返回类型不是“int” warning.c: 在函数”main”中: warning.c:7 警告:在无返回值的函数中,”return”带返回值 warning.c:5 警告:未使用的变量“tmp” 使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。 另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。 (3)优化选项 Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。 不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。 虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。 (4)体系结构相关选项 Gcc的体系结构相关选项如表3.9所示。 表3.9Gcc体系结构相关选项列表 这些体系结构相关选项在嵌入式的设计中会有较多的应用,读者需根据不同体系结构将对应的选项进行组合处理。在本书后面涉及到具体实例会有针对性的讲解。 Gdb调试器 调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好更快地定位程序中的问题从而加快程序开发的进度,是大家共同面对的。就如读者熟知的Windows下的一些调试工具,如VC自带的如设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢? 本文所介绍的Gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的VC工具等媲美。下面就请跟随笔者一步步学习Gdb调试器。 Gdb使用流程 首先,笔者给出了一个短小的程序,由此带领读者熟悉一下Gdb的使用流程。强烈建议读者能够实际动手操作。 首先,打开Linux下的编辑器Vi或者Emacs,编辑如下代码。(由于为了更好地熟悉Gdb的操作,笔者在此使用Vi编辑,希望读者能够参见3.3节中对Vi的介绍,并熟练使用Vi)。 #include int sum(int m); int main() int sum(int m) 在保存退出后首先使用Gcc对test.c进行编译,注意一定要加上选项”-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。 [[email protected] Gdb]# gcc -g test.c -o test 虽然这段程序没有错误,但调试完全正确的程序可以更加了解Gdb的使用流程。接下来就启动Gdb进行调试。注意,Gdb进行调试的是可执行文件,而不是如”.c”的源代码,因此,需要先通过Gcc编译生成可执行文件才能用Gdb进行调试。 [[email protected] Gdb]# gdb test GNU Gdb Red Hat Linux (6.3.0.0-1.21rh) Copyright 2004 Free Software Foundation, Inc. 要注意的是,在Gdb中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第五行之前暂停(并没有运行第五行)。 (3)查看断点情况 在设置完断点之后,用户可以键入”info b”来查看设置断点情况,在Gdb中可以设置多个断点。 (Gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0804846d in main at test.c:6 (4)运行代码 接下来就可运行代码了,Gdb默认从首行开始运行代码,可键入”r”(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。 (Gdb) r Starting program: /root/workplace/Gdb/test Reading symbols from shared object read from target memory..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. Loaded system supplied DSO at 0x5fb000 Breakpoint 1, main () at test.c:6 6 sum(50); 可以看到,程序运行到断点处就停止了。 (5)查看变量值 在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在Gdb中只需键入”p”+变量值即可,如下所示: (Gdb) p n $1 = 0 (Gdb) p i $2 = 134518440 在此处,为什么变量”i”的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把”i”的数值赋为零,而只是一个随机的数字。但变量”n”是在第四行赋值的,故在此时已经为零。 Gdb基本命令 Gdb的命令可以通过查看help进行查找,由于Gdb的命令很多,因此Gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令。如下所示: (gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands …

||

Drive Digital Photography Get The Best Share Easily Non-Destructive Editing Advanced Black & White Develope Presets Facial Recognition Advanced Healing Brush Upright HDR Merge Pano Merge Performance Improvements Video Slideshow Web Galleries Show Sales Tax B&H only collects sales tax on orders shipped to addresses in the States of New York and New Jersey.

You may be responsible for state and local sales/use taxes when filing your tax returns. Designed as a comprehensive solution for organizing, editing, and exporting photos, Photoshop Lightroom 6 from Adobe is an all-inclusive, non-destructive environment suitable for all aspects of post-production.

So you must use a valid email to get the free porn no credit card deal.

Without a valid email your free porn password will be lost.

GNU-stack,"",@progbits (3)汇编阶段 汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。如下所示: [[email protected] Gcc]# Gcc –c hello.s –o hello.o (4)链接阶段 在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。 读者可以重新查看这个小程序,在这个程序中并没有定义”printf”的函数实现,且在预编译中包含进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为6的库文件中去了,在没有特别指定时,Gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到6库函数中去,这样就能实现函数”printf”了,而这也就是链接的作用。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的6就是动态库。Gcc在编译时默认使用动态库。 完成了链接之后,Gcc就可以生成可执行文件,如下所示。 [[email protected] Gcc]# Gcc hello.o –o hello 运行该可执行文件,出现正确的结果如下。 [[email protected] Gcc]# ./hello Hello! Gcc编译选项分析 Gcc有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。 (1)总体选项 Gcc的总结选项如表3.7所示,很多在前面的示例中已经有所涉及。 表3.7 Gcc总体选项列表 对于“-c”、“-E”、“-o”、“-S”选项在前一小节中已经讲解了其使用方法,在此主要讲解另外两个非常常用的库依赖选项“-I dir”和“-L dir”。 · “-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include · “-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可: [[email protected] Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接名为libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 表3.8 Gcc总体选项列表 void main() 这是一个很糟糕的程序,读者可以考虑一下有哪些问题? · “-ansi” 该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示: [[email protected] Gcc]# Gcc –ansi warning.c –o warning warning.c: 在函数“main”中: warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,该选项并没有发现”long long”这个无效数据类型的错误。 · “-pedantic” 允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示: [[email protected] Gcc]# Gcc –pedantic warning.c –o warning warning.c: 在函数“main”中: warning.c:5 警告:ISO C90不支持“long long” warning.c:7 警告:在无返回值的函数中,“return”带返回值 warning.c:4 警告:“main”的返回类型不是“int” 可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。 · “-Wall” 允许发出Gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示: [[email protected] Gcc]# Gcc –Wall warning.c –o warning warning.c:4 警告:“main”的返回类型不是“int” warning.c: 在函数”main”中: warning.c:7 警告:在无返回值的函数中,”return”带返回值 warning.c:5 警告:未使用的变量“tmp” 使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。 另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。 (3)优化选项 Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。 不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。 虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。 (4)体系结构相关选项 Gcc的体系结构相关选项如表3.9所示。 表3.9Gcc体系结构相关选项列表 这些体系结构相关选项在嵌入式的设计中会有较多的应用,读者需根据不同体系结构将对应的选项进行组合处理。在本书后面涉及到具体实例会有针对性的讲解。 Gdb调试器 调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好更快地定位程序中的问题从而加快程序开发的进度,是大家共同面对的。就如读者熟知的Windows下的一些调试工具,如VC自带的如设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢? 本文所介绍的Gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的VC工具等媲美。下面就请跟随笔者一步步学习Gdb调试器。 Gdb使用流程 首先,笔者给出了一个短小的程序,由此带领读者熟悉一下Gdb的使用流程。强烈建议读者能够实际动手操作。 首先,打开Linux下的编辑器Vi或者Emacs,编辑如下代码。(由于为了更好地熟悉Gdb的操作,笔者在此使用Vi编辑,希望读者能够参见3.3节中对Vi的介绍,并熟练使用Vi)。 #include int sum(int m); int main() int sum(int m) 在保存退出后首先使用Gcc对test.c进行编译,注意一定要加上选项”-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb无法载入该可执行文件。 [[email protected] Gdb]# gcc -g test.c -o test 虽然这段程序没有错误,但调试完全正确的程序可以更加了解Gdb的使用流程。接下来就启动Gdb进行调试。注意,Gdb进行调试的是可执行文件,而不是如”.c”的源代码,因此,需要先通过Gcc编译生成可执行文件才能用Gdb进行调试。 [[email protected] Gdb]# gdb test GNU Gdb Red Hat Linux (6.3.0.0-1.21rh) Copyright 2004 Free Software Foundation, Inc. 要注意的是,在Gdb中利用行号设置断点是指代码运行到对应行之前将其停止,如上例中,代码运行到第五行之前暂停(并没有运行第五行)。 (3)查看断点情况 在设置完断点之后,用户可以键入”info b”来查看设置断点情况,在Gdb中可以设置多个断点。 (Gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0804846d in main at test.c:6 (4)运行代码 接下来就可运行代码了,Gdb默认从首行开始运行代码,可键入”r”(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。 (Gdb) r Starting program: /root/workplace/Gdb/test Reading symbols from shared object read from target memory..

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. Loaded system supplied DSO at 0x5fb000 Breakpoint 1, main () at test.c:6 6 sum(50); 可以看到,程序运行到断点处就停止了。 (5)查看变量值 在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在Gdb中只需键入”p”+变量值即可,如下所示: (Gdb) p n $1 = 0 (Gdb) p i $2 = 134518440 在此处,为什么变量”i”的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把”i”的数值赋为零,而只是一个随机的数字。但变量”n”是在第四行赋值的,故在此时已经为零。 Gdb基本命令 Gdb的命令可以通过查看help进行查找,由于Gdb的命令很多,因此Gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令。如下所示: (gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands …

= 0 (Gdb) p i = 134518440 在此处,为什么变量”i”的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把”i”的数值赋为零,而只是一个随机的数字。但变量”n”是在第四行赋值的,故在此时已经为零。 Gdb基本命令 Gdb的命令可以通过查看help进行查找,由于Gdb的命令很多,因此Gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令。如下所示: (gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands …

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl , %esp andl $-16, %esp movl

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world! Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl , %esp andl $-16, %esp movl

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl , %esp andl $-16, %esp movl [[

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

||

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world! Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

]], �x addl , �x addl , �x shrl , �x sall , �x subl �x, %esp subl , %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl , %esp movl [[

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

||

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world! Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

]], �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

, �x addl , �x addl , �x shrl , �x sall , �x subl �x, %esp subl , %esp pushl $.# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl , %esp movl [[

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

||

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world! Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

]], �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

, �x addl , �x addl , �x shrl , �x sall , �x subl �x, %esp subl , %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl , %esp movl [[

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world!

Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.

To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.

# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

||

Command name abbre Viations are allowed if unambiguous. Tpo"; exit 1; fi Gcc -g -O2 -o hello hello.o 此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示: [[email protected] automake]# ./hello Hello! 2.make install 此时,会把该程序安装到系统目录中去,如下所示: [[email protected] automake]# make install if Gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="hello" -DVERSION="1.0" -I. ”。 (18)返回命令行模式。 (19)向下查找字符串“0:wait”。 (20)再向上查找字符串“halt”。 (21)强制退出Vi,不存盘。 分别指出每个命令处于何种模式下? 3.实验步骤 (1)mkdir /root/Vi (2)cd /root/Vi (3)cp /etc/inittab ./ (4)Vi ./inittab (5):set nu(底行模式) (6)17(命令行模式) (7)yy (8)G (9)p (10)u (11)$ (12)p (13)21G (14)dd (15):w(底行模式) (16)1G (17)i 并输入“Hello,this is Vi world! Live Free Fun performers broadcast video live from their homes to yours. It’s really simple, just click any of the porn niches you like, remember all these porn sites never ask for you credit cards.To get free porn with no credit card they ask for your email witch they will use to send a conformation link that requires you to be at lest 18 years of age.GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C 和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C 、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用Gcc版本为4.0.0。 GCC入门基础 表3.6 Gcc所支持后缀名解释 [[email protected] Gcc]# Gcc –E hello.c –o hello.i 在此处,选项”-o”是指目标文件,由表3.6可知,”.i”文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容: typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); … " .globl main main, @function main: pushl �p movl %esp, �p subl $8, %esp andl $-16, %esp movl $0, �x addl $15, �x addl $15, �x shrl $4, �x sall $4, �x subl �x, %esp subl $12, %esp pushl $.# 2 "hello.c" 2 int main() 由此可见,Gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。 (2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 [[email protected] Gcc]# Gcc –S hello.i –o hello.s 以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。 "hello.c" .section .rodata .align 4 . LC0 call puts addl $16, %esp movl $0, �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

]], �x leave ret main, .-main .ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)" .section This GDB was configured as "i386-redhat-linux-gnu"... Using host libthread_db library "/lib/libthread_1". (gdb) 可以看出,在Gdb的启动画面中指出了Gdb的版本号、使用的库文件等信息,接下来就进入了由“(gdb)”开头的命令行界面了。 (1)查看文件 在Gdb中键入”l”(list)就可以查看所载入的文件,如下所示: 2 int sum(int m); 3 int main() 4 14 int sum(int m) 15 可以看出,Gdb列出的源代码中明确地给出了对应的行号,这样就可以大大地方便代码的定位。 (2)设置断点 设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。 在Gdb中设置断点非常简单,只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示: (Gdb) b 6 Breakpoint 1 at 0x804846d: file test.c, line 6.

Leave a Reply