1.2交叉工具链

什么事交叉工具链

交叉工具的集合

交叉工具

创建hello.c

#include<stdio.h>

Int main()

{

????Printf("hello wworld\n");

????return 0;

}

[[email protected] ~]# cd /home/S3-ARM/Part1/lesson2

[[email protected] lesson2]# ls

hello hello.c

[[email protected] lesson2]# gcc hello.c -o hello

[[email protected] lesson2]# ./hello

hello world

在te6410上

[[email protected]]# cd udisk

[[email protected]]# ls

hello type

[[email protected]]# ./hello

./hello: line 1: syntax error: "(" unexpected

用交叉编译

[[email protected] lesson2]# arm-linux-gcc -static hello.c -o hello-arm

[[email protected] lesson2]# arm-linux-gcc -static hello.c -o hello-arm

PC上运行

[[email protected] lesson2]# ./hello-arm

-bash: ./hello-arm: cannot execute binary file

Te6410运行

[[email protected]]# cd udisk/

[[email protected]]# ls

hello hello-arm type

[[email protected]]# ./hello-arm

hello world

实质在不同环境运行

[[email protected] lesson2]# mv hello hello-x86

[[email protected] lesson2]# file hello-arm

hello-arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, not stripped

[[email protected] lesson2]# file hello-x86

hello-x86: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

交叉开发

交叉工具链

[[email protected] lesson2]# ls /usr/local/arm/4.3.2/bin

arm-linux-addr2line arm-linux-objdump arm-none-linux-gnueabi-gcov

arm-linux-ar arm-linux-ranlib arm-none-linux-gnueabi-gdb

arm-linux-as arm-linux-readelf arm-none-linux-gnueabi-gdbtui

arm-linux-c++ arm-linux-size arm-none-linux-gnueabi-gprof

arm-linux-c++filt arm-linux-sprite arm-none-linux-gnueabi-ld

arm-linux-cpp arm-linux-strings arm-none-linux-gnueabi-nm

arm-linux-g++ arm-linux-strip arm-none-linux-gnueabi-objcopy

arm-linux-gcc arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-objdump

arm-linux-gcc-4.3.2 arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-ranlib

arm-linux-gcov arm-none-linux-gnueabi-as arm-none-linux-gnueabi-readelf

arm-linux-gdb arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-size

arm-linux-gdbtui arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-sprite

arm-linux-gprof arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-strings

arm-linux-ld arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-strip

arm-linux-nm arm-none-linux-gnueabi-gcc

arm-linux-objcopy arm-none-linux-gnueabi-gcc-4.3.2

常用交叉工具

1 . arm-linux-gcc 运用在arm品台的编译器

与gcc 寻找头文件位置不样

Gcc 在 /usr/include下

[[email protected] lesson2]# ls /usr/include/stdio.h

/usr/include/stdio.h

Arm-linux-gcc 在

[[email protected] lesson2]# arm-linux-gcc -print-search-dirs

install: /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/

programs: =/usr/local/arm/4.3.2/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../libexec/gcc/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/

libraries: =/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/

2. arm-linux-ld 连接器

ARM-tools hello led.bin led.lds led.S

ARM-Tools.tar.gz hello.c led.elf led.o Makefile

[[email protected] lesson1]# arm-linux-gcc -g -c led.S

[[email protected] lesson1]# ls

ARM-tools hello led.bin led.lds led.S

ARM-Tools.tar.gz hello.c led.elf led.o Makefile

[[email protected] lesson1]# arm-linux-ld -Tled.lds -o led.elf led.o

[[email protected] lesson1]# ls

ARM-tools hello led.bin led.lds led.S

ARM-Tools.tar.gz hello.c led.elf led.o Makefile

3. am-linux-readelf 读取elf格式文件

-a 文件头

[[email protected] lesson1]# arm-linux-readelf -a led.elf

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2‘s complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: EXEC (Executable file)

Machine: ARM

Version: 0x1

Entry point address: 0x50008000

Start of program headers: 52 (bytes into file)

Start of section headers: 33352 (bytes into file)

Flags: 0x5000002, has entry point, Version5 EABI

Size of this header: 52 (bytes)

Size of program headers: 32 (bytes)

Number of program headers: 1

Size of section headers: 40 (bytes)

Number of section headers: 10

Section header string table index: 7

?

Section Headers:

[Nr] Name Type Addr Off Size ES Flg Lk Inf Al

[ 0] NULL 00000000 000000 000000 00 0 0 0

[ 1] .text PROGBITS 50008000 008000 0000e0 00 AX 0 0 4

[ 2] .ARM.attributes ARM_ATTRIBUTES 00000000 0080e0 000018 00 0 0 1

[ 3] .debug_line PROGBITS 00000000 0080f8 000064 00 0 0 1

[ 4] .debug_info PROGBITS 00000000 00815c 00004a 00 0 0 1

[ 5] .debug_abbrev PROGBITS 00000000 0081a6 000014 00 0 0 1

[ 6] .debug_aranges PROGBITS 00000000 0081c0 000020 00 0 0 8

[ 7] .shstrtab STRTAB 00000000 0081e0 000066 00 0 0 1

[ 8] .symtab SYMTAB 00000000 0083d8 0001a0 10 9 23 4

[ 9] .strtab STRTAB 00000000 008578 0000c3 00 0 0 1

Key to Flags:

W (write), A (alloc), X (execute), M (merge), S (strings)

I (info), L (link order), G (group), x (unknown)

O (extra OS processing required) o (OS specific), p (processor specific)

?

There are no section groups in this file.

?

Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

LOAD 0x008000 0x50008000 0x50008000 0x000e0 0x000e0 R E 0x8000

?

Section to Segment mapping:

Segment Sections...

00 .text

?

There is no dynamic section in this file.

?

There are no relocations in this file.

?

There are no unwind sections in this file.

?

Symbol table ‘.symtab‘ contains 26 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

1: 50008000 0 SECTION LOCAL DEFAULT 1

2: 00000000 0 SECTION LOCAL DEFAULT 2

3: 00000000 0 SECTION LOCAL DEFAULT 3

4: 00000000 0 SECTION LOCAL DEFAULT 4

5: 00000000 0 SECTION LOCAL DEFAULT 5

6: 00000000 0 SECTION LOCAL DEFAULT 6

7: 50008000 0 NOTYPE LOCAL DEFAULT 1 $a

8: 5000803c 0 NOTYPE LOCAL DEFAULT 1 reset

9: 50008020 0 NOTYPE LOCAL DEFAULT 1 _undefined_instruction

10: 50008024 0 NOTYPE LOCAL DEFAULT 1 _software_interrupt

11: 50008028 0 NOTYPE LOCAL DEFAULT 1 _prefetch_abort

12: 5000802c 0 NOTYPE LOCAL DEFAULT 1 _data_abort

13: 50008030 0 NOTYPE LOCAL DEFAULT 1 _not_used

14: 50008034 0 NOTYPE LOCAL DEFAULT 1 _irq

15: 50008038 0 NOTYPE LOCAL DEFAULT 1 _fiq

16: 50008064 0 NOTYPE LOCAL DEFAULT 1 set_peri_port

17: 50008074 0 NOTYPE LOCAL DEFAULT 1 disable_watchdog

18: 50008084 0 NOTYPE LOCAL DEFAULT 1 disable_irq

19: 500080a0 0 NOTYPE LOCAL DEFAULT 1 init_led

20: 500080b0 0 NOTYPE LOCAL DEFAULT 1 light_led

21: 50008060 0 NOTYPE LOCAL DEFAULT 1 halt

22: 500080c8 0 NOTYPE LOCAL DEFAULT 1 $d

23: 50008000 0 NOTYPE GLOBAL DEFAULT 1 _start

24: 500080e0 0 NOTYPE GLOBAL DEFAULT ABS __bss_start

25: 500080e0 0 NOTYPE GLOBAL DEFAULT ABS _end

?

No version information found in this file.

Attribute Section: aeabi

File Attributes

Tag_CPU_name: "4T"

Tag_CPU_arch: v4T

Tag_ARM_ISA_use: Yes

补充:如果程序不能运行

  1. 引用程序不是运行在arm平台上
  2. 大小端
  3. 用的库不对

[[email protected] lesson1]# arm-linux-readelf -d hello-d

?

Dynamic section at offset 0x448 contains 24 entries:

Tag Type Name/Value

0x00000001 (NEEDED) Shared library: [libc.so.6]

0x0000000c (INIT) 0x8274

0x0000000d (FINI) 0x8414

0x00000019 (INIT_ARRAY) 0x1043c

0x0000001b (INIT_ARRAYSZ) 4 (bytes)

0x0000001a (FINI_ARRAY) 0x10440

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) 0x10530

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

3. arm-linux-objdump 反汇编器

[[email protected] lesson1]# file hello-d

hello-d: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped

[[email protected] lesson1]# arm-linux-objdump -D -S hello-d > dump

[[email protected] lesson1]# vim dump

?

?

hello-d: 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:

?

00008148 <.note.ABI-tag>:

8148: 00000004 .word 0x00000004

814c: 00000010 .word 0x00000010

8150: 00000001 .word 0x00000001

8154: 00554e47 .word 0x00554e47

8158: 00000000 .word 0x00000000

815c: 00000002 .word 0x00000002

8160: 00000006 .word 0x00000006

8164: 0000000e .word 0x0000000e

Disassembly of section .hash:

00008168 <.hash>:

"dump" 384L, 13119C

[[email protected] lesson1]# arm-linux-gcc hello.c -g -o hello-d

hello.c: In function ‘main‘:

hello.c:4: warning: return type of ‘main‘ is not ‘int‘

[[email protected] lesson1]# arm-linux-objdump -D -S hello-d > dump

[[email protected] lesson1]# vim dump

0000837c <main>:

#include<stdio.h>

?

void main()

{

837c: e92d4800 push {fp, lr}

8380: e28db004 add fp, sp, #4 ; 0x4

printf("hello world\n");

8384: e59f000c ldr r0, [pc, #12] ; 8398 <main+0x1c>

8388: ebffffcb bl 82bc <_init+0x48>

}

838c: e24bd004 sub sp, fp, #4 ; 0x4

8390: e8bd4800 pop {fp, lr}

8394: e12fff1e bx lr

8398: 00008424 .word 0x00008424

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

Elfà2进制文件

[[email protected] lesson1]# arm-linux-objcopy -O binary led.elf led.bin

led.bin裸机可运行

总结

最后的是工具的功能

Arm-linux-xxx -help

时间: 2024-10-16 01:02:36

1.2交叉工具链的相关文章

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

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

安装交叉工具链

实验平台: redhat 6    以安装 安装步骤: (1):在网上找到自己想要的交叉工具链安装包 (2):解压自己的安装包   ; tar -xzvf arm-linux-gcc-4.3.2.tar.gz   -C /     解压到或目录 或tar  -xjvf   arm-linux-gcc-3.4.5.tar.bz2   -C / 在解压的过程中我们可以看到,其可执行程序,被解压到/usr/local/arm/3.4.5/bin, (4):修改配置文件 vim  /etc/profil

编译裸机程序以及交叉工具链

把链接器脚本led.lds.源文件led.S以及Makefile给出 1.arm-linux-gcc -g -c led.S -o led.o 编译不链接且包含调试信息 2.arm-linux-ld -Tled.lds -o led.elf led.o 使用链接器脚本led.lds来进行链接 3.arm-linux-objcopy -O binary led.elf led.bin 将elf格式转换为bin 4.将生成的.bin文件烧写到开发板. 交叉工具链 1.交叉编译器 arm-linux-

ubuntu下stm32交叉工具链 构建过程1

说实话,这个过程将是十分折腾的过程,而且不一定成功,所以,我的很多朋友在听到我说要做这件事情的时候,都给我泼冷水. 但是,我还是想努力,因为这次我是下决心,非要反微软到底. 就算这个过程再难——我脑海里经常闪现起 勇敢的心 里 华伦士 最后受尽极性 仍然高喊 自由的情景. 我对自己说,也是激励自己:只有这样的人才有权利追求和获得自由. 这件事,难就难在我发现我光是为了获取一个可用的gcc编译器,在codesourcery codebench上下载下来都这么费劲. 我的网络速度相当快,但不知为什么

2.交叉工具链

2.交叉工具链 一.交叉工具链: 交叉工具链,其实他有两个含义,一个就是交叉工具,所谓的交叉工具就是运行的环境和编译的环境不是在一体的.就像我们现在,编译裸机程序是在pc机上面执行的.可我们运行程序是在开发板.链,就是很多的意思,就是一个工具的集合.在我们前面配置arm-linux-gcc的工具中.在/usr/local/arm/4.3.2/bin的目录下有很多编译工具.例如图1-1: 图1.-1 交叉工具链 下面我们来写一个简单的程序,用这些工具编译. Hello.c: #include <s

自己制作ARM-Linux交叉工具链

学习嵌入式嘛,就得自己多动手,多实践.入门的话,自己配置开发环境,移植内核这些.开发环境就不说了,移植内核首先就得编译内核.就得有编译器.由于ARM cpu的体系结构与x86不一样.通常的做法就是在 x86 开发平台使用ARM交叉编译器来编译内核,再移植到开发板上.制作交叉工具链是个仔细的活,既繁琐又有难度.网上推荐的做法是新手使用别人制作好的工具链,等以后经验多了,再来仔细研究这个.不知道为什么我就硬着头皮上了,结果花了一个星期还是倒腾出来了,算是有收获.所以这篇博文就简单记录一下,内容不涉及

[国嵌笔记][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

交叉工具链的搭建方法(测试成功)

之前安装了一个rehat6的linux系统,把交叉编译搭建给忽视了,结果在编译uboot的时候出现问题,显示找不到arm-linux-gcc.于是自己来搭建交  叉编译环境.出现好多错.先是解压时没在后边加 -C/,后是直接自己创建了个目录,把解压后的bin目录复制到自己创建的目录.还是出现问题.但  最后我还是成功了的,直接给出操作过程: **把arm-linux-gcc复制到linux任意目录,比如是study,建议是自己创建的工作目录,便于你之后删除该压缩包. #cd study #ls

交叉工具链的用途及使用方法

交叉工具链.链即为集合,交叉工具链也就是交叉工具的集合.平时在电脑上写程序然后再进行编译链接等操作最后生成一个可执行程序,该文件都只能在X86架 构硬件上运行,而不能在我现在使用的开发板,也就是ARM架构上运行.所以进行ARM的裸机程序开发要有一套自己的工具.交叉工具链的安装和环境变量的配 置昨天学过了,现在已经忘得差不多了,但是以后会补上的.废话少说,下面开始记录今天学到的东西. 1.交叉编译器  顾名思义,就是将写好的C程序代码编译为ARM架构下的可执行文件.以前在电脑上使用的gcc,编译后

5.3交叉工具链使用

实验三 交叉工具链使用 实验目的 1.掌握交叉工具链的安装.配置方法 2.掌握交叉编译.调试方法 实验要求 安装.配置arm-linux交叉工具链 交叉编译"输入-回显"程序: 将程序"嵌入"到开发板运行: ? 实验步骤 一.安装.配置arm-linux交叉工具链 1.将教学资源\toochain目录内的交叉工具链压缩包通过SMB共享拷贝到Linux宿主机 ? 2.将工具链软件包加压到根目录 3.将工具链bin目录加入PATH环境变量 打开配置文件: 添加到最后的信