预链接错误:布局错误:部分大小对于数据来说太小

时间:2012-03-27 13:58:19

标签: linux arm dynamic-linking elf prelink

我正在使用Linux 2.6.35在ARM系统上运行prelink。我正在使用Glibc 2.12.2。我想预先链接我的库和应用程序可执行文件。但是,我似乎无法链接任何直接依赖于glibc的东西。当预链接尝试在/lib上运行时,它会出错:

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

我有没有办法解决这个问题,或者说服prelink来预先链接除了/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平台上。它是ARM Cortex-8。由于我已经使用我们的开发工具包附带的GCC / G ++版本编译了所有内容,因此我假设ELF二进制文件是32位。

编辑:

我将-h标志更改为-l,并将系统库移动到列表的前面。我仍然得到同样的错误。

我在设备上运行预链接,而不是在我的交叉构建机器上运行。

LD_LIBRARY_PATH包含/ lib和/ usr / lib

尝试运行prelink为:     prelink -a     prelink -amR

并且两种方式都得到了相同的结果。

我正在运行gcc 4.4.6交叉编译器。 我正在运行ld 1.12.1 ld。

1 个答案:

答案 0 :(得分:2)

在以下行https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230的libelf中调用错误Layout error: section size too small for data

这可以通过write_dso

中的预链接来调用
if (elf_update (dso->elf, ELF_C_WRITE) == -1)
  return 2;
<{> write_dsoupdate_dso调用,它会在main.c预链接中与其他一些地方一起调用。

这是因为重定位的节数据的大小大于重定位的节大小。

您正在运行什么prelink命令?

你的prelink.cache是​​什么?

您的二进制文件/库是ELF32还是ELF64?

文件工具会告诉你。

什么是gcc版本,binutil版本,libelf和prelink版本?

gcc -V会告诉你。以及ld -Vprelink -V

你的LD_LIBRARY_PATH是什么?

setenv命令会告诉您。

glibc编译的选项有哪些?特别是关于-fPIC?

您是否在设备上运行预链接?或者在交叉编译环境中?

为什么您的预链接配置没有-l行? -h行将遵循符号链接,如果您的构建根目录在库目录中有符号链接,那么这些符号链接可能不是您想要的?通常,/ lib和/ usr / lib条目首先出现在prelink.conf中,如示例here

您是否正在使用-m开关运行prelink以交换虚拟内存? 如果你将/ lib中的所有内容列入黑名单,那么我相信你不能预先链接链接到/ lib库的任何库或二进制文件,类似的如果你将/lib/libc-2.12.2.so列入黑名单那么你就不能预先链接到任何链接到它的东西,因为预链接的文件也需要预先链接它的库。

对于可能的修复,没有更多信息,很难说,但它可能与传递给prelink或在预链接缓存或配置文件中的同一目录中混合32位或64位库的错误开关有关。

有关链接和预链接的更多信息是可用的