关于链接文件和hex文件的一些小总结

在调试某芯片平台时,希望将flash上的一片地方采用绝对地址定位定一个数组。于是修改了链接文件,当时的链接文件如下:
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 64k
ram : ORIGIN = 0x00800800, LENGTH = 4k

    eflash  : ORIGIN = 0x00400000, LENGTH = 24k
    
    JTEST   : ORIGIN = 0x00408000, LENGTH = 100k

}

SECTIONS
{
.text_entry : {
VECTOR_LOCATION = .;
KEEP(vector_table.o(.rodata));
} >eflash
.rodata : {
( .rodata);
} >eflash

    .text   :       {
                      *( .text*);
					  . = ALIGN(16);  
                       _end_text = .;
                    } >eflash = 0xbebe
   .gJTEST 0x408000:  {
    					KEEP(*test.o(.text*));
                        KEEP(*( .gJTEST));
                                               
    			    } >JTEST
                  

    .data   :    	AT(_end_text)
                    { _start_data = .;
                      *( .data );
					  . = ALIGN(4);  
                      _end_data = .; 
                    } >ram

    .bss    :       { _bss_start = .; 
                      *( .bss ) *(COMMON); 
                      . = . + 0x08;
                      _bss_end = .;
                    } >ram

}
test.c文件如下:
attribute ((section (".gJTEST ")))
void AAAtest(void)
{
int i;
for(i=0; i<100;i++)
Buff[i] = 0xaa;
}

编译完以后,看map文件发现已经将函数 AAAtest 定位到了0x408000这个地址,在主函数中调用 AAAtest 的时候,采用函数指针指向绝对地址,然后调用的方式,发现每次调用总会引起芯片异常复位。查看编译出来的hex文件发现 0x408000 这个地址上面没有数据。这种情况是map中显示已经将文件进行了绝对地址定位,但是hex文件中并没有相应的数据。后来修改链接文件如下:
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 64k
ram : ORIGIN = 0x00800800, LENGTH = 4k

    eflash  : ORIGIN = 0x00400000, LENGTH = 24k
    
    JTEST   : ORIGIN = 0x00408000, LENGTH = 100k

}

SECTIONS
{
.text_entry : {
VECTOR_LOCATION = .;
KEEP(vector_table.o(.rodata));
} >eflash
.rodata : {
( .rodata);
} >eflash

   .gJTEST 0x408000:  {
    					KEEP(*test.o(.text*));
                        KEEP(*( .gJTEST));                                            
    			    } >JTEST
    			    
    .text   :       {
                      *( .text*);
					  . = ALIGN(16);  
                       _end_text = .;
                    } >eflash = 0xbebe
   .gJTEST 0x408000:  {
    					KEEP(*test.o(.text*));
                        KEEP(*( .gJTEST));                                            
    			    } >JTEST
                  

    .data   :    	AT(_end_text)
                    { _start_data = .;
                      *( .data );
					  . = ALIGN(4);  
                      _end_data = .; 
                    } >ram

    .bss    :       { _bss_start = .; 
                      *( .bss ) *(COMMON); 
                      . = . + 0x08;
                      _bss_end = .;
                    } >ram

}
编译链接发现hex文件中已经显示 地址 0x408000 上有数据了,再次调用测试函数没有问题。

问题的原因是在.text这个段中要将所有的代码段链接到那儿去,如果将需要特殊处理的段 .gJTEST 放在 .text 段后面,在 .text 段中已经将所有的东西放在了那儿,后面再有 .gJTEST 的时候 链接器发现已经链接了测试函数,就不再对测试函数进行链接了,解决这个问题只能将需要特殊处理的段放在 .text 之前。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: keil的hex文件是经过编译和链接生成的一种可执行文件格式,用于在微控制器中运行程序。而直接合并指的是将多个hex文件合并成一个单独的hex文件。 在keil软件中,合并hex文件可以通过以下步骤完成: 1. 打开keil软件并加载一个hex文件。 2. 在工具栏中选择“File”->“Merge”选项。 3. 在弹出的对话框中,选择需要合并的其他hex文件,并点击“打开”按钮。 4. keil将会合并所选的hex文件生成一个包含所有数据的新hex文件。 5. 另存为新的hex文件,以便后续使用。 合并hex文件的目的是将多个程序或数据合并成一个文件,方便程序的下载和调试,并且可以减少芯片的存储空间和数据传输时间。在合并过程中,会将多个hex文件的数据按照地址顺序进行合并,确保程序的正确执行。 需要注意的是,合并hex文件可能会出现地址冲突或数据重叠等问题,因此在合并过程中应仔细检查和调整合并的数据,以确保程序的正确性和可靠性。 总之,通过keil软件可以方便地将多个hex文件合并成一个单独的hex文件,以提高程序的可维护性和运行效率。 ### 回答2: Keil的hex文件可以通过直接合并的方式进行操作。将多个hex文件的内容按照一定的规则进行合并,可以得到一个新的合并后的hex文件。 首先,我们需要了解hex文件的结构。一个典型的hex文件包括了多个记录(record),每个记录都以半角冒号(:)开头。记录的内容包括记录长度(两个十六进制数表示),起始地址(四个十六进制数表示),记录类型(两个十六进制数表示),数据以及校验和。 在合并两个hex文件时,我们需要将第一个文件的记录直接拷贝到合并后的文件中。对于第二个文件的每个记录,我们需要将它的数据拷贝到新文件对应记录的最后面,并且更新新文件的记录长度和校验和。 需要注意的是,合并过程中需要对不同文件的记录进行地址对齐。一般情况下,新文件的起始地址是两个文件的起始地址的较小值。对于第二个文件的每个记录,需要将其起始地址相对于新文件起始地址进行偏移。如果一个文件的起始地址比另一个文件的结束地址还大,那么需要在新文件的结束地址后面添加相应长度的填充数据。 合并hex文件时,也需要确保新文件的记录类型正确,如果有特殊的记录类型,需要按照hex文件规范进行处理。 综上所述,可以通过合并多个hex文件的记录内容,并按照规则更新记录长度、地址和校验和等信息,得到一个新的合并后的hex文件。合并hex文件可以用来将多个源文件生成hex文件合并为一个整体,方便后续的下载和使用。 ### 回答3: Keil的hex文件可以通过直接合并来实现。hex文件是一种十六进制格式的文件,它包含了程序的二进制代码和相关的地址信息。在合并hex文件的过程中,我们需要确保合并后的文件中没有重复的地址,并且地址是按照递增顺序排列的。 要实现hex文件的合并,我们可以使用一些hex文件编辑器或者专门的合并工具。首先,我们需要打开第一个hex文件,并识别出其中的起始地址和结束地址。然后,我们将第一个hex文件的内容复制到一个新的合并文件中。 接下来,我们打开第二个hex文件,并同样识别出其中的起始地址和结束地址。然后,我们检查第二个hex文件的起始地址是否大于第一个文件的结束地址,如果是的话,我们可以将第二个文件的内容直接复制到合并文件的末尾。 如果第二个hex文件的起始地址小于第一个文件的结束地址,那么我们需要调整第二个文件的地址,使其与第一个文件的结束地址相同,并且要确保第二个文件的地址是按照递增顺序排列的。然后,我们将第二个文件的内容复制到合并文件中。 重复以上步骤,我们可以继续合并更多的hex文件。 最后,我们保存合并后的文件,此时的文件中包含了所有输入的hex文件的内容。搞定!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值