GNU ld链接器错误“未知重定位类型30”是什么意思?

时间:2013-04-02 01:55:06

标签: ld xilinx microblaze

一位同事和我今天使用以下版本的LD遇到了这个奇怪的错误:

$ mb-ld --version
GNU ld (GNU Binutils) 2.21.53.20110813
Copyright 2011 Free Software Foundation, Inc.

这是GNU工具链的一部分,MicroBlaze架构支持作为Xilinx ISE 14.4嵌入式开发套件(EDK)工具的一部分进行分发。我的构建平台是针对x86_64的红帽企业Linux服务器版本5.9。

更一般地说,还会想到其他一些问题:

  1. 是否有所有GNU ld重定位类型的主列表?
  2. 如果没有,那么是否有办法询问我的特定版本的LD以确定重定位类型的含义?

2 个答案:

答案 0 :(得分:2)

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的架构。快速google on" 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)。当然应该有一个官方文件可以告诉你到底发生了什么,我还没找到你。

答案 1 :(得分:-1)

使用带有选项-r的objdump.exe查找输出中每个符号的重定位类型。我不知道哪些类型被记录在案。