我和一个同事今天在使用以下版本的LD时遇到了这个奇怪的错误:
$ mb-ld --version
GNU ld (GNU Binutils) 2.21.53.20110813
Copyright 2011 Free Software Foundation, Inc.
这是带有MicroBlaze架构支持的GNU工具链的一部分,作为Xilinx ISE 14.4嵌入式开发工具包(EDK)工具的一部分分发。我的构建平台是Red Hat Enterprise Linux Server release 5.9 for x86_64。
更一般地说,一些其他的问题浮现在脑海中:
- 是否有一个所有GNU ld重定位类型的主列表?
- 如果没有,那么是否有一种方法可以询问我的特定版本的LD以确定重定位类型意味着什么?
1. Is there a master list of all GNU ld relocation types?
不,它是基于硬件架构的
2. If not, then is there a way to interrogate my specific version of LD to determine what a relocation type means?
有点,你可以为你的硬件找到类型。Microblaze是一个软cpu,但它模仿了PowerPC的体系结构。在快速搜索"PowerPC重定位类型"后,我发现http://math-atlas.sourceforge.net/devel/assembly/elfspec_ppc.pdf(表4-8)我们有以下重定位类型
Table 4-8 Relocation Types
Name Value Field Calculation
R_PPC_NONE 0 none none
R_PPC_ADDR32 1 word32 S + A
R_PPC_ADDR24 2 low24* (S + A) >> 2
R_PPC_ADDR16 3 half16* S + A
R_PPC_ADDR16_LO 4 half16 #lo(S + A)
R_PPC_ADDR16_HI 5 half16 #hi(S + A)
R_PPC_ADDR16_HA 6 half16 #ha(S + A)
R_PPC_ADDR14 7 low14* (S + A) >> 2
R_PPC_ADDR14_BRTAKEN 8 low14* (S + A) >> 2
R_PPC_ADDR14_BRNTAKEN 9 low14* (S + A) >> 2
R_PPC_REL24 10 low24* (S + A - P) >> 2
R_PPC_REL14 11 low14* (S + A - P) >> 2
R_PPC_REL14_BRTAKEN 12 low14* (S + A - P) >> 2
R_PPC_REL14_BRNTAKEN 13 low14* (S + A - P) >> 2
R_PPC_GOT16 14 half16* G + A
R_PPC_GOT16_LO 15 half16 #lo(G + A)
R_PPC_GOT16_HI 16 half16 #hi(G + A)
R_PPC_GOT16_HA 17 half16 #ha(G + A)
R_PPC_PLTREL24 18 low24* (L + A - P) >> 2
R_PPC_COPY 19 none none
R_PPC_GLOB_DAT 20 word32 S + A
R_PPC_JMP_SLOT 21 none see below
R_PPC_RELATIVE 22 word32 B + A
R_PPC_LOCAL24PC 23 low24* see below
R_PPC_UADDR32 24 word32 S + A
R_PPC_UADDR16 25 half16* S + A
R_PPC_REL32 26 word32 S + A - P
R_PPC_PLT32 27 word32 L + A
我的猜测是,这些将是相同的MicroBlaze(也许与R_MB而不是R_PPC的名称)。当然,应该有一个官方文件告诉你到底发生了什么,我还没有找到。
使用带有选项-r的objdump.exe来查找输出中每个符号的重定位类型。