zoukankan      html  css  js  c++  java
  • 交叉编译工具链(详解)

    交叉编译工具链

     
    1、嵌入式开发模型-交叉开发

        在嵌入式开发过程中有宿主机目标机的角色之分:宿主机是执行编译链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。

                  clip_image002

    在宿主机执行编译的流程如下:

                     clip_image004

    2、交叉编译工具链详解

    参考:

    http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html

    3、制作交叉编译工具

    参考:

    http://www.crifan.com/files/doc/docbook/crosstool_ng/release/html/crosstool_ng.html

    4、交叉编译工具

    arm-linux-gcc

    arm-linux-addr2line

    arm-linux-objcopy

    arm-linux-readelf

    arm-linux-ar

    arm-linux-ld

    arm-linux-objdump

    arm-linux-size

    arm-linux-nm

    arm-linux-strip

    arm-linux-cc

    arm-linux-gprof

    arm-linux-c++filt

    arm-linux-as

    arm-linux-cpp

    arm-linux-gccbug

    arm-linux-ldd

    arm-linux-populate

    arm-linux-strings

    arm-linux-c++

    arm-linux-g++

    arm-linux-gcov

    arm-linux-ranlib

    如何查看各交叉编译工具的帮助信息:

    例如查看arm-linux-gcc的帮助信息:

        $ arm-linux-gcc --help

    常用的交叉编译工具:

    4.1 交叉编译器 arm-linux-gcc

        和X86平台下的gcc的基本用法用法是完全一样的;不同之处:标准的gcc所引用的头文件路径为 /usr/include/stdio.h,arm-linux-gcc所引用的头文件路径为其安装路径下,如 /usr/local/armtools/4.5.1/bin/..

    4.2 交叉链接器 arm-linux-ld

        arm-linux-ld命令是ARM平台下的交叉链接器,把程序链接成可以在ARM平台下运行。

        用法: arm-linux-ld -Tled.lds led.o -o led.elf

                   把led.o链接成led.elf文件;led.lds是链接器脚本,

    4.3 交叉elf文件工具 arm-linux-readelf

    查看.elf格式文件: arm-linux-readelf -a led.elf

                              -a 参数是查看.elf文件的所有内容

    注意:编译的程序运行不了有两个原因:一个是要看运行平台对不对,第二个是要看处理器的大小端跟编译的程序的大小端是否对应,可以使用arm-linux-readelf -a xxx.elf 命令查看编译出来的程序大小端情况和程序运行平台。

        如下图所示,编译后的程序只能运行在小端(little endian)的处理器上,其运行平台Machine是ARM。绝大多数ARM处理器都是小端的。

       clip_image006

        查看程序运行平台还可以使用file xxx (xxx为编译后可执行文件) 命令查看。

        如一个应用程序不能执行,排除了运行平台和大小端的情况后,还有可能是库不对。

    使用arm-linux-readelf -d xxx (xxx为编译后可执行文件)查看运行库;如hello程序运行库为libc.so.6,如果开发板上没有这个库,程序是运行不了的。

        clip_image008

    4.4 交叉反汇编器 arm-linux-objdump

    把hello.c文件编译成hello可执行文件:arm-linux-gcc hello.c -o hello

    用法arm-linux -objdump -D -S hello >dump

             把hello可执行文件反汇编后输入保存到dump文件中。

             -D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中

          clip_image010

    注意: 在编译hello时没有使用-g参数,反汇编后的代码和原来C代码对应不起来。我们可以在编译hello时使用-g参数:

        先把hello.c文件编译成hello可执行文件:arm-linux-gcc -g hello.c -o hello;运行arm-linux -objdump -D -S hello >dump命令,打开dump文件可以看到

           clip_image012

    4.5文件格式转换器 arm-linux-objcopy

        使用arm-linux-objcopy命令可以把ELF格式的文件转换成二进制文件。

        文件格式转换的原因:elf格式的文件不能直接在ARM上运行(ARM只能运行二进制格式的文件);

        用法:arm-linux-objcopy -O binary led.elf led.bin

                把led.elf格式的文件转换成led.bin二进制文件。

    4.6库管理器arm-linux-ar

        arm-elf-ar将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。arm-elf-ar支持ELF格式的函数库文件.

    转自:https://www.cnblogs.com/AP0904225/p/5904950.html

  • 相关阅读:
    SQL 查询第n条到第m条的数据
    Linq 中查询一个表中指定的字段
    归并排序与逆序对
    补码拾遗
    堆排序
    It is time to cut the Gordian Knot!
    蛋疼
    [引]Microsoft Visual Studio .NET 2005 预发行版
    关于VS2005中自动生成TableAdapter的事务处理
    关于释放ASPNET进程的内存占用问题.
  • 原文地址:https://www.cnblogs.com/coolYuan/p/9037660.html
Copyright © 2011-2022 走看看