Ошибка предварительной ссылки: Ошибка макета: размер раздела слишком мал для данных - PullRequest
3 голосов
/ 27 марта 2012

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

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

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

Edit:

Вот мой 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-разрядными.

Edit:

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

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

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

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

и получили одинаковый результат в обе стороны.

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

1 Ответ

2 голосов
/ 01 апреля 2012

Ошибка 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?

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

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

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

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

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

...