Gcc 如何确保裸机手臂固定地址的输入功能?

Gcc 如何确保裸机手臂固定地址的输入功能?,gcc,arm,ld,cortex-a8,Gcc,Arm,Ld,Cortex A8,我用的是S5PV210,一种sumsung arm-cortexA8芯片。在其文档中,程序将在0xD02000010开始执行。现在我成功地在上面运行了我的程序。但我还有一些问题 首先,我使用了link命令“-Ttext 0xd02000010-e main”,并认为它将把main函数放在地址0xd02000010上。但我发现它只是将.text部分放在0xD02000010上。如果我更改了.c文件中函数的顺序,即使.text部分仍将放在0xD02000010上,但主函数将不在该地址上,并且“-e

我用的是S5PV210,一种sumsung arm-cortexA8芯片。在其文档中,程序将在0xD02000010开始执行。现在我成功地在上面运行了我的程序。但我还有一些问题

首先,我使用了link命令“-Ttext 0xd02000010-e main”,并认为它将把main函数放在地址0xd02000010上。但我发现它只是将.text部分放在0xD02000010上。如果我更改了.c文件中函数的顺序,即使.text部分仍将放在0xD02000010上,但主函数将不在该地址上,并且“-e main”根本不起作用

那么,如何使主函数位于0xD02000010?我可以只用编译器和链接器命令来完成吗?

我已经解决了

elf文件用于操作系统平台,然后定义入口点为elf文件的头

但对于裸机系统,它无法读取elf文件的信息,因此必须将其转换为二进制文件,该文件不包含任何关于入口点的信息,换句话说,裸机系统没有“入口点”的概念。所以-e main选项对二进制文件不起作用

有很多方法可以将C函数放在固定地址上。我只是发布了我的解决方案

  • 在用户定义的部分声明主函数

    int main()属性(节(“.main”))

  • 使用链接器脚本,将节.main放在所需的地址上

    部分 { .=0x0000 .案文: { led.o(.main) *(.文本) } ........ }


  • 通常,您编写汇编程序来设置“C”环境(如BSS数据归零、设置堆栈等)。然后跳转到主例程
    bl\u main
    。此汇编程序代码位于唯一的部分,您可以使用自定义链接器脚本将此代码定位在图像的开头。对于ELF图像(非二进制),可以使用
    条目(开始)
    链接器指定初始控件的位置。这对二进制文件不起作用,您应该使用一个。网络上有各种各样的例子。是的,你说得对……我也弄明白了,谢谢