小弟在.ld文件中使用ENTY命令指定起始地址为Reset_Handler,但是链接出的.elf文件对应地址上的函数却不是Reset_Handler。
各文件详情:
-->.ld文件,文件中指定了ENTRY(Reset_Handler),并且.text段的起始地址设定为0x80002000
/* Entry Point */
ENTRY(Reset_Handler)
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400;
ISTACK_SIZE = DEFINED(__irq_stack_size__) ? __irq_stack_size__ : 0x0400;
CSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
RSTACK_SIZE = DEFINED(__resume_stack_size__) ? __resume_stack_size__ : 0x0400;
/* Specify the memory areas */
*/
MEMORY
{
m_ocram (RWX) : ORIGIN = 0x00900000, LENGTH = 0x00020000
m_interrupts (RX) : ORIGIN = 0x803FFFC0, LENGTH = 0x00000040
m_text (RX) : ORIGIN = 0x80002000, LENGTH = 0x003FDFC0
m_data (RW) : ORIGIN = 0x80400000, LENGTH = 0x00400000
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into DDR RAM */
.interrupts :
{
__VECTOR_TABLE = .;
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > m_interrupts
/* The program code and other data goes into DDR RAM */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
} > m_text
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > m_text
--> startup.s,该文件中定义了Reset_Handler函数,并且指定它在.text段
.text
.arm
/* Reset Handler */
.arm
.align 2
.globl Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
cpsid i /* Mask interrupts */
/* Reset SCTlr Settings */
mrc p15, 0, r0, c1, c0, 0 /* Read CP15 System Control register */
bic r0, r0, #(0x1 << 12) /* Clear I bit 12 to disable I Cache */
bic r0, r0, #(0x1 << 2) /* Clear C bit 2 to disable D Cache */
bic r0, r0, #0x2 /* Clear A bit 1 to disable strict alignment */
bic r0, r0, #(0x1 << 11) /* Clear Z bit 11 to disable branch prediction */
bic r0, r0, #0x1 /* Clear M bit 0 to disable MMU */
mcr p15, 0, r0, c1, c0, 0 /* Write value back to CP15 System Control register */
-->最终反编译出的结果
Disassembly of section .text:
80002000 <__do_global_dtors_aux>:
80002000: b510 push {r4, lr}
80002002: f240 046c movw r4, #108 ; 0x6c
80002006: f2c8 0440 movt r4, #32832 ; 0x8040
8000200a: 7823 ldrb r3, [r4, #0]
发现0x80002000地址上的函数却不是Reset_Handler,有熟悉链接脚本的大佬可以指点下小弟吗。
完整工程文件:imx6_template.zip
这是一个imx6ull的裸机工程,目前是使用NXP官方SDK来设置C语言环境,进入main点灯。
最近编辑记录 flex-A (2021-07-26 23:49:44)
离线
楼主方便发一个完整的压缩包吗?
工程文件已经上传了:D
离线
通过下图的方法明确指定文件链接的顺序是可以在期望的地址得到正确的函数的
离线
@海石生风
多谢老哥,又多了一种解决方法
离线