5.2嵌入式linux程序编译与调试

  1. 实验二 嵌入式linux程序编译与调试

  • 实验目的:
  1. 学会使用及配置vim
  2. 掌握gcc编译器使用
  3. 掌握使用Gdb单步调试程序的方法
  • 实验要求:
  1. 熟悉使用该节所介绍的vim创建、编辑、保存文件。
  2. 分别用gcc实现预处理、编译、汇编、链接四个过程;
  3. 使用gcc编译多文件工程,并制作编译脚本。
  4. 利用Gdb单步调试修正结果错误的程序
  • 实验步骤:
  1. 用gcc实现预处理、编译、汇编、链接四个过程,使用gcc编译多文件工程,并制作编译脚本。

    1、gcc处理编译的四个过程

    1. 、源代码


?

(2)、预处理


生成main.i预处理文件实现头文件、宏、预编译展开


?

(3)、编译


生成main.S汇编文件


(4)、汇编


最后调用as汇编器,从汇编文件生成main.o文二进制目标文件


?

(5)、链接


最后调用ld链接器,把目标文件链接成可执行文件


2、多文件工程编译

(1)、文件目录结构


自定义头文件放在inc目录内,辅助模块源文件放在src目录内

(2)、编译脚本


?

编译出带调试信息的可执行文件

(3)、执行编译

????

(4)、编译结果


运行调试通过后,可以strip掉多余的符号信息,进行发布


二、利用Gdb单步调试修正结果错误的程序

1、错误程序源码,


2、编译程序


3、运行程序


逆向字符串打印结果不能正常显示!

4、利用Gdb调试定位问题

(1)、启动gdb载入调试程序


???? (2)、断点到有问题的函数


?

???? (3)、执行程序,运行至断点处


?

???? (4)、显示问题函数代码


?

(5)、断点到问题产生点


?

(6)、继续执行,在问题产生点停下


?

(7)、显示问题变量


?

字符串逆向拷贝时数组位置向后多偏移了一位:


应该改为:


?

(7)、修改代码,程序编译运行验证


实验心得:

????该实验是实现嵌入式linux程序的简单编译和调试的实现,主要是让我们学会如何去调试,深刻体会程序执行的每一个步骤,理解程序运行的实际过程。

时间: 2024-08-02 08:31:13

5.2嵌入式linux程序编译与调试的相关文章

使用Qtcreator开发嵌入式linux程序

http://qt-project.org/doc/qtcreator-3.0/creator-project-cmake.html 方法1: 使用 qmake编辑  工程文件 xxxx.pro添加 equals (QT_ARCH, "arm")  {    target.path=/tmp/$${TARGET}/bin    INSTALLS += target } CONFIG(debug, debug|release) { message(this is debug versio

用VC6开发嵌入式LINUX程序

    首先说明一下,VC6自然不能直接开发LINUX程序,主要使用的是它的编辑环境而已,但是作为一个一直在WINDOWS上使用VC6的开发者,不以VC6作为开发的核心是多么地不习惯啊.     还要说明的是,自己对linux是门外汉,提到的linux的事情都是门外汉的看法,仅供参考.     2015年突然有点雄心壮志,准备把自己的车牌识别系列软件移植到LINUX系统中,这样可以固化在摄像头里面,也可以做成嵌入式的硬件.经过简单的考察,选择了INTEL公司的EDISON平台.优点是(1)体积小

三、Linux下编译与调试

gcc/g++编译器 对于.c格式的C文件,可以采用gcc或g++编译 对于 .cc..cpp格式的C++文件,应该采用g++进行编译 常用的选项: -c  表示编译源文件 -o  表示输出目标文件 -g  表示在目标文件中产生调试信息,用于gdb调试 -D<宏定义> 编译时将宏定义传入进去 -Wall  打开所有类型的警告. 1. gcc编译过程:预编译->编译->汇编->链接 当我们进行编译的时候,要使用一系列的工具,我们称之为工具链. 其中包括:预处理器,编译,汇编器a

linux c 编译与调试

c语言是跨平台的,但其在windows上编译的程序是不能够在linux平台上直接执行的,需要源代码在linux平台上重新编译. gcc在编译一个程序时,一般需要完成预处理(preprocessing).编译(compilation).汇编(assembly)和链接(linking)过程. 1.编译 gcc a.c          gcc a.c -o do 默认生成a.out可执行文件 2.给程序添加可执行权限 chmod +x a.out 3.执行程序 ./a.out 4.查看编译过程 参数

Linux 程序编译过程的来龙去脉

大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python.Ruby.MATLAB .JavaScript. 本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤: 预处理(Preprocessing) 编译(Compilati

linux程序编译过程

大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python.Ruby.MATLAB .JavaScript. 本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤: 预处理(Preprocessing) 编译(Compilati

【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 本课程重点是给大家讲解嵌入式linux系统移植的开发方法,采用理论与实践,硬件与软件相结合的方法. 1.在每节开始之前先简单回顾上一节所讲的主要内容,并对本节所讲的内容先进行概述,讲解概念.技术要点,设计实现思路等内容,最后总结本次课程的要掌握的要点. 2.在讲课的过程中对关键技术

第十章、嵌入式Linux的调试技术

通过对本章节的学习我学到了如下知识点: 嵌入式Linux调用技术 (1)调试方法:设置断点.逐步跟踪代码.输出调试信息. (2)打印内核调试信息:printk,printk函数运行在内核空间,printk函数运行在用户空间,Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息. Asmlinkage int printk(const char *fmt, …)第一个参数表示格式字符串,后面是可变参数. 虽然使用printk函数可以很方便的将纤细写入日志文件或控制台,但是大量

MAC使用IDA PRO远程调试LINUX程序

1 背景 在学习Linux系统上的一些漏洞知识的时候,往往需要进行“实地测试”,但是在Linux系统上进行调试并不太方便,因为LINUX自带的GDB调试工具真的不太人性化,即使有GDBTUI之类的“伪图形界面调试器”,也跟IDA PRO之类的调试器相差甚远.这里又遇到另一个问题了——LINUX平台的IDA PRO不太好找. 综上,对于初学者而言最佳方案就是使用IDA PRO的远程调试功能! 2 环境配置 本文主要说明在MAC系统上如何通过IDA PRO对linux程序进行远程调试(如果宿主机为W