0

我和一位同事今天使用以下版本的 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) 工具的一部分分发。我的构建平台是 Red Hat Enterprise Linux Server release 5.9 for x86_64。

更一般地说,我想到了其他一些问题:

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

2 回答 2

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?

Kinda,您可以找到适合您硬件的类型。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)。当然应该有一个官方文件可以告诉你到底发生了什么,我还没有找到它。

于 2014-07-02T08:30:22.830 回答
-1

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

于 2013-09-26T21:27:53.420 回答