Ошибка предварительной ссылки: ошибка макета: размер раздела слишком мал для данных

Я использую prelink в системе ARM с Linux 2.6.35. Я использую Glibc 2.12.2. Я хотел бы предварительно связать свои библиотеки и исполняемые файлы приложений. Однако я не могу связать ничего, что напрямую зависит от glibc. Когда предварительная ссылка пытается запуститься на /lib, возникает ошибка:

Could not write /lib/libc-2.12.2.so: Layout error: section size too small for data

Есть ли способ исправить это или, возможно, убедить предварительную ссылку делать предварительную ссылку на все, кроме того, что находится в /lib? Я знаю о функции черного списка в /etc/prelink.conf, но тогда prelink выдаст ошибку, потому что не может найти зависимости, расположенные в этом каталоге.

Редактировать:

Вот мой prelink.conf

~ # cat /etc/prelink.conf
-h /usr/local/Qt-4.7.4/lib
-h /usr/lib
-h /lib
-h /usr/local/dbus/lib
-h /usr/local/sqlite/lib
-h /usr/local/ncurses/lib
-h /usr/local/expat/lib
-h /usr/local/ssl/lib

Я работаю на платформе i.MX51 от Freescale. Это ARM Cortex-8. Поскольку я скомпилировал все с версией GCC/G++, поставляемой с нашим набором для разработки, я предполагаю, что двоичные файлы ELF являются 32-разрядными.

Редактировать:

Я изменил флаги -h на -l и переместил системные библиотеки в начало списка. Я все еще получаю ту же ошибку.

Я запускаю прелинк на устройстве, а не на машине для кросс-билдинга.

LD_LIBRARY_PATH содержит /lib и /usr/lib

Пробовал запускать прелинк как: prelink -a prelink -amR

и получил тот же результат в обоих направлениях.

Я запускаю кросс-компилятор gcc 4.4.6. Я использую ld 1.12.1 ld.


person San Jacinto    schedule 27.03.2012    source источник
comment
Хотя создание программного обеспечения из исходного кода здесь является актуальной темой, вы, скорее всего, найдете экспертов по переполнению стека, особенно если вы создаете свои собственные программы. . Поэтому я помечаю этот вопрос для переноса (не публикуйте повторно).   -  person Gilles 'SO- stop being evil'    schedule 28.03.2012
comment
Без проблем. Поскольку этот вопрос на самом деле не включает в себя написание какого-либо кода, я решил, что модники SO захотят переместить его сюда. Я полагал, что там у меня больше шансов, но хотел играть по правилам. Спасибо за помощь.   -  person San Jacinto    schedule 28.03.2012


Ответы (1)


Ошибка Layout error: section size too small for data вызывается в libelf на следующей строке https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230.

Это вызывается предварительной ссылкой в ​​write_dso.

if (elf_update (dso->elf, ELF_C_WRITE) == -1)
  return 2;

write_dso вызывается update_dso, который вызывается в main.c предварительной ссылки, а также в нескольких других местах.

Это происходит потому, что размер перемещаемых данных раздела больше, чем размер раздела, в который они перемещаются.

Какую команду prelink вы используете?

Какой у вас prelink.cache?

Ваши двоичные файлы / библиотеки ELF32 или ELF64?

Файловая утилита подскажет.

Что такое версия gcc, версия binutil, версия libelf и prelink?

gcc -V расскажет вам. Вместе с ld -V и prelink -V.

Какой у тебя LD_LIBRARY_PATH ?

Команда set или env скажет вам.

С какими параметрами был скомпилирован glibc? В частности, что касается -fPIC ?

Вы используете прелинк на самом устройстве? или в среде кросс-компиляции?

Почему в вашей конфигурации prelink нет -l строк? -h строк будут следовать за символическими ссылками, которые могут быть не тем, что вам нужно, если ваш корень сборки имеет символические ссылки в каталогах библиотек? Также обычно записи /lib и /usr/lib идут первыми в prelink.conf, как в примере здесь.

Вы используете prelink с ключом -m для преобразования виртуальной памяти? Если вы внесете в черный список все в /lib, то я считаю, что вы не можете предварительно связать любую библиотеку или двоичный файл, который ссылается на библиотеку в /lib, аналогичным образом, если вы внесете в черный список /lib/libc-2.12.2.so, вы не сможете предварительно связать все, что ссылается на него, так как предварительно связанный файл требует, чтобы его библиотеки также были предварительно связаны.

Что касается возможного исправления, не имея дополнительной информации, трудно сказать, но это может быть связано с неправильными переключателями, переданными в предварительную ссылку, или с смешиванием 32-битных или 64-битных библиотек в одном каталоге в кеше предварительной ссылки или файле конфигурации.

Доступна дополнительная информация о связывании и предварительной ссылке.

person Appleman1234    schedule 31.03.2012
comment
Спасибо. Когда я вернусь к машине разработки через несколько дней, я смогу ответить на этот вопрос. - person San Jacinto; 01.04.2012
comment
Я обновил свой вопрос, указав большую часть информации, которую вы просили. Я не собирал glibc для этой платформы. Это происходит в корневой файловой системе, которую я записываю на флэш-память. Как определить параметры -fPIC, с которыми он был скомпилирован? - person San Jacinto; 02.04.2012
comment
Извините, система не уведомляет об изменениях, поэтому я не заметил, что вы обновились. Я посмотрю на это позже и вернусь к вам. - person San Jacinto; 04.04.2012