【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | e

发布者:DazzlingSmile最新更新时间:2024-10-18 来源: cnblogs关键字:裸板调试  交叉工具链  Makefile  链接器脚本  eclipse  JLink  调试环境 手机看文章 扫描二维码
随时随地手机看文章



(2) arm-linux-readelf 解读 可执行程序需要的库文件



程序无法运行排错方法 : 

-- 运行平台不对 : ARM 平台 和 x86 平台之间的程序不能互相运行;

-- CPU 大小端不对 : 大端格式的程序不能运行在小端 CPU 上;

-- 库不对 : 使用 arm-linux-readelf -d hello-arm 查看程序运行需要的库, '0x00000001 (NEEDED)  Shared library: [libc.so.6]', 表示需要有libc.so.6 库;

[root@localhost 02_gcc_demo]# arm-linux-readelf -d hello-arm 

Dynamic section at offset 0x460 contains 24 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x8274
 0x0000000d (FINI)                       0x8428
 0x00000019 (INIT_ARRAY)                 0x10454
 0x0000001b (INIT_ARRAYSZ)               4 (bytes)
 0x0000001a (FINI_ARRAY)                 0x10458
 0x0000001c (FINI_ARRAYSZ)               4 (bytes)
 0x00000004 (HASH)                       0x8168
 0x00000005 (STRTAB)                     0x81e0
 0x00000006 (SYMTAB)                     0x8190
 0x0000000a (STRSZ)                      65 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x10548
 0x00000002 (PLTRELSZ)                   32 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8254
 0x00000011 (REL)                        0x824c
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x822c
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8222
 0x00000000 (NULL)                       0x0
[root@localhost 02_gcc_demo]#






4. 反汇编器(arm-linux-objdump)






(1) 反汇编


反汇编示例 : arm-linux-objdump -D -S hello-arm, 太多, 省略后面几百行;

[root@localhost 02_gcc_demo]# arm-linux-objdump -D -S hello-arm 

hello-arm:     file format elf32-littlearm

Disassembly of section .interp:

00008134 <.interp>:
    8134:	62696c2f 	rsbvs	r6, r9, #12032	; 0x2f00
    8138:	2d646c2f 	stclcs	12, cr6, [r4, #-188]!
    813c:	756e696c 	strbvc	r6, [lr, #-2412]!
    8140:	6f732e78 	svcvs	0x00732e78
    8144:	Address 0x00008144 is out of bounds.

Disassembly of section .note.ABI-tag:... ...





(2) 编译附加调试信息



带调试信息的反编译 : 

-- 交叉编译带调试信息 : arm-linux-gcc -g main.c 命令, 进行交叉编译, 结果 a.out;

-- 反编译 : arm-linux-objdump -S -D a.out 命令, 反编译结果 每行 C 代码都对应 汇编代码;

... ...

#include
int main(int argc, char** argv)
{
    837c:	e92d4800 	push	{fp, lr}
    8380:	e28db004 	add	fp, sp, #4	; 0x4
    8384:	e24dd008 	sub	sp, sp, #8	; 0x8
    8388:	e50b0008 	str	r0, [fp, #-8]
    838c:	e50b100c 	str	r1, [fp, #-12]
	printf('Hello World!n');
    8390:	e59f0014 	ldr	r0, [pc, #20]	; 83ac 
    8394:	ebffffc8 	bl	82bc <_init+0x48>
	return 0;
    8398:	e3a03000 	mov	r3, #0	; 0x0
}

... ...





5. 文件格式转换器(arm-linux-objcopy)






文件格式转换 : 

-- 转换原因 : elf 格式文件不能再 arm 处理器执行;

-- 转换命令 : 进入 led 目录, 继续上面的 led 编译, 链接 生成了 led.elf 文件, 执行 arm-linux-objcopy -O binary led.elf led.bin 命令, 将 elf 文件转换为 bin 文件;

-- 命令解析 : -O 表示输出格式, -O binary 表示输出二进制格式;






三. Makefile 文件




Makefile 示例 : 


all: led.o 
	arm-linux-ld -Tled.lds -o led.elf led.o
	arm-linux-objcopy -O binary led.elf led.bin
	
led.o : led.S
	arm-linux-gcc -g -o led.o -c led.S
	
.PHONY: clean
clean:
	rm *.o led.elf led.bin






1. Makefile 规则




(1) 普通规则




规则 : 用于说明文件生成过程;

-- 规则语法 : 

target(目标) : prerequisites(依赖)

    command(命令)

led.o : led.S
	arm-linux-gcc -g -o led.o -c led.S


-- 语法解析 : led.o 是目标, led.S 是依赖, arm-linux-gcc -g -o led.o -c led.S 是命令;



(2) 通用规则



通用规则示例 : 

%.o : %.c

    arm-linux-gcc -o %.o %.c

-- 解析 : 编译 main.c 生成 main.o;





2. Makefile 目标






(1) 伪目标



Makefile 中的伪目标示例 : 伪目标 只有命令, 没有依赖;

.PHONY: clean
clean:
	rm *.o led.elf led.bin

-- 伪目标标示 : '.PHONY: clean' 将 clean 声明为 伪目标;




(2) 最终目标




最终目标 : Makefile 默认执行 第一个目标, 第一个目标就是最终目标;




3. Makefile 变量





(1) 自定义变量



变量使用示例 : 

-- 使用标量前 : 

app1: app1.o func1.o func2.o
gcc app1.o func1.o func2.o -o app1
app2: app2.o func1.o func2.o
gcc app2.o func1.o func2.o -o app2

-- 定义变量 : obj=func1.o func2.o, 将该定义的变量应用于 Makefile;


obj=func1.o func2.o
app1: app1.o $(obj)
gcc app1.o $(obj) -o app1
app2: app2.o $(obj)
gcc app2.o $(obj) -o app2






(2) 系统定义变量



系统定义变量 : 

-- $^ : 代表依赖的文件;

-- $@ : 代表目标;

-- $< : 代表第一个依赖文件;

-- 使用系统变量前 : 

all: led.o 
	arm-linux-ld -Tled.lds -o led.elf led.o
	arm-linux-objcopy -O binary led.elf led.bin
	
led.o : led.S
	arm-linux-gcc -g -o led.o -c led.S
	
.PHONY: clean
clean:
	rm *.o led.elf led.bin

-- 使用系统变量后 : 


all: led.o 
	arm-linux-ld -Tled.lds -o led.elf $^
	arm-linux-objcopy -O binary led.elf led.bin
	
led.o : led.S
	arm-linux-gcc -g -o $@ -c $^
	
.PHONY: clean
clean:
	rm *.o led.elf led.bin

-- 编译运行 : 编译结果与 不使用系统变量时的规则相同;





4. Makefile 技巧





(1) Makefile 去回显



Makefile 去回显 : 

-- 回显 : 执行编译时, 会将命令打印到命令行中;


-- 去回显 : 在命令前添加 '@' 符号;

all: led.o 
	@arm-linux-ld -Tled.lds -o led.elf $^
	@arm-linux-objcopy -O binary led.elf led.bin
	
led.o : led.S
	arm-linux-gcc -g -o $@ -c $^
	
.PHONY: clean
clean:
	rm *.o led.elf led.bin

-- 执行结果 : 此时就没有上面两条显示了;




(2) Makefile 文件名称修改



Makefile 文件名称 : 

-- 默认名称 : make 工具默认寻找 'Makefile' 或者 'makefile' 文件, 如果没有回报错;


-- 指明 Makefile 文件 : make -f Makefile-ARM 命令;





四. 链接器脚本





1. 链接器脚本示例


可执行程序组成 : 代码段, 数据段, bss 段; 链接器脚本就是配置这些段信息;


简单的链接器脚本示例 : 

-- 代码段 : .text 表示代码段, * 表示所有文件, *(.text) 表示所有文件的代码;

-- 数据段 : .data 表示数据段, * 表示所有文件, *(.data) 表示所有文件的数据段;

[1] [2] [3] [4] [5]
关键字:裸板调试  交叉工具链  Makefile  链接器脚本  eclipse  JLink  调试环境 引用地址:【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | e

上一篇:【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
下一篇:Linux驱动——LED闪烁

推荐阅读最新更新时间:2026-02-26 05:42

Eclipse IDE环境下使用TRACE32调试工具
MCU/SoC系统开发 调试 工具厂商劳特巴赫技术有限公司(Lauterbach)提供的 TRACE32 调试和 跟踪 工具已经被广泛的应用在通信/家用电子, 汽车电子 , 医疗器械 及 工业控制 等高端市场的程序调试和跟踪领域,为无数的行业领导企业带来了巨大的便利和效益。而Eclips作为开放式的集成 开发环境 ( IDE ),因其可以集成许多免费或者廉价的插件资源而有效的完成研发任务,也日益被许多知名企业和工程师作为首选的开发环境。通过整合Lauterbach TRACE32开发工具(图1)和Eclips IDE,使得TRACE32调试工具的强大的功能与Eclips的易用性/完整性相结合,将给企业和工程师带来更大的便利和更高的效
[嵌入式]
[国嵌笔记][016][交叉工具]
交叉工具链 1.交叉工具是编译在arm平台上运行程序的工具,交叉工具链是交叉工具的集合 2.file filename 通过file命令可以查看程序运行的平台等相关信息 3.交叉开发 1.在x86平台上产生其他平台上运行程序的模式叫做交叉开发 2.宿主机是产生嵌入式软件的平台,目标机是运行嵌入式软件的平台 常用的交叉工具 1.交叉编译器 arm-linux-gcc 相同之处 arm-linux-gcc file.c -o file 与gcc用法上一样 不同之处 gcc从 /usr/include/ 下寻找头文件 arm-linux-gcc从 /usr/loacl/arm/.../lib 下寻找头文件
[单片机]
【ARM裸机s5pv210 】旧版本交叉编译工具配置
旧版本交叉编译工具链的安装 1.cd /usr/local/ mkdir arm tar -jxvf arm-2009q3.tar.bz2 cd /usr/local/arm/arm-2009q3/bin bash mk-arm-linux-.sh sudo gedit ~/.bashrc 添加 export PATH=/usr/local/arm/arm-2009q3/bin:$PATH source ~/.bashrc 2.安装32位库 sudo apt-get update apt-get update sudo apt-get install lib32ncurses5-dev 3./usr/local/arm/arm
[单片机]
ARM-LINUX-GCC交叉编译工具必知必会
一、一些需要知道的概念 在正式谈论交叉编译工具ARM-LINUX-GCC前,我想有必要明确两个非常基本的概念。 1、什么是交叉编译,什么是交叉编译工具链:https://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html#what_is_crosscompile,只需要关注此文章的第一章与第二章。2、GCC与ARM-LINUX-GCC的关系:GCC是一套编译工具链,一般来说,其用于将代码编译成在X86架构电脑上运行的可执行文件,而ARM-LINUX-GCC可以看成经过特殊配置的GCC,其编译出的程序并不是跑在X86架构电脑
[单片机]
ARM-LINUX-GCC<font color='red'>交叉</font>编译<font color='red'>工具</font><font color='red'>链</font>必知必会
S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具
1.为什么需要交叉编译工具 宿主机运行的是标准Linux操作系统,编译出的程序却需要在目标机的Linux上跑,这就叫交叉编译,编译器叫做交叉编译器。 之前我们已经使用过gcc编译Linux本地主机的程序(Linux C语言编程(上篇) | gcc的使用),而我们现在需要的这个编译器的目标系统是ARM,不运行操作系统,仅运行裸机程序,需要在Linux主机上编译出可以运行在S3C2440@ARM920T芯片上跑的程序,所以不能使用这个编译器,需要使用arm-linux-gcc交叉编译器。 2.arm-linux-gcc的安装 arm-linux-gcc是ARM官方基于Linux平台的arm编译器,其特点有: 开源免费 支持
[单片机]
S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc<font color='red'>交叉</font>编译<font color='red'>工具</font><font color='red'>链</font>
详细介绍构建ARM Linux的交叉编译工具
学习目标: ● 了解交叉编译工具链 ● 理解分步构建交叉编译工具链的方法 ● 学会使用Crosstool工具构建交叉编译工具链 2.1 交叉编译工具链介绍 读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程式,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程式,编译得到的程式在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。这种方法在异平台移植和嵌入式研发时非常有用。相对和交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得到的程式也是在本地执行。用来编译这种跨
[单片机]
使用Qt ARM交叉编译提示“此qt版本具有一个未知的工具
在工具- 选项- Qt4(高版本的Qt是“工具- 选项- 编译和运行- Qt4”)中,添加ARM版本的qmake时,提示“此qt版本具有一个未知的工具链” 我遇到了两个情况都提示这个。 第一种是由于QtCreator没有权限访问mkspecs路径导致的,qt-arm使用的默认路径/usr/local/Trolltech/QtEmbedded-4.7.3-arm ,默认用户没有访问mkspecs文件夹里的文件的权限。两种办法: 1.给当前用户访问权限 sudo chmod 775 mkspecs -R 注意,只给mkspecs/qws文件夹权限是不行的,因为里面的配置文件写了,还要访问common等文件夹,干脆都给了权限算了。
[单片机]
arm gcc交叉编译工具建立
1.1. Arm交叉编译工具链 下载地址Gnu.org binutils-2.21.1.tar.bz2 gcc-4.4.4.tar.bz2 glibc-2.11.2.tar.bz2 Glibc-ports-2.11.tar.bz2 Gmp-4.2.tar.bz2 Mpfr-2.4.0.tar.bz2 1.1.1. 建立工作目录 创建工具链文件夹: # mkdirembedded-toolchains 在建立了顶层文件夹embedded-toolchains,下面在此文件夹下建立如下几个目录: setup-dir,存放下载的压缩包; src-dir,存放binutils、gc
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved