梅川酷子 https://bbs.21ic.com/?603209 [收藏] [复制] [RSS]

日志

如何将二进制文件链接到代码中?

已有 1084 次阅读2010-6-12 14:18 |系统分类:ARM| IAR, 链接, 二进制文件


    有时需要将一些二进制文件链接到项目中,怎么办呢?IAR提供强大的链接功能.下面简单介绍一下如何把一个二进制的文件"ZROM_Data.bin"编译链接到代码中.
    首先要用winhex创建二个只有4字节文件的二进制文件.为什么是4字节呢?因为ARM是4字节对齐的,所以创建4字节的文件最合适又省空间的.将这两个文件分别命名为"ZROM_BEGIN","ZROM_END.BIN".我将用这两个文件来辅助定位和确定"ZROM_Data.bin"的位置和文件大小.
    然后找开IAR项目的OPTION对话框,定位到Linker->Input标签,如下图所示.输入
   ZROM_AAAA
   ZROM_DATA
   ZROM_ZZZZ



名字可以随意,这三个名字表示后面将要链接到项目的3个文件.然后定位到Linker->Extra options选中"use command line options",在文本框输入以下命令(命令格式请按F1查看IAR帮助文件):
--image_input=$PROJ_DIR$\ZROM_BEGIN.BIN,ZROM_AAAA,ROM_region,4
--image_input=$PROJ_DIR$\ZROM_Data.Bin,ZROM_DATA,ROM_region,4
--image_input=$PROJ_DIR$\ZROM_END.BIN,ZROM_ZZZZ,ROM_region,4 



    最后,在Linker->list标签中选中Generate linker map file,让链接器生成map文件,以确认数据
是否正确链接目标代码中.注意,在输入上述命令时,请不要留空格,行尾也不能留(图中红圈部分),否则编译不通过.



      接下来查看二进制代码是否链接到目标文件中.打开map文件,查找"ZROM_AAAA".如下图所示,三个二进制文件已经成功被链接目标代码.



    难道就这么完了吗?没有!从上图可以得知,ZROM_AAAA的首地址为0x080000c4,ZROM_DATA的首地址为0x080000c8,ZROM_ZZZZ的首地址0x0802313c.但是随着代码的增减,每次编译这些地址值将会发生很大的变化,如何能自己的代码找到这ZROM_DATA这块数据的首地址以及确定它的大小呢?另外,你可能会问:为什么要取名为ZROM_AAAA,ZROM_DATA,ZROM_ZZZZ呢?细心的朋友会发现,IAR编译成的标代码会按照字母的顺序来链接,所以按这种命名方法,生成的代码是紧紧挨在一块的,用ZROM_AAAA的址可以确定"ZROM_Data.Bin"的开始位置,用ZROM_ZZZZ可以确定"ZROM_Data.Bin"的结束位置,这样,二进制文件的大小和位置都确定了,接下来用代码定位到访问这个二进制文件
   文件首地址:(u8 *)&ZROM_DATA
   文件大小:(u32)&ZROM_ZZZZ-(u32)&ZROM_DATA
 至此大功告成!是不是很方便?   


梅川酷子


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)