Что означает ошибка GNU ld linker unknown relocation type 30?

Сегодня мы с коллегой столкнулись с этой странной ошибкой, используя следующую версию LD:

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

Это часть цепочки инструментов GNU с поддержкой архитектуры MicroBlaze, распространяемой как часть инструментов Xilinx ISE 14.4 Embedded Development Kit (EDK). Моя платформа сборки — Red Hat Enterprise Linux Server версии 5.9 для x86_64.

В общем, на ум приходят и другие вопросы:

  1. Существует ли основной список всех типов перемещения GNU ld?
  2. Если нет, то есть ли способ опросить мою конкретную версию LD, чтобы определить, что означает тип перемещения?

person deaks    schedule 02.04.2013    source источник


Ответы (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 — это программный процессор, но он имитирует архитектуру PowerPC. После быстрого поиска в Google «Типы перемещения 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 в названии). Конечно, где-то должен быть официальный документ, который точно расскажет вам, что происходит, я его не нашел.

person Rikard Söderström    schedule 02.07.2014
comment
Мне не удалось найти это определение типа перемещения 30, характерное для MicroBlaze или PowerPC, в инструментах Xilinx, на веб-сайте Xilinx или в каком-либо общем поиске в Интернете. Однако этот ответ указывает, где обычно хранится эта информация (в дополнениях к архитектуре или в общих файлах заголовков), и привел меня к некоторым дополнительным отчетам об ошибках для этого типа местоположения. - person deaks; 12.07.2014

используйте objdump.exe с параметром -r, чтобы найти типы перемещения для каждого символа в вашем выводе. Я не знаю, где типы задокументированы.

person user2821281    schedule 26.09.2013
comment
Вы можете улучшить форматирование и предоставить несколько ссылок для резервного копирования вашего ответа. - person mathielo; 27.09.2013