我在u-boot-2011.12
目标上使用OMAP3
,交叉工具链为CodeSourcery arm-none-linux-gnueabi
,我编译u-boot
,将其下载到目标并启动它,所有内容很好,但我对u-boot
重新定位功能有一些疑问,我们知道此功能基于PIC
(位置无关代码),通过设置-fpic
生成与位置无关的代码标记为gcc
,但我在编译标志中找不到fpic
。没有PIC,u-boot如何实现重定位功能?
答案 0 :(得分:3)
请记住,当u-boot运行时,还没有操作系统。它并不真正需要大多数用户应用程序中使用的“pic”功能。我将在下面描述的是PowerPC架构。
u-boot最初运行在NV存储器(NAND或NOR)中。在u-boot初始化大多数外设(特别是RAM)后,它会找到RAM的顶部,为全局数据保留一些区域,然后将自身复制到RAM。然后,u-boot将分支到RAM中的代码并修改fixup。 u-boot现在重新定位在RAM中。
查看架构的start.S文件并找到relocate_code()函数。然后学习,研究,学习......
答案 1 :(得分:1)
我也发现了这个麻烦,并且在这个问题上围了几个小时。“
幸运的是,我偶然发现了u-boot邮件列表中的以下帖子:
http://lists.denx.de/pipermail/u-boot/2010-October/078297.html
这就是说,至少在ARM上,在COMPILE TIME使用-fPIC / -fPIE不需要生成与位置无关的二进制文件。它通过尽可能早地完成大部分工作来简化运行时加载器的任务,但这就是全部。
无论您是否使用fPIC,您始终可以在LINK TIME使用-pic / -pie,这会将所有与位置相关的引用移动到重定位部分。由于在COMPILE TIME没有执行处理以添加帮助程序,因此期望此部分比使用-fPIC时更大。
他们的结论是,出于他们的目的,使用-fPIC与仅使用链接时的解决方案没有任何明显的优势。
[edit]请参阅提交u-boot 92d5ecba以供参考
arm:实现ELF重定位 http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commit;h=92d5ecba47feb9961c3b7525e947866c5f0d2de5