嵌入式Linux 下自己写连接脚本

  按一般正常的顺序我们开发一个嵌入式程序需要经过,预处理, 编译, 汇编,连接四个步骤。对应的命令为:

 

   编译: arm-linux-gcc -c xxx.c -o xxx.o 

   连接: arm-linux-ld  -T user.lsd -o xxx  xxx.o     

   从上面的命令中有些参数不是必须的,如: -T user.lsd ,这个表示在连接的时候应用自己写的连接脚本,不采用系统默认的连接脚本。下面一起来看看怎么自己写连接脚本:

  eg: user.lds 

 

            OUTPUT_FORMAT("elf32-littlearm","elf-bigarm","elf- littlearm");

        OUTPUT_ARCH("arm");

        ENTRY("_start");

        SECTIONS

         {

              . = 0x30000000

              .text : { *(.text);}

 

              . = ALGIN(4);

              .data : { *(.data); }

 

              . = ALGIN(4)

              .rodata : {*(.rodate);}

             

              . = ALGIN(4)

              __user_sigment_start = .;

              .user_sigment : {*(.user_sigment);}

              __user_sigment_end = .;

 

              . = ALGIN(4)

              __bass_start = .;

              .bss : {*(.bass);}

              __bass_end = .; 

         }

 

   从这边配置文件你可以看出,我们定义了自己的段 user_sigment. 当使用自己编写的连接的脚本后,我们就可以定义一些段。非常方便。有的时候你可能要在没有操作系统上调试一些程序,这半个时候连接的程序是不能运行的,因为使用 arm-linux-gcc 编译 和使用arm-linux-ld 连接的后的可执行文件是 ELF 格式。这个是Linux 系统下可执行文件格式,可是我们现在还没有系统,你想能运行吗?所以还要进行相应的去ELF 头工作:

一般我们用:

 

        arm-linux-objcopy  xxxx -O binary xxxx.bin

 

这个时候 xxxx.bin才是我们arm 能运行的格式。我们可以通过u-boot 的 tftp功能下载到我们内存中运行。

 

 eg :  tftp 0x30000000 xxxx.bin

       go 0x30000000   

作者: lin_13824307069   发布时间: 2010-10-31